├── .github ├── FUNDING.yml ├── dependabot.yml └── workflows │ └── ci.yml ├── .gitignore ├── .gitmodules ├── .pre-commit-config.yaml ├── Algorithms ├── .clang-format ├── BLAKE3 │ ├── CMakeLists.txt │ └── blake3_dispatch.c ├── CMakeLists.txt ├── DllMain.c ├── Hasher2.cpp ├── Hasher2.h ├── QuickXorHash │ └── CMakeLists.txt ├── XKCP │ ├── CMakeLists.txt │ └── config.h ├── blake2sp │ ├── CMakeLists.txt │ ├── blake2sp.c │ └── blake2sp.h ├── crc32 │ └── CMakeLists.txt ├── crc64 │ ├── CMakeLists.txt │ ├── crc64.cpp │ └── crc64.h ├── mbedtls │ ├── CMakeLists.txt │ └── mbedtls_config.h ├── streebog │ ├── CMakeLists.txt │ └── gost3411-2012-config.h └── xxHash │ ├── CMakeLists.txt │ └── xxhash.c ├── AlgorithmsDlls ├── .gitignore └── CMakeLists.txt ├── Benchmark ├── .clang-format ├── Benchmark.cpp └── CMakeLists.txt ├── CMakeLists.txt ├── COPYING ├── LegacyAlgorithms ├── .clang-format ├── CMakeLists.txt ├── Hasher.h └── LegacyHasher.cpp ├── Localization ├── .clang-format ├── CMakeLists.txt ├── ar.json ├── bg.json ├── cs-CZ.json ├── da-DK.json ├── de-DE.json ├── en-US.json ├── es-ES.json ├── et-EE.json ├── fi-FI.json ├── fr-FR.json ├── gl-ES.json ├── hr-HR.json ├── hu-HU.json ├── id.json ├── isl │ ├── ChineseSimplified.isl │ └── ChineseTraditional.isl ├── it-IT.json ├── ja-JP.json ├── ko-KR.json ├── lt-LT.json ├── nb-NO.json ├── nl-NL.json ├── pl-PL.json ├── pt-BR.json ├── pt-PT.json ├── ro-RO.json ├── ru-RU.json ├── sk-SK.json ├── sl-SI.json ├── sv-SE.json ├── ta-LK.json ├── th-TH.json ├── tr-TR.json ├── uk-UA.json ├── zh-CN.json └── zh-TW.json ├── OpenHashTab ├── .clang-format ├── CMakeLists.txt ├── Coordinator.cpp ├── Coordinator.h ├── Exporter.cpp ├── Exporter.h ├── FileHashTask.cpp ├── FileHashTask.h ├── MainDialog.cpp ├── MainDialog.h ├── OpenHashTab.cpp ├── OpenHashTab.rc ├── Queues.cpp ├── Queues.h ├── Settings.cpp ├── Settings.h ├── SettingsDialog.cpp ├── SettingsDialog.h ├── Standalone.cpp ├── SumFileParser.cpp ├── SumFileParser.h ├── additional.manifest ├── base64.cpp ├── base64.h ├── cog.ico ├── hash_colors.h ├── https.cpp ├── https.h ├── icon.ico ├── icon.png ├── icon.svg ├── json.h ├── path.cpp ├── path.h ├── resource.h ├── stdafx.h ├── sum.ico ├── updatecheck.cpp ├── utl.cpp ├── utl.h ├── virustotal.cpp ├── virustotal.h ├── virustotal_api.h ├── vt.ico └── wnd.h ├── README.md ├── StandaloneStub ├── .clang-format ├── CMakeLists.txt ├── StandaloneStub.cpp └── StandaloneStub.rc ├── build_algorithms.ps1 ├── build_openhashtab.ps1 ├── installer.iss └── license.installer.txt /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: https://www.buymeacoffee.com/namazso 2 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: "daily" 7 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: release 2 | 3 | on: 4 | push: 5 | tags: 6 | - "v*" 7 | branches: 8 | - "*" 9 | 10 | jobs: 11 | build: 12 | name: build-windows 13 | runs-on: windows-latest 14 | 15 | steps: 16 | - name: Checkout 17 | uses: actions/checkout@v4 18 | with: 19 | submodules: recursive 20 | fetch-depth: 0 21 | 22 | - name: Figure out if we're running for a tag 23 | id: checktag 24 | run: | 25 | cd ${{ github.workspace }} 26 | If($Env:GITHUB_REF -match "(?<=v)([0-9]*)\.([0-9]*)\.([0-9]*)") { 27 | $IsRelease = "yes"; 28 | $Version = $Matches[0]; 29 | $VersionMajor = $Matches[1]; 30 | $VersionMinor = $Matches[2]; 31 | $VersionPatch = $Matches[3]; 32 | } Else { 33 | $IsRelease = "no"; 34 | $Version = (git describe --dirty --broken --always) -replace '^v', ''; 35 | If($Version -match "([0-9]*)\.([0-9]*)\.([0-9]*)-.*") { 36 | $VersionMajor = $Matches[1]; 37 | $VersionMinor = $Matches[2]; 38 | $VersionPatch = $Matches[3]; 39 | } Else { 40 | $VersionMajor = 0; 41 | $VersionMinor = 0; 42 | $VersionPatch = 0; 43 | } 44 | } 45 | Echo ("is_release=" + $IsRelease) >> $Env:GITHUB_OUTPUT; 46 | Echo ("version=" + $Version) >> $Env:GITHUB_OUTPUT; 47 | Echo ("version_major=" + $VersionMajor) >> $Env:GITHUB_OUTPUT; 48 | Echo ("version_minor=" + $VersionMinor) >> $Env:GITHUB_OUTPUT; 49 | Echo ("version_patch=" + $VersionPatch) >> $Env:GITHUB_OUTPUT; 50 | 51 | - name: Build Algorithms 52 | run: | 53 | cd ${{ github.workspace }} 54 | .\build_algorithms.ps1 55 | 56 | - name: Build OpenHashTab 57 | run: | 58 | cd ${{ github.workspace }} 59 | $Env:CI_VERSION = "${{ steps.checktag.outputs.version }}"; 60 | $Env:CI_VERSION_MAJOR = "${{ steps.checktag.outputs.version_major }}"; 61 | $Env:CI_VERSION_MINOR = "${{ steps.checktag.outputs.version_minor }}"; 62 | $Env:CI_VERSION_PATCH = "${{ steps.checktag.outputs.version_patch }}"; 63 | .\build_openhashtab.ps1 64 | 65 | - name: Build Installer 66 | run: | 67 | iscc .\installer.iss -DCI_VERSION="${{ steps.checktag.outputs.version }}" -DCI_VERSION_NUMERIC="${{ steps.checktag.outputs.version_major }}.${{ steps.checktag.outputs.version_minor }}.${{ steps.checktag.outputs.version_patch }}" 68 | 69 | - name: Upload Installer 70 | uses: actions/upload-artifact@v4 71 | with: 72 | name: setup 73 | path: | 74 | .\OpenHashTab_setup.exe 75 | 76 | - name: Upload Unpacked 77 | uses: actions/upload-artifact@v4 78 | with: 79 | name: unpacked 80 | path: | 81 | .\AlgorithmsDlls\*.dll 82 | .\AlgorithmsDlls\*.pdb 83 | .\cmake-openhashtab-x64\OpenHashTab.dll 84 | .\cmake-openhashtab-x64\*.exe 85 | .\cmake-openhashtab-x64\*.pdb 86 | .\cmake-openhashtab-ARM64\OpenHashTab.dll 87 | .\cmake-openhashtab-ARM64\*.exe 88 | .\cmake-openhashtab-ARM64\*.pdb 89 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | cmake-* 3 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "concurrentqueue"] 2 | path = concurrentqueue 3 | url = https://github.com/cameron314/concurrentqueue.git 4 | [submodule "Algorithms/mbedtls/mbedtls"] 5 | path = Algorithms/mbedtls/mbedtls 6 | url = https://github.com/ARMmbed/mbedtls.git 7 | [submodule "tiny-json"] 8 | path = tiny-json 9 | url = https://github.com/rafagafe/tiny-json.git 10 | [submodule "Algorithms/xxHash/xxHash"] 11 | path = Algorithms/xxHash/xxHash 12 | url = https://github.com/Cyan4973/xxHash.git 13 | [submodule "Algorithms/BLAKE3/BLAKE3"] 14 | path = Algorithms/BLAKE3/BLAKE3 15 | url = https://github.com/BLAKE3-team/BLAKE3.git 16 | [submodule "Algorithms/XKCP/XKCP"] 17 | path = Algorithms/XKCP/XKCP 18 | url = https://github.com/XKCP/XKCP.git 19 | [submodule "Algorithms/streebog/streebog"] 20 | path = Algorithms/streebog/streebog 21 | url = https://github.com/adegtyarev/streebog.git 22 | [submodule "Algorithms/crc32/crc32"] 23 | path = Algorithms/crc32/crc32 24 | url = https://github.com/stbrumme/crc32.git 25 | [submodule "Algorithms/QuickXorHash/QuickXorHash"] 26 | path = Algorithms/QuickXorHash/QuickXorHash 27 | url = https://github.com/namazso/QuickXorHash.git 28 | [submodule "compile-time-regular-expressions"] 29 | path = compile-time-regular-expressions 30 | url = https://github.com/hanickadot/compile-time-regular-expressions.git 31 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/pre-commit/pre-commit-hooks 3 | rev: v4.4.0 4 | hooks: 5 | - id: check-merge-conflict 6 | - id: check-yaml 7 | - id: end-of-file-fixer 8 | - id: pretty-format-json 9 | args: 10 | - --autofix 11 | - --indent=4 12 | - --no-ensure-ascii 13 | - --no-sort-keys 14 | - id: trailing-whitespace 15 | - id: mixed-line-ending 16 | args: 17 | - --fix=auto 18 | - repo: https://github.com/pre-commit/mirrors-clang-format 19 | rev: v16.0.6 20 | hooks: 21 | - id: clang-format 22 | -------------------------------------------------------------------------------- /Algorithms/.clang-format: -------------------------------------------------------------------------------- 1 | DisableFormat: true 2 | -------------------------------------------------------------------------------- /Algorithms/BLAKE3/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.14) 2 | 3 | project(BLAKE3 C ASM) 4 | 5 | set(CMAKE_C_STANDARD 11) 6 | 7 | set(COMMON_FILES 8 | blake3_dispatch.c 9 | BLAKE3/c/blake3.c 10 | BLAKE3/c/blake3_portable.c 11 | ) 12 | set(ARM64_FILES BLAKE3/c/blake3_neon.c) 13 | set(SSE2_FILES BLAKE3/c/blake3_sse2_x86-64_windows_gnu.S) 14 | set(AVX_FILES BLAKE3/c/blake3_sse41_x86-64_windows_gnu.S) 15 | set(AVX2_FILES BLAKE3/c/blake3_avx2_x86-64_windows_gnu.S BLAKE3/c/blake3_sse41_x86-64_windows_gnu.S) 16 | set(AVX512_FILES BLAKE3/c/blake3_avx512_x86-64_windows_gnu.S) 17 | 18 | if ("${OHT_FLAVOR}" STREQUAL "ARM64") 19 | set(FILES ${COMMON_FILES} ${ARM64_FILES}) 20 | elseif ("${OHT_FLAVOR}" STREQUAL "SSE2") 21 | set(FILES ${COMMON_FILES} ${SSE2_FILES}) 22 | elseif ("${OHT_FLAVOR}" STREQUAL "AVX") 23 | set(FILES ${COMMON_FILES} ${AVX_FILES}) 24 | elseif ("${OHT_FLAVOR}" STREQUAL "AVX2") 25 | set(FILES ${COMMON_FILES} ${AVX2_FILES}) 26 | elseif ("${OHT_FLAVOR}" STREQUAL "AVX512") 27 | set(FILES ${COMMON_FILES} ${AVX512_FILES}) 28 | else () 29 | message(FATAL_ERROR "OHT_FLAVOR not set.") 30 | endif () 31 | 32 | add_library(${PROJECT_NAME} STATIC ${FILES}) 33 | 34 | target_include_directories(${PROJECT_NAME} PUBLIC BLAKE3/c) 35 | 36 | target_compile_definitions(${PROJECT_NAME} PUBLIC BLAKE3_USE_NEON) 37 | -------------------------------------------------------------------------------- /Algorithms/BLAKE3/blake3_dispatch.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #include "BLAKE3/c/blake3_impl.h" 6 | 7 | #if defined(_M_IX86) || defined(_M_X64) 8 | #include 9 | #endif 10 | 11 | void blake3_compress_in_place(uint32_t cv[8], 12 | const uint8_t block[BLAKE3_BLOCK_LEN], 13 | uint8_t block_len, uint64_t counter, 14 | uint8_t flags) { 15 | 16 | #if defined(__AVX512VL__) && defined(__AVX512F__) 17 | blake3_compress_in_place_avx512(cv, block, block_len, counter, flags); 18 | #elif defined(__SSE4_1__) 19 | blake3_compress_in_place_sse41(cv, block, block_len, counter, flags); 20 | #elif defined(__SSE2__) 21 | blake3_compress_in_place_sse2(cv, block, block_len, counter, flags); 22 | #else 23 | blake3_compress_in_place_portable(cv, block, block_len, counter, flags); 24 | #endif 25 | } 26 | 27 | void blake3_compress_xof(const uint32_t cv[8], 28 | const uint8_t block[BLAKE3_BLOCK_LEN], 29 | uint8_t block_len, uint64_t counter, uint8_t flags, 30 | uint8_t out[64]) { 31 | 32 | #if defined(__AVX512VL__) && defined(__AVX512F__) 33 | blake3_compress_xof_avx512(cv, block, block_len, counter, flags, out); 34 | #elif defined(__SSE4_1__) 35 | blake3_compress_xof_sse41(cv, block, block_len, counter, flags, out); 36 | #elif defined(__SSE2__) 37 | blake3_compress_xof_sse2(cv, block, block_len, counter, flags, out); 38 | #else 39 | blake3_compress_xof_portable(cv, block, block_len, counter, flags, out); 40 | #endif 41 | } 42 | 43 | void blake3_hash_many(const uint8_t *const *inputs, size_t num_inputs, 44 | size_t blocks, const uint32_t key[8], uint64_t counter, 45 | bool increment_counter, uint8_t flags, 46 | uint8_t flags_start, uint8_t flags_end, uint8_t *out) { 47 | 48 | #if defined(__AVX512VL__) && defined(__AVX512F__) 49 | blake3_hash_many_avx512(inputs, num_inputs, blocks, key, counter, 50 | increment_counter, flags, flags_start, flags_end, 51 | out); 52 | #elif defined(__AVX2__) 53 | blake3_hash_many_avx2(inputs, num_inputs, blocks, key, counter, 54 | increment_counter, flags, flags_start, flags_end, 55 | out); 56 | #elif defined(__SSE4_1__) 57 | blake3_hash_many_sse41(inputs, num_inputs, blocks, key, counter, 58 | increment_counter, flags, flags_start, flags_end, 59 | out); 60 | #elif defined(__SSE2__) 61 | blake3_hash_many_sse2(inputs, num_inputs, blocks, key, counter, 62 | increment_counter, flags, flags_start, flags_end, 63 | out); 64 | #elif defined(__ARM_NEON) 65 | blake3_hash_many_neon(inputs, num_inputs, blocks, key, counter, 66 | increment_counter, flags, flags_start, flags_end, 67 | out); 68 | #else 69 | blake3_hash_many_portable(inputs, num_inputs, blocks, key, counter, 70 | increment_counter, flags, flags_start, flags_end, 71 | out); 72 | #endif 73 | } 74 | 75 | // The dynamically detected SIMD degree of the current platform. 76 | size_t blake3_simd_degree(void) { 77 | 78 | #if defined(__AVX512VL__) && defined(__AVX512F__) 79 | return 16; 80 | #elif defined(__AVX2__) 81 | return 8; 82 | #elif defined(__SSE4_1__) 83 | return 4; 84 | #elif defined(__SSE2__) 85 | return 4; 86 | #elif defined(__ARM_NEON) 87 | return 4; 88 | #else 89 | return 1; 90 | #endif 91 | } 92 | -------------------------------------------------------------------------------- /Algorithms/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2019-2025 namazso 2 | # This file is part of OpenHashTab. 3 | # 4 | # OpenHashTab is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # OpenHashTab is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with OpenHashTab. If not, see . 16 | 17 | cmake_minimum_required(VERSION 3.15) 18 | 19 | project(AlgorithmsDll) 20 | 21 | set(CMAKE_CXX_STANDARD 20) 22 | 23 | set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") 24 | 25 | string(REGEX REPLACE "/Ob1" "/Ob2" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") 26 | string(REGEX REPLACE "/Ob1" "/Ob2" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") 27 | 28 | add_compile_options(-flto /GR- /GS- /guard:cf,nochecks) 29 | 30 | if ("${OHT_FLAVOR}" STREQUAL "ARM64") 31 | elseif ("${OHT_FLAVOR}" STREQUAL "SSE2") 32 | elseif ("${OHT_FLAVOR}" STREQUAL "AVX") 33 | add_compile_options(/arch:AVX) 34 | elseif ("${OHT_FLAVOR}" STREQUAL "AVX2") 35 | add_compile_options(/arch:AVX2) 36 | elseif ("${OHT_FLAVOR}" STREQUAL "AVX512") 37 | add_compile_options(/arch:AVX512) 38 | else () 39 | message(FATAL_ERROR "OHT_FLAVOR not set.") 40 | endif () 41 | 42 | add_subdirectory(XKCP) 43 | add_subdirectory(QuickXorHash) 44 | add_subdirectory(streebog) 45 | add_subdirectory(xxHash) 46 | add_subdirectory(crc32) 47 | add_subdirectory(crc64) 48 | add_subdirectory(mbedtls) 49 | add_subdirectory(blake2sp) 50 | add_subdirectory(BLAKE3) 51 | 52 | add_library(${PROJECT_NAME} SHARED Hasher2.cpp DllMain.c) 53 | 54 | set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "${PROJECT_NAME}_${OHT_FLAVOR}") 55 | 56 | target_link_libraries(${PROJECT_NAME} 57 | XKCP 58 | QuickXorHash 59 | streebog 60 | xxHash 61 | crc32 62 | crc64 63 | mbedtls 64 | blake2sp 65 | BLAKE3 66 | ) 67 | 68 | target_link_options(${PROJECT_NAME} PRIVATE 69 | /BREPRO 70 | /PDBALTPATH:%_PDB% 71 | /FILEALIGN:0x1000 72 | /cetcompat 73 | /guard:cf 74 | "/EXPORT:get_algorithms_begin_${OHT_FLAVOR}=get_algorithms_begin" 75 | "/EXPORT:get_algorithms_end_${OHT_FLAVOR}=get_algorithms_end" 76 | /OPT:REF 77 | /OPT:ICF=10 78 | ) 79 | 80 | install(TARGETS ${PROJECT_NAME} DESTINATION .) 81 | install(FILES $ DESTINATION .) 82 | -------------------------------------------------------------------------------- /Algorithms/DllMain.c: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #include 17 | 18 | BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { 19 | UNREFERENCED_PARAMETER(hinstDLL); 20 | UNREFERENCED_PARAMETER(fdwReason); 21 | UNREFERENCED_PARAMETER(lpvReserved); 22 | return TRUE; 23 | } 24 | -------------------------------------------------------------------------------- /Algorithms/QuickXorHash/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.14) 2 | 3 | project(QuickXorHash) 4 | 5 | add_library(${PROJECT_NAME} STATIC QuickXorHash/quickxorhash.c) 6 | 7 | target_include_directories(${PROJECT_NAME} PUBLIC QuickXorHash) 8 | -------------------------------------------------------------------------------- /Algorithms/XKCP/config.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/namazso/OpenHashTab/e02c94ad0dc6943d4d997a972d7cf91ab055213a/Algorithms/XKCP/config.h -------------------------------------------------------------------------------- /Algorithms/blake2sp/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.14) 2 | 3 | project(blake2sp) 4 | 5 | add_library(${PROJECT_NAME} STATIC blake2sp.c) 6 | 7 | target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) 8 | -------------------------------------------------------------------------------- /Algorithms/blake2sp/blake2sp.h: -------------------------------------------------------------------------------- 1 | // Public domain 2 | // Based on public domain 7zip implementation by Igor Pavlov and Samuel Neves 3 | #pragma once 4 | 5 | #ifndef EXTERN_C_START 6 | #ifdef __cplusplus 7 | #define EXTERN_C_START extern "C" { 8 | #define EXTERN_C_END } 9 | #else 10 | #define EXTERN_C_START 11 | #define EXTERN_C_END 12 | #endif 13 | #endif 14 | 15 | EXTERN_C_START 16 | 17 | #include 18 | #include 19 | #include 20 | 21 | // Set this if your processor is unaligned little endian 22 | #define LITTLE_ENDIAN_UNALIGNED 23 | 24 | #define BLAKE2S_BLOCK_SIZE 64 25 | #define BLAKE2S_DIGEST_SIZE 32 26 | #define BLAKE2SP_PARALLEL_DEGREE 8 27 | 28 | typedef struct 29 | { 30 | uint32_t h[8]; 31 | uint32_t t[2]; 32 | uint32_t f[2]; 33 | uint8_t buf[BLAKE2S_BLOCK_SIZE]; 34 | uint32_t bufPos; 35 | uint32_t lastNode_f1; 36 | uint32_t dummy[2]; /* for sizeof(CBlake2s) alignment */ 37 | } CBlake2s; 38 | 39 | typedef struct 40 | { 41 | CBlake2s S[BLAKE2SP_PARALLEL_DEGREE]; 42 | unsigned bufPos; 43 | } CBlake2sp; 44 | 45 | void Blake2sp_Init(CBlake2sp *p); 46 | void Blake2sp_Update(CBlake2sp *p, const uint8_t *data, size_t size); 47 | void Blake2sp_Final(CBlake2sp *p, uint8_t *digest); 48 | 49 | EXTERN_C_END 50 | -------------------------------------------------------------------------------- /Algorithms/crc32/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.14) 2 | 3 | project(crc32) 4 | 5 | add_library(${PROJECT_NAME} STATIC crc32/Crc32.cpp) 6 | 7 | target_include_directories(${PROJECT_NAME} PUBLIC crc32) 8 | -------------------------------------------------------------------------------- /Algorithms/crc64/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.14) 2 | 3 | project(crc64) 4 | 5 | add_library(${PROJECT_NAME} STATIC crc64.cpp) 6 | 7 | target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) 8 | -------------------------------------------------------------------------------- /Algorithms/crc64/crc64.cpp: -------------------------------------------------------------------------------- 1 | // public domain, by duk 2 | #include "crc64.h" 3 | #include 4 | #include 5 | 6 | constexpr uint64_t poly = 0xC96C5795D7870F42ULL; 7 | constexpr uint32_t max_slice = 16; 8 | 9 | static constexpr std::array, max_slice> crc_table = []() { 10 | std::array, max_slice> out{}; 11 | for (uint32_t i = 0; i <= 0xFF; ++i) { 12 | uint64_t crc = i; 13 | for (uint32_t i = 0; i < 8; ++i) { 14 | crc = (crc >> 1) ^ ((crc & 1) * poly); 15 | } 16 | out[0][i] = crc; 17 | } 18 | 19 | for (uint32_t slice = 1; slice < max_slice; slice++) { 20 | for (uint32_t i = 0; i <= 0xFF; ++i) { 21 | out[slice][i] = (out[slice - 1][i] >> 8) ^ out[0][out[slice - 1][i] & 0xFF]; 22 | } 23 | } 24 | 25 | return out; 26 | }(); 27 | 28 | uint64_t crc64(uint64_t crc, const void* buf_, size_t len) 29 | { 30 | auto buf = (const uint8_t*)buf_; 31 | 32 | crc = ~crc; 33 | 34 | const auto to_align = std::min(((uintptr_t)buf) & 7, len); 35 | for (size_t i = 0; i < to_align; ++i) 36 | { 37 | crc = crc_table[0][(buf[i] ^ crc) & 0xFF] ^ (crc >> 8); 38 | } 39 | buf += to_align; 40 | len -= to_align; 41 | 42 | uint32_t off = 0; 43 | 44 | for (; off < len - (len % 8); off += 8) 45 | { 46 | uint64_t value = *(uint64_t*)&buf[off] ^ crc; 47 | crc = crc_table[0][(value >> 56) & 0xFF]; 48 | 49 | #pragma unroll 50 | for (uint32_t i = 1; i < 8; ++i) 51 | { 52 | crc ^= crc_table[i][(value >> (64 - ((i + 1) * 8))) & 0xFF]; 53 | } 54 | } 55 | 56 | for (; off < len; ++off) 57 | { 58 | crc = crc_table[0][(buf[off] ^ crc) & 0xFF] ^ (crc >> 8); 59 | } 60 | 61 | return ~crc; 62 | } 63 | -------------------------------------------------------------------------------- /Algorithms/crc64/crc64.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | uint64_t crc64(uint64_t crc, const void* buf, size_t len); 5 | -------------------------------------------------------------------------------- /Algorithms/mbedtls/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.14) 2 | 3 | project(mbedtls) 4 | 5 | add_library(${PROJECT_NAME} STATIC 6 | mbedtls/library/md2.c 7 | mbedtls/library/md4.c 8 | mbedtls/library/md5.c 9 | mbedtls/library/platform_util.c 10 | mbedtls/library/ripemd160.c 11 | mbedtls/library/sha1.c 12 | mbedtls/library/sha256.c 13 | mbedtls/library/sha512.c 14 | ) 15 | 16 | target_include_directories(${PROJECT_NAME} PUBLIC mbedtls/include ${CMAKE_CURRENT_SOURCE_DIR}) 17 | 18 | target_compile_definitions(${PROJECT_NAME} PUBLIC MBEDTLS_CONFIG_FILE="mbedtls_config.h") 19 | -------------------------------------------------------------------------------- /Algorithms/streebog/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.14) 2 | 3 | project(streebog) 4 | 5 | add_library(${PROJECT_NAME} STATIC streebog/gost3411-2012-core.c) 6 | 7 | target_include_directories(${PROJECT_NAME} PUBLIC streebog ${CMAKE_CURRENT_SOURCE_DIR}) 8 | -------------------------------------------------------------------------------- /Algorithms/streebog/gost3411-2012-config.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #if defined(__SSE4_1__) 3 | #define __GOST3411_HAS_SSE41__ 4 | #endif 5 | #if defined(__SSE2__) 6 | #define __GOST3411_HAS_SSE2__ 7 | #endif 8 | -------------------------------------------------------------------------------- /Algorithms/xxHash/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.14) 2 | 3 | project(xxHash) 4 | 5 | add_library(${PROJECT_NAME} STATIC xxhash.c) 6 | 7 | target_include_directories(${PROJECT_NAME} PUBLIC xxHash) 8 | -------------------------------------------------------------------------------- /Algorithms/xxHash/xxhash.c: -------------------------------------------------------------------------------- 1 | #define XXH_STATIC_LINKING_ONLY 2 | #define XXH_IMPLEMENTATION 3 | 4 | #if defined(__AVX512F__) 5 | # define XXH_VECTOR XXH_AVX512 6 | #elif defined(__AVX2__) 7 | # define XXH_VECTOR XXH_AVX2 8 | #elif defined(__SSE2__) || defined(_M_AMD64) || defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP == 2)) 9 | # define XXH_VECTOR XXH_SSE2 10 | #elif defined(_M_ARM64) 11 | # define XXH_VECTOR XXH_NEON 12 | # include 13 | #endif 14 | 15 | #include 16 | -------------------------------------------------------------------------------- /AlgorithmsDlls/.gitignore: -------------------------------------------------------------------------------- 1 | *.dll 2 | *.pdb 3 | *.lib 4 | -------------------------------------------------------------------------------- /AlgorithmsDlls/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2019-2025 namazso 2 | # This file is part of OpenHashTab. 3 | # 4 | # OpenHashTab is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # OpenHashTab is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with OpenHashTab. If not, see . 16 | 17 | cmake_minimum_required(VERSION 3.14) 18 | 19 | project(AlgorithmsDlls) 20 | 21 | if (MSVC_C_ARCHITECTURE_ID STREQUAL "x64") 22 | set(FLAVORS "SSE2" "AVX" "AVX2" "AVX512") 23 | elseif (MSVC_C_ARCHITECTURE_ID STREQUAL "ARM64") 24 | set(FLAVORS "ARM64") 25 | else () 26 | message(FATAL_ERROR "Unsupported architecture") 27 | endif () 28 | 29 | add_library(AlgorithmsDlls INTERFACE) 30 | target_include_directories(AlgorithmsDlls INTERFACE ../Algorithms) 31 | target_link_libraries(AlgorithmsDlls INTERFACE delayimp) 32 | 33 | foreach (FLAVOR ${FLAVORS}) 34 | add_library("AlgorithmsDll_${FLAVOR}" SHARED IMPORTED) 35 | set_property(TARGET "AlgorithmsDll_${FLAVOR}" 36 | PROPERTY IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/AlgorithmsDll_${FLAVOR}.lib") 37 | set_property(TARGET "AlgorithmsDll_${FLAVOR}" 38 | PROPERTY IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/AlgorithmsDll_${FLAVOR}.dll") 39 | set_property(TARGET "AlgorithmsDll_${FLAVOR}" 40 | PROPERTY PDB_NAME "${CMAKE_CURRENT_SOURCE_DIR}/AlgorithmsDll_${FLAVOR}.pdb") 41 | target_link_options("AlgorithmsDll_${FLAVOR}" INTERFACE "/DELAYLOAD:AlgorithmsDll_${FLAVOR}.dll") 42 | 43 | target_link_libraries(AlgorithmsDlls INTERFACE "AlgorithmsDll_${FLAVOR}") 44 | endforeach () 45 | -------------------------------------------------------------------------------- /Benchmark/.clang-format: -------------------------------------------------------------------------------- 1 | BasedOnStyle: LLVM 2 | AccessModifierOffset: -2 3 | AlignAfterOpenBracket: BlockIndent 4 | AlignArrayOfStructures: Right 5 | AlignConsecutiveAssignments: None 6 | AlignConsecutiveBitFields: AcrossEmptyLinesAndComments 7 | AlignConsecutiveMacros: Consecutive 8 | AlignEscapedNewlines: Left 9 | AlignOperands: Align 10 | AlignTrailingComments: true 11 | AllowAllArgumentsOnNextLine: false 12 | AllowAllConstructorInitializersOnNextLine: false 13 | AllowAllParametersOfDeclarationOnNextLine: false 14 | AllowShortBlocksOnASingleLine: Always 15 | AllowShortCaseLabelsOnASingleLine: false 16 | AllowShortFunctionsOnASingleLine: Inline 17 | AllowShortIfStatementsOnASingleLine: Never 18 | AllowShortLambdasOnASingleLine: All 19 | AllowShortLoopsOnASingleLine: false 20 | AlwaysBreakAfterReturnType: None 21 | AlwaysBreakBeforeMultilineStrings: true 22 | AlwaysBreakTemplateDeclarations: MultiLine 23 | BinPackArguments: false 24 | BinPackParameters: false 25 | BitFieldColonSpacing: Before 26 | BreakBeforeBraces: Custom 27 | BraceWrapping: 28 | AfterCaseLabel: false 29 | AfterClass: false 30 | AfterControlStatement: Never 31 | AfterEnum: false 32 | AfterFunction: false 33 | AfterNamespace: false 34 | AfterStruct: false 35 | AfterUnion: false 36 | AfterExternBlock: false 37 | BeforeCatch: false 38 | BeforeElse: false 39 | BeforeLambdaBody: false 40 | BeforeWhile: false 41 | IndentBraces: false 42 | SplitEmptyFunction: false 43 | SplitEmptyRecord: false 44 | SplitEmptyNamespace: false 45 | BreakBeforeBinaryOperators: NonAssignment 46 | BreakBeforeConceptDeclarations: Allowed 47 | BreakBeforeTernaryOperators: true 48 | BreakConstructorInitializers: BeforeComma 49 | BreakInheritanceList: BeforeComma 50 | BreakStringLiterals: false 51 | ColumnLimit: 0 52 | CompactNamespaces: false 53 | ContinuationIndentWidth: 2 54 | EmptyLineAfterAccessModifier: Never 55 | EmptyLineBeforeAccessModifier: Always 56 | FixNamespaceComments: true 57 | IncludeBlocks: Preserve 58 | IndentAccessModifiers: false 59 | IndentCaseLabels: false 60 | IndentExternBlock: NoIndent 61 | IndentGotoLabels: false 62 | IndentPPDirectives: None 63 | IndentWidth: 2 64 | IndentWrappedFunctionNames: false 65 | InsertTrailingCommas: Wrapped 66 | KeepEmptyLinesAtTheStartOfBlocks: false 67 | LambdaBodyIndentation: Signature 68 | MaxEmptyLinesToKeep: 2 69 | NamespaceIndentation: All 70 | PackConstructorInitializers: CurrentLine 71 | PointerAlignment: Left 72 | QualifierAlignment: Custom 73 | QualifierOrder: [ 'inline', 'static', 'constexpr', 'const', 'volatile', 'type', 'restrict' ] 74 | ReferenceAlignment: Left 75 | ReflowComments: false 76 | RequiresClausePosition: OwnLine 77 | SeparateDefinitionBlocks: Always 78 | ShortNamespaceLines: 10 79 | SortIncludes: CaseInsensitive 80 | SortUsingDeclarations: true 81 | SpaceAfterCStyleCast: false 82 | SpaceAfterLogicalNot: false 83 | SpaceAfterTemplateKeyword: true 84 | SpaceBeforeAssignmentOperators: true 85 | SpaceBeforeCpp11BracedList: false 86 | SpaceBeforeCtorInitializerColon: true 87 | SpaceBeforeInheritanceColon: true 88 | SpaceBeforeParens: ControlStatements 89 | SpaceBeforeRangeBasedForLoopColon: true 90 | SpaceBeforeSquareBrackets: false 91 | SpaceInEmptyBlock: false 92 | SpaceInEmptyParentheses: false 93 | SpacesBeforeTrailingComments: 1 94 | SpacesInAngles: false 95 | SpacesInCStyleCastParentheses: false 96 | SpacesInConditionalStatement: false 97 | SpacesInContainerLiterals: false 98 | SpacesInLineCommentPrefix: 99 | Minimum: 1 100 | Maximum: -1 101 | SpacesInParentheses: false 102 | SpacesInSquareBrackets: false 103 | Standard: c++20 104 | TabWidth: 2 105 | UseTab: Never 106 | -------------------------------------------------------------------------------- /Benchmark/Benchmark.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #define WIN32_LEAN_AND_MEAN 17 | 18 | #include 19 | 20 | #include 21 | #include 22 | 23 | #include 24 | 25 | int main() { 26 | static constexpr auto k_passes = 20u; 27 | // 4 MB so that it fits in (my) L2 cache 28 | static constexpr auto k_size = 4ull << 20; 29 | 30 | const auto p = (uint64_t*)VirtualAlloc( 31 | nullptr, 32 | k_size, 33 | MEM_RESERVE | MEM_COMMIT, 34 | PAGE_READWRITE 35 | ); 36 | 37 | if (!p) { 38 | printf("VirtualAlloc failed."); 39 | return 1; 40 | } 41 | 42 | std::mt19937_64 engine{0}; // NOLINT(cert-msc51-cpp) 43 | std::generate_n(p, k_size / sizeof(*p), [&engine] { return engine(); }); 44 | 45 | LARGE_INTEGER frequency{}; 46 | QueryPerformanceFrequency(&frequency); 47 | 48 | int64_t measurements[LegacyHashAlgorithm::k_count][k_passes]{}; 49 | 50 | for (auto i = 0u; i < k_passes; ++i) { 51 | for (auto j = 0u; j < LegacyHashAlgorithm::k_count; ++j) { 52 | auto& h = LegacyHashAlgorithm::Algorithms()[j]; 53 | auto ctx = h.MakeContext(); 54 | 55 | LARGE_INTEGER begin{}, end{}; 56 | 57 | QueryPerformanceCounter(&begin); 58 | 59 | ctx.Update(p, k_size); 60 | uint8_t hash[LegacyHashAlgorithm::k_max_size + 4]; 61 | #ifndef NDEBUG 62 | const auto size = h.GetSize(); 63 | hash[size - 4] = 0xFF; 64 | hash[size - 3] = 0xFF; 65 | hash[size - 2] = 0xFF; 66 | hash[size - 1] = 0xFF; 67 | hash[size] = 0xFF; 68 | hash[size + 1] = 0xFF; 69 | hash[size + 2] = 0xFF; 70 | hash[size + 3] = 0xFF; 71 | #endif 72 | ctx.Finish(hash); 73 | #ifndef NDEBUG 74 | const auto size_according_to_ctx = ctx.GetOutputSize(); 75 | assert(size == size_according_to_ctx); 76 | const auto doesnt_overflow = std::all_of( 77 | &hash[size], 78 | &hash[size + 4], 79 | [](uint8_t v) { return v == 0xFF; } 80 | ); 81 | assert(doesnt_overflow); 82 | const auto fills_space = !std::all_of( 83 | &hash[size - 4], 84 | &hash[size], 85 | [](uint8_t v) { return v == 0xFF; } 86 | ); 87 | assert(fills_space); 88 | #endif 89 | 90 | // copy into volatile to ensure Finish isn't optimized away 91 | volatile uint8_t hash_cpy[LegacyHashAlgorithm::k_max_size]; 92 | std::copy_n(std::begin(hash), std::size(hash_cpy), std::begin(hash_cpy)); 93 | 94 | QueryPerformanceCounter(&end); 95 | 96 | measurements[j][i] = end.QuadPart - begin.QuadPart; 97 | } 98 | } 99 | 100 | for (auto i = 0u; i < LegacyHashAlgorithm::k_count; ++i) { 101 | auto& h = LegacyHashAlgorithm::Algorithms()[i]; 102 | 103 | printf("%-16s\t", h.GetName()); 104 | 105 | int64_t sum = 0; 106 | 107 | auto& measurement = measurements[i]; 108 | std::sort(std::begin(measurement), std::end(measurement)); 109 | 110 | static constexpr auto skip = (unsigned)(0.2 * k_passes); 111 | for (auto j = skip; j < k_passes - skip; ++j) { 112 | const auto v = measurement[j]; 113 | sum += v; 114 | printf("%lld\t", v); 115 | } 116 | 117 | const auto avg = (double(sum) / (k_passes - 2 * skip)); 118 | 119 | const auto mbps = (double)(k_size * frequency.QuadPart) / avg / (1ll << 20); // MB/s 120 | 121 | printf("%.7lf MB/s\n", mbps); 122 | } 123 | 124 | return 0; 125 | } 126 | -------------------------------------------------------------------------------- /Benchmark/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2019-2025 namazso 2 | # This file is part of OpenHashTab. 3 | # 4 | # OpenHashTab is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # OpenHashTab is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with OpenHashTab. If not, see . 16 | 17 | cmake_minimum_required(VERSION 3.14) 18 | 19 | project(Benchmark) 20 | 21 | add_executable(${PROJECT_NAME} Benchmark.cpp) 22 | 23 | target_link_libraries(${PROJECT_NAME} PRIVATE LegacyAlgorithms) 24 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2019-2025 namazso 2 | # This file is part of OpenHashTab. 3 | # 4 | # OpenHashTab is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # OpenHashTab is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with OpenHashTab. If not, see . 16 | 17 | cmake_minimum_required(VERSION 3.15) 18 | 19 | project(OpenHashTab) 20 | 21 | set(CMAKE_CXX_STANDARD 20) 22 | 23 | set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") 24 | 25 | string(REGEX REPLACE "/Ob1" "/Ob2" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") 26 | string(REGEX REPLACE "/Ob1" "/Ob2" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") 27 | 28 | add_compile_options( 29 | -flto 30 | /guard:cf 31 | ) 32 | 33 | add_link_options( 34 | /BREPRO 35 | /PDBALTPATH:%_PDB% 36 | /FILEALIGN:0x1000 37 | /cetcompat 38 | /guard:cf 39 | /OPT:REF 40 | /OPT:ICF=10 41 | ) 42 | 43 | set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) 44 | set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) 45 | 46 | # https://gitlab.kitware.com/cmake/cmake/-/issues/25012 47 | # https://github.com/llvm/llvm-project/issues/63426 48 | set(CMAKE_RC_FLAGS "-C65001") 49 | 50 | set(CTRE_BUILD_TESTS OFF) 51 | set(CTRE_BUILD_PACKAGE OFF) 52 | add_subdirectory(compile-time-regular-expressions) 53 | 54 | add_subdirectory(concurrentqueue) 55 | 56 | add_library(tiny-json STATIC tiny-json/tiny-json.c) 57 | target_include_directories(tiny-json PUBLIC tiny-json) 58 | 59 | add_compile_options( 60 | -Wall 61 | -Wpedantic 62 | -Wno-c++98-compat 63 | -Wno-c++98-compat-pedantic 64 | -Wno-pre-c++17-compat 65 | -Wno-unsafe-buffer-usage 66 | -Wno-old-style-cast 67 | -Wno-shadow-field-in-constructor 68 | -Wno-language-extension-token 69 | -Wno-ctad-maybe-unsupported 70 | $<$:-fsanitize=undefined> 71 | $<$:-fsanitize-trap> 72 | ) 73 | 74 | add_subdirectory(AlgorithmsDlls) 75 | 76 | add_subdirectory(Localization) 77 | 78 | add_subdirectory(LegacyAlgorithms) 79 | 80 | add_subdirectory(Benchmark) 81 | 82 | add_subdirectory(OpenHashTab) 83 | 84 | add_subdirectory(StandaloneStub) 85 | -------------------------------------------------------------------------------- /LegacyAlgorithms/.clang-format: -------------------------------------------------------------------------------- 1 | BasedOnStyle: LLVM 2 | AccessModifierOffset: -2 3 | AlignAfterOpenBracket: BlockIndent 4 | AlignArrayOfStructures: Right 5 | AlignConsecutiveAssignments: None 6 | AlignConsecutiveBitFields: AcrossEmptyLinesAndComments 7 | AlignConsecutiveMacros: Consecutive 8 | AlignEscapedNewlines: Left 9 | AlignOperands: Align 10 | AlignTrailingComments: true 11 | AllowAllArgumentsOnNextLine: false 12 | AllowAllConstructorInitializersOnNextLine: false 13 | AllowAllParametersOfDeclarationOnNextLine: false 14 | AllowShortBlocksOnASingleLine: Always 15 | AllowShortCaseLabelsOnASingleLine: false 16 | AllowShortFunctionsOnASingleLine: Inline 17 | AllowShortIfStatementsOnASingleLine: Never 18 | AllowShortLambdasOnASingleLine: All 19 | AllowShortLoopsOnASingleLine: false 20 | AlwaysBreakAfterReturnType: None 21 | AlwaysBreakBeforeMultilineStrings: true 22 | AlwaysBreakTemplateDeclarations: MultiLine 23 | BinPackArguments: false 24 | BinPackParameters: false 25 | BitFieldColonSpacing: Before 26 | BreakBeforeBraces: Custom 27 | BraceWrapping: 28 | AfterCaseLabel: false 29 | AfterClass: false 30 | AfterControlStatement: Never 31 | AfterEnum: false 32 | AfterFunction: false 33 | AfterNamespace: false 34 | AfterStruct: false 35 | AfterUnion: false 36 | AfterExternBlock: false 37 | BeforeCatch: false 38 | BeforeElse: false 39 | BeforeLambdaBody: false 40 | BeforeWhile: false 41 | IndentBraces: false 42 | SplitEmptyFunction: false 43 | SplitEmptyRecord: false 44 | SplitEmptyNamespace: false 45 | BreakBeforeBinaryOperators: NonAssignment 46 | BreakBeforeConceptDeclarations: Allowed 47 | BreakBeforeTernaryOperators: true 48 | BreakConstructorInitializers: BeforeComma 49 | BreakInheritanceList: BeforeComma 50 | BreakStringLiterals: false 51 | ColumnLimit: 0 52 | CompactNamespaces: false 53 | ContinuationIndentWidth: 2 54 | EmptyLineAfterAccessModifier: Never 55 | EmptyLineBeforeAccessModifier: Always 56 | FixNamespaceComments: true 57 | IncludeBlocks: Preserve 58 | IndentAccessModifiers: false 59 | IndentCaseLabels: false 60 | IndentExternBlock: NoIndent 61 | IndentGotoLabels: false 62 | IndentPPDirectives: None 63 | IndentWidth: 2 64 | IndentWrappedFunctionNames: false 65 | InsertTrailingCommas: Wrapped 66 | KeepEmptyLinesAtTheStartOfBlocks: false 67 | LambdaBodyIndentation: Signature 68 | MaxEmptyLinesToKeep: 2 69 | NamespaceIndentation: All 70 | PackConstructorInitializers: CurrentLine 71 | PointerAlignment: Left 72 | QualifierAlignment: Custom 73 | QualifierOrder: [ 'inline', 'static', 'constexpr', 'const', 'volatile', 'type', 'restrict' ] 74 | ReferenceAlignment: Left 75 | ReflowComments: false 76 | RequiresClausePosition: OwnLine 77 | SeparateDefinitionBlocks: Always 78 | ShortNamespaceLines: 10 79 | SortIncludes: CaseInsensitive 80 | SortUsingDeclarations: true 81 | SpaceAfterCStyleCast: false 82 | SpaceAfterLogicalNot: false 83 | SpaceAfterTemplateKeyword: true 84 | SpaceBeforeAssignmentOperators: true 85 | SpaceBeforeCpp11BracedList: false 86 | SpaceBeforeCtorInitializerColon: true 87 | SpaceBeforeInheritanceColon: true 88 | SpaceBeforeParens: ControlStatements 89 | SpaceBeforeRangeBasedForLoopColon: true 90 | SpaceBeforeSquareBrackets: false 91 | SpaceInEmptyBlock: false 92 | SpaceInEmptyParentheses: false 93 | SpacesBeforeTrailingComments: 1 94 | SpacesInAngles: false 95 | SpacesInCStyleCastParentheses: false 96 | SpacesInConditionalStatement: false 97 | SpacesInContainerLiterals: false 98 | SpacesInLineCommentPrefix: 99 | Minimum: 1 100 | Maximum: -1 101 | SpacesInParentheses: false 102 | SpacesInSquareBrackets: false 103 | Standard: c++20 104 | TabWidth: 2 105 | UseTab: Never 106 | -------------------------------------------------------------------------------- /LegacyAlgorithms/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2019-2025 namazso 2 | # This file is part of OpenHashTab. 3 | # 4 | # OpenHashTab is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # OpenHashTab is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with OpenHashTab. If not, see . 16 | 17 | cmake_minimum_required(VERSION 3.14) 18 | 19 | project(LegacyAlgorithms) 20 | 21 | add_library(${PROJECT_NAME} STATIC LegacyHasher.cpp) 22 | 23 | target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) 24 | 25 | target_link_libraries(${PROJECT_NAME} PRIVATE AlgorithmsDlls) 26 | -------------------------------------------------------------------------------- /LegacyAlgorithms/Hasher.h: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #pragma once 17 | #include 18 | #include 19 | #include 20 | #include 21 | 22 | #include "../Algorithms/Hasher2.h" 23 | 24 | class LegacyHashAlgorithm { 25 | public: 26 | static constexpr auto k_count = 31; 27 | static constexpr auto k_max_size = 66; 28 | 29 | using AlgorithmsType = LegacyHashAlgorithm[k_count]; 30 | 31 | static AlgorithmsType& Algorithms(); 32 | 33 | static const LegacyHashAlgorithm* ByName(std::string_view name) { 34 | for (const auto& algo : Algorithms()) 35 | if (algo.GetName() == name) 36 | return &algo; 37 | return nullptr; 38 | } 39 | 40 | static int Idx(const LegacyHashAlgorithm* algorithm) { 41 | return algorithm ? (int)(algorithm - std::begin(Algorithms())) : -1; 42 | } 43 | 44 | static int IdxByName(std::string_view name) { 45 | return Idx(ByName(name)); 46 | } 47 | 48 | private: 49 | const char* _name; 50 | const char* const* _extensions; 51 | const HashAlgorithm* _algorithm{}; 52 | const uint64_t* _params{}; 53 | uint32_t _size{}; 54 | bool _is_secure{}; 55 | 56 | LegacyHashAlgorithm( 57 | const char* name, 58 | size_t expected_size, 59 | const char* const* extensions, 60 | const char* alg_name, 61 | const uint64_t* params = nullptr 62 | ); 63 | 64 | public: 65 | LegacyHashAlgorithm(const LegacyHashAlgorithm&) = delete; 66 | LegacyHashAlgorithm(LegacyHashAlgorithm&&) = delete; 67 | 68 | int Idx() const { return Idx(this); } 69 | 70 | constexpr bool IsSecure() const { return _is_secure; } 71 | 72 | constexpr const char* GetName() const { return _name; } 73 | 74 | constexpr uint32_t GetSize() const { return _size; } 75 | 76 | constexpr const char* const* GetExtensions() const { return _extensions; } 77 | 78 | HashBox MakeContext() const; 79 | }; 80 | -------------------------------------------------------------------------------- /Localization/.clang-format: -------------------------------------------------------------------------------- 1 | DisableFormat: true 2 | -------------------------------------------------------------------------------- /Localization/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2019-2025 namazso 2 | # This file is part of OpenHashTab. 3 | # 4 | # OpenHashTab is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # OpenHashTab is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with OpenHashTab. If not, see . 16 | 17 | cmake_minimum_required(VERSION 3.19) 18 | 19 | function(sanitize_string IN_VAR OUT_VAR) 20 | set(OUT "") 21 | string(LENGTH "${IN_VAR}" LEN) 22 | math(EXPR MAX "${LEN} - 1") 23 | 24 | foreach (IDX RANGE ${MAX}) 25 | string(SUBSTRING "${IN_VAR}" ${IDX} "1" CHAR) 26 | string(HEX "${CHAR}" HEXCHAR) 27 | if ("${HEXCHAR}" MATCHES "[0-7].") 28 | set(CHAR "\\x${HEXCHAR}") 29 | endif () 30 | string(APPEND OUT "${CHAR}") 31 | endforeach () 32 | 33 | set(${OUT_VAR} "${OUT}" PARENT_SCOPE) 34 | endfunction() 35 | 36 | function(lang_json_to_include JSON DEFAULT_JSON OUT_VAR) 37 | string(JSON LANGID GET "${JSON}" langid) 38 | string(JSON SUBLANGID GET "${JSON}" sublangid) 39 | string(JSON STRINGS GET "${JSON}" strings) 40 | string(JSON DEFAULT_STRINGS GET "${DEFAULT_JSON}" strings) 41 | string(JSON STRINGS_COUNT LENGTH "${DEFAULT_STRINGS}") 42 | 43 | set(RESULT "LANGUAGE ") 44 | string(APPEND RESULT "${LANGID}") 45 | string(APPEND RESULT ", ") 46 | string(APPEND RESULT "${SUBLANGID}") 47 | string(APPEND RESULT " \\\nSTRINGTABLE \\\nBEGIN \\\n") 48 | 49 | math(EXPR STRINGS_MAX "${STRINGS_COUNT} - 1") 50 | 51 | foreach (IDX RANGE ${STRINGS_MAX}) 52 | string(JSON KEY MEMBER "${DEFAULT_STRINGS}" "${IDX}") 53 | string(JSON DEFAULT_VALUE GET "${DEFAULT_STRINGS}" "${KEY}") 54 | string(JSON VALUE ERROR_VARIABLE VALUE_ERROR GET "${STRINGS}" "${KEY}") 55 | if ((NOT "${VALUE_ERROR}" STREQUAL "NOTFOUND") OR ("${VALUE}" STREQUAL "")) 56 | set(VALUE "${DEFAULT_VALUE}") 57 | endif () 58 | sanitize_string("${VALUE}" VALUE) 59 | string(APPEND RESULT "\tIDS_${KEY}\t\"${VALUE}\" \\\n") 60 | endforeach () 61 | 62 | string(APPEND RESULT "END \\\n") 63 | set(${OUT_VAR} "${RESULT}" PARENT_SCOPE) 64 | endfunction() 65 | 66 | file(GLOB LOCALES CONFIGURE_DEPENDS "*.json") 67 | 68 | # TODO: Since we're using the undocumented RtlGetString, maybe the defaulting could be moved into code. 69 | file(READ "en-us.json" DEFAULT_LOCALE_JSON) 70 | 71 | set(LOCALE_INCLUDE_CONTENT "#define LANGUAGES_IMPL \\\n") 72 | 73 | foreach (LOCALE ${LOCALES}) 74 | file(READ "${LOCALE}" LOCALE_JSON) 75 | lang_json_to_include("${LOCALE_JSON}" "${DEFAULT_LOCALE_JSON}" INCL) 76 | string(APPEND LOCALE_INCLUDE_CONTENT ${INCL}) 77 | endforeach () 78 | 79 | set(LOCALE_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/locale") 80 | 81 | file(MAKE_DIRECTORY ${LOCALE_INCLUDE_DIR}) 82 | 83 | file(WRITE "${LOCALE_INCLUDE_DIR}/Localization.h" "${LOCALE_INCLUDE_CONTENT}") 84 | 85 | add_library(Localization INTERFACE) 86 | 87 | target_include_directories(Localization INTERFACE "${LOCALE_INCLUDE_DIR}") 88 | -------------------------------------------------------------------------------- /Localization/ar.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_ARABIC", 3 | "sublangid": "SUBLANG_NEUTRAL", 4 | "strings": { 5 | "FILENAME": "الاسم", 6 | "ALGORITHM": "الخوارزمية", 7 | "COPIED": "✔ تم النسخ", 8 | "HASH": "التجزئة", 9 | "CHECK_AGAINST": "المقارنة ضِد:", 10 | "EXPORT_TO": "تصدير إلى ملف مجموع:", 11 | "EXPORT_BTN": "تصدير…", 12 | "SUMFILE": "الترجمة إلى ملف مجموع.", 13 | "DONE": "تمّ!", 14 | "PROCESSING": "جاري المُعالجة…", 15 | "HASHES": "تجزئات", 16 | "CLIPBOARD": "إلى الحافظة", 17 | "NOMATCH": "لا يوجد تطابق.", 18 | "ERROR": "خطأ", 19 | "CANCEL": "إلغاء", 20 | "DISPLAY_UPPERCASE": "عَرض التجزئات بأحرف كبيرة", 21 | "LOOK_FOR_SUMFILES": "البحث عن ملفات المجموع بجِوار الملفات التي يتم تجزئتها", 22 | "SUMFILE_UPPERCASE": "تصدير التجزئات بأحرف كبيرة", 23 | "SUMFILE_UNIX_ENDINGS": "تصدير الملفات بنهايات اسطر Unix", 24 | "SUMFILE_USE_DOUBLE_SPACE": "تصدير ملفات المجموع بمسافة مزدوجة بدلاً من علامة النجمة", 25 | "SUMFILE_FORWARD_SLASHES": "استخدام الشرطة المائلة للأمام في مسارات الملفات المُصدّرة", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "تصدير ملفات المجموع بتنسيق متوافق مع corz .hash", 27 | "SUMFILE_BANNER": "إضافة راية إلى الملفات المُصدّرة", 28 | "SUMFILE_BANNER_DATE": "أضف التاريخ إلى الراية", 29 | "CHECK_FOR_UPDATES": "تحقق من وجود تحديثات", 30 | "COPY_HASH": "نسخ التجزئة", 31 | "COPY_LINE": "نسخ السطر", 32 | "COPY_FILE": "نسخ اسم الملف", 33 | "COPY_EVERYTHING": "نسخ كُل شيئ", 34 | "VT_NO_COMPATIBLE": "لم يتم تفعيل خوارزمية متوافقة", 35 | "VT_NOT_FOUND": "غير موجود في قاعدة البيانات", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "غير متوفر في بُنية التطوير", 37 | "UPDATE_AVAILABLE_TITLE": "يُوجد تحديث مُتوفر", 38 | "UPDATE_AVAILABLE_TEXT": "الإصدار الجديد %hu.%hu.%hu. مُتاح", 39 | "UPDATE_NEWEST_TITLE": "مبروك", 40 | "UPDATE_NEWEST_TEXT": "أنت بالفعل في أحدث إصدار", 41 | "CLIPBOARD_AUTOENABLE": "إذا كانت الحافظة تحتوي على تجزئة ، تلقائيًا مَكِّن الخوارزميات التي بهذا الطول للتشغيل", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "فقط إذا لم تكُن أي خوارزمية بهذا الطول مُفعّلة", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "عطِّل كافة الخوارزميات الأخرى", 44 | "ITEMS_MATCHING": "%d ملفات متطابقة", 45 | "SUMFILE_ALGORITHM_ONLY": "عند معالجة مجموع خوارزمية معروفة ، قم بتعطيل الخوارزميات الأخرى", 46 | "INSECURE_GROUP": "غير اَمن", 47 | "UNKNOWN_GROUP": "غير معروف", 48 | "FOREGROUND": "المقدمة", 49 | "BACKGROUND": "الخلفية", 50 | "SETTINGS_TITLE": "الاعدادات", 51 | "CHECKAGAINST_AUTOFORMAT": "إعادة تنسيق التجزئة الملصقة تلقائيًا في حقل المدقق", 52 | "CHECKAGAINST_STRICT": "الوضع الصارم لحقل مدقق التجزئة", 53 | "HASH_SUMFILE_TOO": "عند معالجة ملف المجموع تجزئة ملف المجموع أيضًا", 54 | "MATCH_GROUP": "متطابق", 55 | "MISMATCH_GROUP": "غير متابق", 56 | "ITEM_MATCHING": "ملف واحد مطابق", 57 | "ERROR_GROUP": "خطأ" 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Localization/bg.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_BULGARIAN", 3 | "sublangid": "SUBLANG_BULGARIAN_BULGARIA", 4 | "strings": { 5 | "FILENAME": "Име", 6 | "ALGORITHM": "Алгоритъм", 7 | "COPIED": "✔ Копирано", 8 | "HASH": "Хеш", 9 | "CHECK_AGAINST": "Проверка съвпадение:", 10 | "EXPORT_TO": "Експорт в сумарен файл:", 11 | "EXPORT_BTN": "Експорт…", 12 | "SUMFILE": "Определен като сумарен файл.", 13 | "DONE": "Готово!", 14 | "SUMMARY": "Отчет", 15 | "PROCESSING": "Обработка…", 16 | "HASHES": "Хешове", 17 | "CLIPBOARD": "В системния буфер", 18 | "NOMATCH": "Няма намерени съвпадения.", 19 | "ERROR": "Грешка", 20 | "CANCEL": "Отказ", 21 | "DISPLAY_UPPERCASE": "Показване хешове с главни букви", 22 | "DISPLAY_MONOSPACE": "Показване хешове в моноширинен шрифт", 23 | "LOOK_FOR_SUMFILES": "Наблюдение за сумарни файлове сред хеширваните файлове", 24 | "SUMFILE_UPPERCASE": "Експорт хешове с главни букви", 25 | "SUMFILE_UNIX_ENDINGS": "Експорт файлове с Unix окончания на реда", 26 | "SUMFILE_USE_DOUBLE_SPACE": "Експорт сумирани файлове с двоен интервал вместо звездичка за интервал", 27 | "SUMFILE_FORWARD_SLASHES": "Използвай пътища с наклонена черта в експортираните файлове", 28 | "SUMFILE_DOT_HASH_COMPATIBLE": "Експорт сумирани файлове в corz .hash съвместим формат", 29 | "SUMFILE_BANNER": "Добавяне банер към експортираните файлове", 30 | "SUMFILE_BANNER_DATE": "Добавяне дата към банера", 31 | "CHECK_FOR_UPDATES": "Провери за актуализации", 32 | "COPY_HASH": "Копирай хеш", 33 | "COPY_LINE": "Копирай ред", 34 | "COPY_FILE": "Копирай име на файла", 35 | "COPY_EVERYTHING": "Копирай всичко", 36 | "VT_NO_COMPATIBLE": "Няма позволен съвместим алгоритъм", 37 | "VT_NOT_FOUND": "Не е намерено в базата данни", 38 | "UPDATE_DISABLED_IN_DEV_BUILD": "Недостъпно в компилации за разработка", 39 | "UPDATE_AVAILABLE_TITLE": "Налична актуализация", 40 | "UPDATE_AVAILABLE_TEXT": "Нова версия %hu.%hu.%hu налична", 41 | "UPDATE_NEWEST_TITLE": "Поздравления", 42 | "UPDATE_NEWEST_TEXT": "Вече сте на най-новата версия", 43 | "CLIPBOARD_AUTOENABLE": "Ако клипбордът съдържа хеш, автоматично активирай алгоритми с тази дължина за изпълнение", 44 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Само ако не са активирани алгоритми с тази дължина", 45 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Деактивирай всички други алгоритми", 46 | "SETTINGS_TITLE": "Настройки", 47 | "CHECKAGAINST_AUTOFORMAT": "Автоматично преформатиране на поставените хешове в полето за проверка", 48 | "CHECKAGAINST_STRICT": "Строг режим за полето за хеш проверка", 49 | "HASH_SUMFILE_TOO": "При обработка сумиран файл, хеширай и сумирания файл", 50 | "ITEM_MATCHING": "1 съвпадащ файл", 51 | "ITEMS_MATCHING": "%d съвпадащи файла", 52 | "SUMFILE_ALGORITHM_ONLY": "При обработка сумарен файл от известен алгоритъм, забрани други алгоритми", 53 | "ERROR_GROUP": "Грешка", 54 | "MATCH_GROUP": "Съвпадение", 55 | "MISMATCH_GROUP": "Несъответствие", 56 | "INSECURE_GROUP": "Несигурен", 57 | "UNKNOWN_GROUP": "Неизвестно", 58 | "FOREGROUND": "Цвят текст", 59 | "BACKGROUND": "Цвят фон" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/cs-CZ.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_CZECH", 3 | "sublangid": "SUBLANG_DEFAULT", 4 | "strings": { 5 | "FILENAME": "Název", 6 | "ALGORITHM": "Algoritmus", 7 | "COPIED": "✔ Zkopírováno", 8 | "HASH": "Hash", 9 | "CHECK_AGAINST": "Zkontrolovat proti:", 10 | "EXPORT_TO": "Exportovat do sumsouboru:", 11 | "EXPORT_BTN": "Export…", 12 | "SUMFILE": "Interpretováno jako sumsoubor.", 13 | "DONE": "Hotovo!", 14 | "PROCESSING": "Zpracovává se…", 15 | "HASHES": "Hashe", 16 | "CLIPBOARD": "Do schránky", 17 | "NOMATCH": "Žádná shoda nenalezena.", 18 | "ERROR": "Chyba", 19 | "CANCEL": "Storno", 20 | "DISPLAY_UPPERCASE": "Zobrazovat hashe velkými písmeny", 21 | "LOOK_FOR_SUMFILES": "Hledejte sumsoubory u souborů, které jsou hašovány", 22 | "SUMFILE_UPPERCASE": "Exportovat hashe velkými písmeny", 23 | "SUMFILE_UNIX_ENDINGS": "Exportovat soubory s Unixovým zakončením řádků", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Exportovat sumsoubory s dvojitou mezerou namísto mezera-hvězdička", 25 | "SUMFILE_FORWARD_SLASHES": "V exportovaných souborech použít v cestě dopředného lomítka", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Exportovat sumsoubory ve formátu kompatibilním s corz .hash", 27 | "SUMFILE_BANNER": "Přidat záhlaví do exportovaných souborů", 28 | "SUMFILE_BANNER_DATE": "Přidat datum do záhlaví", 29 | "CHECK_FOR_UPDATES": "Vyhledat aktualizaci", 30 | "COPY_HASH": "Zkopírovat hash", 31 | "COPY_LINE": "Zkopírovat řádek", 32 | "COPY_FILE": "Zkopírovat název souboru", 33 | "COPY_EVERYTHING": "Zkopírovat všechno", 34 | "VT_NO_COMPATIBLE": "Není povolen žádný kompatibilní algoritmus", 35 | "VT_NOT_FOUND": "Nenalezeno v databázi", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "Nedostupné ve vývojových sestaveních", 37 | "UPDATE_AVAILABLE_TITLE": "Aktualizace je k dispozici", 38 | "UPDATE_AVAILABLE_TEXT": "Je dostupná nová verze %hu.%hu.%hu", 39 | "UPDATE_NEWEST_TITLE": "Gratulujeme", 40 | "UPDATE_NEWEST_TEXT": "Již používáte nejnovější verzi", 41 | "CLIPBOARD_AUTOENABLE": "Pokud schránka obsahuje hash, automaticky pro běh povolí algoritmy této délky", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Pouze pokud nejsou povoleny žádné algoritmy této délky", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Zakázat všechny ostatní algoritmy", 44 | "SETTINGS_TITLE": "Nastavení", 45 | "CHECKAGAINST_AUTOFORMAT": "Automaticky přeformátovat vložené hashe v kontrolním poli", 46 | "CHECKAGAINST_STRICT": "Přísný režim pro pole kontroly hash", 47 | "HASH_SUMFILE_TOO": "Při zpracování sumsouboru hašovat také sumfile", 48 | "ITEM_MATCHING": "1 odpovídající soubor", 49 | "ITEMS_MATCHING": "%d odpovídajících souborů", 50 | "SUMFILE_ALGORITHM_ONLY": "Při zpracování sumsouboru známého algoritmu deaktivovat ostatní algoritmy", 51 | "ERROR_GROUP": "Chybné", 52 | "MATCH_GROUP": "Shodné", 53 | "MISMATCH_GROUP": "Neshodné", 54 | "INSECURE_GROUP": "Nejisté", 55 | "UNKNOWN_GROUP": "Neznámé", 56 | "FOREGROUND": "Popředí", 57 | "BACKGROUND": "Pozadí" 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Localization/da-DK.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_DANISH", 3 | "sublangid": "SUBLANG_DANISH_DENMARK", 4 | "strings": { 5 | "FILENAME": "Navn", 6 | "ALGORITHM": "Algoritme", 7 | "COPIED": "✔ Kopieret", 8 | "HASH": "Hash", 9 | "CHECK_AGAINST": "Tjek imod:", 10 | "EXPORT_TO": "Eksporter til checksumfil:", 11 | "EXPORT_BTN": "Eksporter…", 12 | "SUMFILE": "Fortolket som checksumfil.", 13 | "DONE": "Færdig!", 14 | "PROCESSING": "Arbejder…", 15 | "HASHES": "Hashværdier", 16 | "CLIPBOARD": "Til udklipsholder", 17 | "NOMATCH": "Ingen match fundet.", 18 | "ERROR": "Fejl", 19 | "CANCEL": "Annuller", 20 | "DISPLAY_UPPERCASE": "Vis hashværdier i store bogstaver", 21 | "LOOK_FOR_SUMFILES": "Kig efter checksumfil, der ligger sammen med filer der bliver hashet", 22 | "SUMFILE_UPPERCASE": "Eksporter hashværdier i store bogstaver", 23 | "SUMFILE_UNIX_ENDINGS": "Eksporter filer med Unix-linjeslutninger", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Eksporter checksumfiler med dobbelt mellemrum i stedet for mellemrumsstjerne", 25 | "SUMFILE_FORWARD_SLASHES": "Brug skråstregstier i eksporterede filer", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Eksporter checksumfiler i corz .hash-kompatibelt format", 27 | "SUMFILE_BANNER": "Tilføj banner til eksporterede filer", 28 | "SUMFILE_BANNER_DATE": "Tilføj dato til banner", 29 | "CHECK_FOR_UPDATES": "Søg efter opdateringer", 30 | "COPY_HASH": "Kopiér hash", 31 | "COPY_LINE": "Kopiér linje", 32 | "COPY_FILE": "Kopiér filnavn", 33 | "COPY_EVERYTHING": "Kopiér alt", 34 | "VT_NO_COMPATIBLE": "Ingen kompatibel algoritme aktiveret", 35 | "VT_NOT_FOUND": "Ikke fundet i databasen", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "Ikke tilgængelig i udviklingsbuilds", 37 | "UPDATE_AVAILABLE_TITLE": "Opdatering tilgængelig", 38 | "UPDATE_AVAILABLE_TEXT": "Ny version %hu.%hu.%hu tilgængelig", 39 | "UPDATE_NEWEST_TITLE": "Tillykke", 40 | "UPDATE_NEWEST_TEXT": "Du er allerede på den seneste version", 41 | "CLIPBOARD_AUTOENABLE": "Hvis udklipsholderen indeholder en hash streng, skal en matchende algoritme, automatisk aktiveres, en enkelt gang", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Kun hvis der ikke er en matchende algorimte, af samme længde, aktiv", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Deaktiver alle andre algoritmer", 44 | "SETTINGS_TITLE": "Indstillinger", 45 | "CHECKAGAINST_AUTOFORMAT": "Omformater automatisk indsatte hashes i checksums feltet", 46 | "CHECKAGAINST_STRICT": "Streng tilstand for cheksums feltet", 47 | "HASH_SUMFILE_TOO": "Når du behandler en checksumfil, hash også checksumfilen", 48 | "ITEM_MATCHING": "1 matchende fil", 49 | "ITEMS_MATCHING": "%d matchende filer", 50 | "SUMFILE_ALGORITHM_ONLY": "Under behandling af en checksumfil, med kendte algoritmer, skal andre algoritmer deaktiveres", 51 | "ERROR_GROUP": "Fejl", 52 | "MATCH_GROUP": "Ens", 53 | "INSECURE_GROUP": "Usikker", 54 | "MISMATCH_GROUP": "Uens", 55 | "UNKNOWN_GROUP": "Ukendt", 56 | "FOREGROUND": "Tekst", 57 | "BACKGROUND": "Baggrund" 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Localization/de-DE.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_GERMAN", 3 | "sublangid": "SUBLANG_GERMAN", 4 | "strings": { 5 | "FILENAME": "Name", 6 | "ALGORITHM": "Algorithmus", 7 | "COPIED": "✔ Kopiert", 8 | "HASH": "Hash", 9 | "CHECK_AGAINST": "Vergleichen mit / Gegenprüfung:", 10 | "EXPORT_TO": "In Summendatei exportieren:", 11 | "EXPORT_BTN": "Exportieren…", 12 | "SUMFILE": "Interpretiert als Summendatei.", 13 | "DONE": "Fertig!", 14 | "PROCESSING": "Verarbeitung…", 15 | "HASHES": "Hashes", 16 | "CLIPBOARD": "In Clipboard", 17 | "NOMATCH": "Keine Übereinstimmung gefunden.", 18 | "ERROR": "Fehler", 19 | "UPDATE_NEWEST_TITLE": "Gratulation", 20 | "SUMFILE_BANNER_DATE": "Datum zu Banner hinzufügen", 21 | "SUMFILE_BANNER": "Banner zu exportierten Dateien hinzufügen", 22 | "SUMFILE_DOT_HASH_COMPATIBLE": "Summendateien in corz .hash-kompatiblem Format exportieren", 23 | "SUMFILE_FORWARD_SLASHES": "Vorwärtsschrägstrich-Pfade in exportierten Dateien verwenden", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Summendateien mit doppeltem Leerzeichen anstelle von Leerzeichen-Asterisk exportieren", 25 | "SUMFILE_UNIX_ENDINGS": "Dateien mit Unix-Zeilenenden exportieren", 26 | "SUMFILE_UPPERCASE": "Hashes in Großschreibung exportieren", 27 | "LOOK_FOR_SUMFILES": "Suche nach Summendateien neben den zu hashenden Dateien", 28 | "DISPLAY_UPPERCASE": "Hashes in Großschreibung (ABC...) anzeigen", 29 | "UPDATE_NEWEST_TEXT": "Sie sind bereits auf der neuesten Version", 30 | "UPDATE_AVAILABLE_TEXT": "Neue Version %hu.%hu.%hu verfügbar", 31 | "UPDATE_AVAILABLE_TITLE": "Update verfügbar", 32 | "UPDATE_DISABLED_IN_DEV_BUILD": "Nicht verfügbar in Development-Builds", 33 | "VT_NOT_FOUND": "Nicht in Datenbank gefunden", 34 | "VT_NO_COMPATIBLE": "Kein kompatibler Algorithmus aktiviert", 35 | "COPY_EVERYTHING": "Alles kopieren", 36 | "COPY_FILE": "Dateiname kopieren", 37 | "COPY_LINE": "Zeile kopieren", 38 | "COPY_HASH": "Hash kopieren", 39 | "CHECK_FOR_UPDATES": "Nach Updates suchen", 40 | "CANCEL": "Abbrechen", 41 | "CLIPBOARD_AUTOENABLE": "Wenn das Clipboard einen Hash enthält, Algorithmen mit dieser Länge automatisch für die Ausführung aktivieren", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Nur wenn keine Algorithmen dieser Länge aktiviert sind", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Alle anderen Algorithmen deaktiveren", 44 | "SETTINGS_TITLE": "Einstellungen", 45 | "SUMFILE_ALGORITHM_ONLY": "Bei der Verarbeitung einer Summendatei mit bekanntem Algorithmus andere Algorithmen deaktivieren", 46 | "ITEMS_MATCHING": "%d übereinstimmende Dateien", 47 | "ITEM_MATCHING": "1 übereinstimmende Datei", 48 | "HASH_SUMFILE_TOO": "Bei Verarbeitung einer Summendatei auch die Summendatei hashen", 49 | "CHECKAGAINST_STRICT": "Strikter Modus für Hash-Checker-Feld", 50 | "CHECKAGAINST_AUTOFORMAT": "Eingefügte Hashes automatisch im Checker-Feld neuformatieren", 51 | "ERROR_GROUP": "Fehler", 52 | "FOREGROUND": "Vordergrund", 53 | "MATCH_GROUP": "Übereinstimmung", 54 | "MISMATCH_GROUP": "Nichtübereinstimmung", 55 | "INSECURE_GROUP": "Unsicher", 56 | "UNKNOWN_GROUP": "Unbekannt", 57 | "BACKGROUND": "Hintergrund", 58 | "DISPLAY_MONOSPACE": "Hashes in Monospace-Schrift anzeigen", 59 | "SUMMARY": "Zusammenfassung" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/en-US.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_ENGLISH", 3 | "sublangid": "SUBLANG_ENGLISH_US", 4 | "strings": { 5 | "FILENAME": "Name", 6 | "ALGORITHM": "Algorithm", 7 | "COPIED": "✔ Copied", 8 | "HASH": "Hash", 9 | "CHECK_AGAINST": "Check against:", 10 | "EXPORT_TO": "Export to sumfile:", 11 | "EXPORT_BTN": "Export…", 12 | "SUMFILE": "Interpreted as sumfile.", 13 | "DONE": "Done!", 14 | "SUMMARY": "Summary", 15 | "PROCESSING": "Processing…", 16 | "HASHES": "Hashes", 17 | "CLIPBOARD": "To clipboard", 18 | "NOMATCH": "No match found.", 19 | "ERROR": "Error", 20 | "CANCEL": "Cancel", 21 | "DISPLAY_UPPERCASE": "Display hashes in uppercase", 22 | "DISPLAY_MONOSPACE": "Display hashes in monospace font", 23 | "LOOK_FOR_SUMFILES": "Look for sumfiles next to files being hashed", 24 | "SUMFILE_UPPERCASE": "Export hashes in uppercase", 25 | "SUMFILE_UNIX_ENDINGS": "Export files with Unix line endings", 26 | "SUMFILE_USE_DOUBLE_SPACE": "Export sumfiles with double space instead of space-asterisk", 27 | "SUMFILE_FORWARD_SLASHES": "Use forward slash paths in exported files", 28 | "SUMFILE_DOT_HASH_COMPATIBLE": "Export sumfiles in corz .hash compatible format", 29 | "SUMFILE_BANNER": "Add banner to exported files", 30 | "SUMFILE_BANNER_DATE": "Add date to banner", 31 | "CHECK_FOR_UPDATES": "Check for updates", 32 | "COPY_HASH": "Copy hash", 33 | "COPY_LINE": "Copy line", 34 | "COPY_FILE": "Copy file name", 35 | "COPY_EVERYTHING": "Copy everything", 36 | "VT_NO_COMPATIBLE": "No compatible algorithm enabled", 37 | "VT_NOT_FOUND": "Not found in database", 38 | "UPDATE_DISABLED_IN_DEV_BUILD": "Unavailable in development builds", 39 | "UPDATE_AVAILABLE_TITLE": "Update available", 40 | "UPDATE_AVAILABLE_TEXT": "New version %hu.%hu.%hu available", 41 | "UPDATE_NEWEST_TITLE": "Congratulations", 42 | "UPDATE_NEWEST_TEXT": "You are already on the latest version", 43 | "CLIPBOARD_AUTOENABLE": "If clipboard contains a hash, automatically enable algorithms of that length for the run", 44 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Only if no algorithms of that length are enabled", 45 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Disable all other algorithms", 46 | "SETTINGS_TITLE": "Settings", 47 | "CHECKAGAINST_AUTOFORMAT": "Automatically reformat pasted hashes in checker field", 48 | "CHECKAGAINST_STRICT": "Strict mode for hash checker field", 49 | "HASH_SUMFILE_TOO": "When processing a sumfile hash the sumfile too", 50 | "ITEM_MATCHING": "1 matching file", 51 | "ITEMS_MATCHING": "%d matching files", 52 | "SUMFILE_ALGORITHM_ONLY": "When processing a sumfile of known algorithm, disable other algorithms", 53 | "ERROR_GROUP": "Error", 54 | "MATCH_GROUP": "Match", 55 | "MISMATCH_GROUP": "Mismatch", 56 | "INSECURE_GROUP": "Insecure", 57 | "UNKNOWN_GROUP": "Unknown", 58 | "FOREGROUND": "Foreground", 59 | "BACKGROUND": "Background" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/es-ES.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_SPANISH", 3 | "sublangid": "SUBLANG_SPANISH_MODERN", 4 | "strings": { 5 | "FILENAME": "Nombre", 6 | "ALGORITHM": "Algoritmo", 7 | "COPIED": "✔ Copiado", 8 | "HASH": "Hash", 9 | "CHECK_AGAINST": "Comparar con:", 10 | "EXPORT_TO": "Exportar a archivo de checksum:", 11 | "EXPORT_BTN": "Exportar…", 12 | "SUMFILE": "Interpretado como archivo de checksum.", 13 | "DONE": "¡Listo!", 14 | "PROCESSING": "Procesando…", 15 | "HASHES": "Hashes", 16 | "CLIPBOARD": "Al portapapeles", 17 | "NOMATCH": "No se encontraron coincidencias.", 18 | "ERROR": "Error", 19 | "UPDATE_NEWEST_TEXT": "Tiene la última versión", 20 | "UPDATE_NEWEST_TITLE": "Enhorabuena", 21 | "UPDATE_AVAILABLE_TITLE": "Actualización disponible", 22 | "UPDATE_DISABLED_IN_DEV_BUILD": "No disponible en compilaciones de desarrollo", 23 | "VT_NOT_FOUND": "No se encontró en la base de datos", 24 | "VT_NO_COMPATIBLE": "No se habilitó ningún algoritmo compatible", 25 | "SUMFILE_DOT_HASH_COMPATIBLE": "Exportar archivos de checksum en formato .hash compatible con Corz", 26 | "SUMFILE_USE_DOUBLE_SPACE": "Exportar archivos de checksum con doble espacio en vez de espacio y asterisco", 27 | "LOOK_FOR_SUMFILES": "Buscar archivos de checksum junto a los hashes que se están generando", 28 | "UPDATE_AVAILABLE_TEXT": "Nueva versión disponible: %hu.%hu.%hu", 29 | "COPY_EVERYTHING": "Copiar todo", 30 | "COPY_FILE": "Copiar nombre del archivo", 31 | "COPY_LINE": "Copiar línea", 32 | "COPY_HASH": "Copiar hash", 33 | "CHECK_FOR_UPDATES": "Buscar actualizaciones", 34 | "SUMFILE_BANNER_DATE": "Agregar fecha al banner", 35 | "SUMFILE_BANNER": "Agregar banner a archivos exportados", 36 | "SUMFILE_FORWARD_SLASHES": "Usar rutas con barras diagonales en los archivos exportados", 37 | "SUMFILE_UNIX_ENDINGS": "Exportar archivos con finales de línea de Unix", 38 | "SUMFILE_UPPERCASE": "Exportar hashes en mayúsculas", 39 | "DISPLAY_UPPERCASE": "Mostrar hashes en mayúsculas", 40 | "CANCEL": "Cancelar", 41 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Deshabilitar todos los demás algoritmos", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Sólo si no se habilitan algoritmos de esa longitud", 43 | "CLIPBOARD_AUTOENABLE": "Si el Portapapeles contiene un hash, habilitar automáticamente los algoritmos de esa longitud para el procesamiento", 44 | "ITEMS_MATCHING": "%d archivos coincidentes", 45 | "ITEM_MATCHING": "Un archivo coincidente", 46 | "SETTINGS_TITLE": "Configuración", 47 | "SUMFILE_ALGORITHM_ONLY": "Al procesar un archivo de suma de algoritmos conocidos, deshabilita otros algoritmos", 48 | "HASH_SUMFILE_TOO": "Generar hashes para los archivos de checksum también", 49 | "CHECKAGAINST_STRICT": "Modo estricto para el campo de comprobación del hash", 50 | "CHECKAGAINST_AUTOFORMAT": "Formatear automáticamente los hashes pegados en el campo de comprobación", 51 | "ERROR_GROUP": "Error", 52 | "MATCH_GROUP": "Coincide", 53 | "MISMATCH_GROUP": "No coincide", 54 | "INSECURE_GROUP": "Inseguro", 55 | "UNKNOWN_GROUP": "Desconocido", 56 | "FOREGROUND": "Primer plano", 57 | "BACKGROUND": "Segundo plano", 58 | "DISPLAY_MONOSPACE": "Mostrar los hash en la fuente monoespaciada", 59 | "SUMMARY": "Resumen" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/et-EE.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_ESTONIAN", 3 | "sublangid": "SUBLANG_ESTONIAN_ESTONIA", 4 | "strings": { 5 | "FILENAME": "Nimi", 6 | "ALGORITHM": "Algoritm", 7 | "COPIED": "✔ Kopeeritud", 8 | "HASH": "Räsi", 9 | "CHECK_AGAINST": "Võrdle vastu:", 10 | "EXPORT_TO": "Ekspordi sumfaili:", 11 | "EXPORT_BTN": "Ekspordi…", 12 | "SUMFILE": "Interpreteeritud kui sumfail.", 13 | "DONE": "Valmis!", 14 | "SUMMARY": "Kokkuvõte", 15 | "PROCESSING": "Arvutan…", 16 | "HASHES": "Räsid", 17 | "CLIPBOARD": "Lõikepuhvrisse", 18 | "NOMATCH": "Vastavust ei leitud.", 19 | "ERROR": "Viga", 20 | "CANCEL": "Tühista", 21 | "DISPLAY_UPPERCASE": "Kuva räsid SUURTÄHTEDENA", 22 | "DISPLAY_MONOSPACE": "Kuva räsid fikseeritud laiusega fondis", 23 | "LOOK_FOR_SUMFILES": "Otsi räsitavate failide kõrvalt sumfaile", 24 | "SUMFILE_UPPERCASE": "Ekspordi räsid suurtähtedena", 25 | "SUMFILE_UNIX_ENDINGS": "Ekspordi failid Unixi reavahetustega", 26 | "SUMFILE_USE_DOUBLE_SPACE": "Ekspordi sumfailid topelt tühikuga tühiku-tärni asemel", 27 | "SUMFILE_FORWARD_SLASHES": "Kasuta eksporditud failide failiteedes langkriipsu", 28 | "SUMFILE_DOT_HASH_COMPATIBLE": "Ekspordi sumfailid corz .hash ühilduvas vormingus", 29 | "SUMFILE_BANNER": "Lisa eksporditud failidesse bänner", 30 | "SUMFILE_BANNER_DATE": "Lisa bännerisse kuupäev", 31 | "CHECK_FOR_UPDATES": "Kontrolli uuendusi", 32 | "COPY_HASH": "Kopeeri räsi", 33 | "COPY_LINE": "Kopeeri rida", 34 | "COPY_FILE": "Kopeeri failinimi", 35 | "COPY_EVERYTHING": "Kopeeri kõik", 36 | "VT_NO_COMPATIBLE": "Ühtki ühilduvat algoritmi pole lubatud", 37 | "VT_NOT_FOUND": "Andmebaasist ei leitud", 38 | "UPDATE_DISABLED_IN_DEV_BUILD": "Pole arendusversioonides saadaval", 39 | "UPDATE_AVAILABLE_TITLE": "Uuendus on saadaval", 40 | "UPDATE_AVAILABLE_TEXT": "Uus versioon %hu.%hu.%hu saadaval", 41 | "UPDATE_NEWEST_TITLE": "Õnnitlused", 42 | "UPDATE_NEWEST_TEXT": "Kasutad juba kõige ajakohasemat versiooni", 43 | "CLIPBOARD_AUTOENABLE": "Kui lõikepuhver sisaldab räsi, luba automaatselt selleks käivituskorraks algoritmid selle pikkusega", 44 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Ainult kui selle pikkusega algoritmid on lubatud", 45 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Keela kõik muud algoritmid", 46 | "SETTINGS_TITLE": "Sätted", 47 | "CHECKAGAINST_AUTOFORMAT": "Teisenda automaatselt kontrolliväljale kleebitud räsi formaat", 48 | "CHECKAGAINST_STRICT": "Range kontrollvälja režiim", 49 | "HASH_SUMFILE_TOO": "Sumfaili arvutades räsi sumfail ka", 50 | "ITEM_MATCHING": "1 vastav fail", 51 | "ITEMS_MATCHING": "%d vastavat faili", 52 | "SUMFILE_ALGORITHM_ONLY": "Keela kindla algoritmiga sumfaili töödeldes teised algoritmid", 53 | "ERROR_GROUP": "Viga", 54 | "MATCH_GROUP": "Vastavus", 55 | "MISMATCH_GROUP": "Mittevastavus", 56 | "INSECURE_GROUP": "Ebakindel", 57 | "UNKNOWN_GROUP": "Tundmatu", 58 | "FOREGROUND": "Esiplaan", 59 | "BACKGROUND": "Taust" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/fi-FI.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_FINNISH", 3 | "sublangid": "SUBLANG_FINNISH_FINLAND", 4 | "strings": { 5 | "FILENAME": "Nimi", 6 | "ALGORITHM": "Algoritmi", 7 | "COPIED": "✔ Kopioitu", 8 | "HASH": "Tarkiste", 9 | "CHECK_AGAINST": "Tarkista vastaan:", 10 | "EXPORT_TO": "Vie summatiedostoon:", 11 | "EXPORT_BTN": "Vie…", 12 | "SUMFILE": "Tulkittu summatiedostona.", 13 | "DONE": "Valmis!", 14 | "PROCESSING": "Käsitellään…", 15 | "HASHES": "Tarkisteet", 16 | "CLIPBOARD": "Leikepöydälle", 17 | "NOMATCH": "Vastaavuutta ei löytynyt.", 18 | "ERROR": "Virhe", 19 | "CANCEL": "Peruuta", 20 | "DISPLAY_UPPERCASE": "Näytä tarkisteet suuraakkosin", 21 | "LOOK_FOR_SUMFILES": "Etsi summatiedostoja tiedostojen vierestä, joille lasketaan tarkistetta", 22 | "SUMFILE_UPPERCASE": "Vie tarkisteet suuraakkosina", 23 | "SUMFILE_UNIX_ENDINGS": "Vie tiedostot Unix-rivinpäätteillä", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Vienti summatiedostot kaksinkertaisella välilyönnillä välilyönti-asteriskin sijasta", 25 | "SUMFILE_FORWARD_SLASHES": "Käytä vinoviivapolkuja viedyissä tiedostoissa", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Vie summatiedostot corz .hash-yhteensopivassa muodossa", 27 | "SUMFILE_BANNER": "Lisää banneri vietyihin tiedostoihin", 28 | "SUMFILE_BANNER_DATE": "Lisää päivämäärä banneriin", 29 | "CHECK_FOR_UPDATES": "Tarkista päivitykset", 30 | "COPY_HASH": "Kopioi tarkiste", 31 | "COPY_LINE": "Kopioi rivi", 32 | "COPY_FILE": "Kopioi tiedostonimi", 33 | "COPY_EVERYTHING": "Kopioi kaikki", 34 | "VT_NO_COMPATIBLE": "Yhteensopivaa algoritmia ei ole käytössä", 35 | "VT_NOT_FOUND": "Ei löydy tietokannasta", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "Ei käytettävissä kehitysversioissa", 37 | "UPDATE_AVAILABLE_TITLE": "Päivitys saatavilla", 38 | "UPDATE_AVAILABLE_TEXT": "Uusi versio %hu.%hu.%hu saatavilla", 39 | "UPDATE_NEWEST_TITLE": "Onnittelut", 40 | "UPDATE_NEWEST_TEXT": "Sinulla on jo uusin versio", 41 | "CLIPBOARD_AUTOENABLE": "Jos leikepöytä sisältää tarkisteen, ota automaattisesti käyttöön tämän pituiset algoritmit ajoa varten", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Vain jos mitään kyseisen pituisia algoritmeja ei ole käytössä", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Poista kaikki muut algoritmit käytöstä", 44 | "SETTINGS_TITLE": "Asetukset", 45 | "CHECKAGAINST_AUTOFORMAT": "Muotoile tarkistusruudun kenttään liitetyt tarkisteet automaattisesti uudelleen", 46 | "CHECKAGAINST_STRICT": "Ankara tila tarkisteen tarkistuskentälle", 47 | "HASH_SUMFILE_TOO": "Summatiedostoa käsiteltäessä laske tarkiste myös summatiedostolle", 48 | "ITEM_MATCHING": "1 vastaava tiedosto", 49 | "ITEMS_MATCHING": "%d vastaavaa tiedostoa", 50 | "SUMFILE_ALGORITHM_ONLY": "Kun käsitellään tunnetun algoritmin summatiedostoa, poista muut algoritmit käytöstä", 51 | "ERROR_GROUP": "Virhe", 52 | "MATCH_GROUP": "Sama", 53 | "MISMATCH_GROUP": "Eri", 54 | "INSECURE_GROUP": "Epävarma", 55 | "FOREGROUND": "Etupuoli", 56 | "BACKGROUND": "Tausta", 57 | "UNKNOWN_GROUP": "Tuntematon" 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Localization/fr-FR.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_FRENCH", 3 | "sublangid": "SUBLANG_FRENCH", 4 | "strings": { 5 | "FILENAME": "Nom", 6 | "ALGORITHM": "Algorithme", 7 | "COPIED": "✔ Copié", 8 | "HASH": "Somme de contrôle", 9 | "CHECK_AGAINST": "Comparer à :", 10 | "EXPORT_TO": "Exporter vers un fichier de sommes :", 11 | "EXPORT_BTN": "Exporter…", 12 | "SUMFILE": "Interpréter comme un fichier de sommes.", 13 | "DONE": "Fini !", 14 | "PROCESSING": "Traitement…", 15 | "HASHES": "Sommes", 16 | "CLIPBOARD": "Copier", 17 | "NOMATCH": "Aucune comparaison trouvée.", 18 | "ERROR": "Erreur", 19 | "SUMFILE_USE_DOUBLE_SPACE": "Séparateur à la place de <*>", 20 | "LOOK_FOR_SUMFILES": "Recherchez les fichiers de sommes à côté des fichiers en cours de hachage", 21 | "SUMFILE_BANNER": "Ajouter une bannière aux fichiers exportés", 22 | "COPY_EVERYTHING": "Tout copier", 23 | "COPY_FILE": "Copier le nom du fichier", 24 | "COPY_LINE": "Copier la ligne", 25 | "COPY_HASH": "Copier le hachage", 26 | "CHECK_FOR_UPDATES": "Vérifier les mises à jour", 27 | "SUMFILE_BANNER_DATE": "Ajouter une date à la bannière", 28 | "SUMFILE_UNIX_ENDINGS": "Exporter des fichiers avec des fins de ligne Unix", 29 | "SUMFILE_UPPERCASE": "Exporter les hachages en majuscules", 30 | "DISPLAY_UPPERCASE": "Afficher les hachages en majuscules", 31 | "CANCEL": "Annuler", 32 | "SUMFILE_FORWARD_SLASHES": "Utiliser des chemins avec des barres obliques dans les fichiers exportés", 33 | "SUMFILE_DOT_HASH_COMPATIBLE": "Export les fichiers de sommes dans un format corz .hash compatible", 34 | "UPDATE_NEWEST_TITLE": "Félicitations", 35 | "UPDATE_AVAILABLE_TEXT": "Nouvelle version %hu.%hu.%hu disponible", 36 | "UPDATE_AVAILABLE_TITLE": "Mise à jour disponible", 37 | "UPDATE_NEWEST_TEXT": "Vous avez déjà la dernière version", 38 | "UPDATE_DISABLED_IN_DEV_BUILD": "Indisponible dans les versions de développement", 39 | "VT_NOT_FOUND": "Non trouvé dans la base de données", 40 | "VT_NO_COMPATIBLE": "Aucun algorithme compatible activé", 41 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Désactiver tous les autres algorithmes", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Uniquement si aucun algorithme de cette longueur n'est activé", 43 | "CLIPBOARD_AUTOENABLE": "Si le presse-papiers contient un hachage, activer automatiquement les algorithmes de cette longueur pour l'exécution", 44 | "CHECKAGAINST_AUTOFORMAT": "Reformatage automatique des hachages collés dans le champ du vérificateur", 45 | "SUMFILE_ALGORITHM_ONLY": "Lors du traitement d'un fichier de somme d'algorithme connu, désactiver les autres algorithmes", 46 | "ITEMS_MATCHING": "%d fichiers correspondants", 47 | "ITEM_MATCHING": "1 fichier correspondant", 48 | "HASH_SUMFILE_TOO": "Lors du traitement d'un fichier de somme, le fichier de somme est également haché", 49 | "CHECKAGAINST_STRICT": "Mode strict pour le champ du vérificateur de hachage", 50 | "SETTINGS_TITLE": "paramètre", 51 | "ERROR_GROUP": "Erreur", 52 | "MATCH_GROUP": "Correspond", 53 | "INSECURE_GROUP": "Non sécurisé", 54 | "UNKNOWN_GROUP": "Inconnu", 55 | "BACKGROUND": "Arrière-plan", 56 | "FOREGROUND": "Premier-plan", 57 | "MISMATCH_GROUP": "Ne correspond pas", 58 | "DISPLAY_MONOSPACE": "Afficher les hachages en police monospace", 59 | "SUMMARY": "Résumé" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/gl-ES.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_GALICIAN", 3 | "sublangid": "SUBLANG_GALICIAN_GALICIAN", 4 | "strings": { 5 | "FILENAME": "Nome", 6 | "ALGORITHM": "Algoritmo", 7 | "COPIED": "✔ Copiado", 8 | "HASH": "Hash", 9 | "CHECK_AGAINST": "Cotexar con:", 10 | "EXPORT_TO": "Exportar a ficheiro suma:", 11 | "EXPORT_BTN": "Exportar…", 12 | "SUMFILE": "Interpretado como ficheiro suma.", 13 | "DONE": "Feito!", 14 | "PROCESSING": "Procesando…", 15 | "HASHES": "Hashes", 16 | "CLIPBOARD": "Ao portapapeis", 17 | "NOMATCH": "Non se atoparon coincidencias.", 18 | "ERROR": "Erro", 19 | "CANCEL": "Cancelar", 20 | "DISPLAY_UPPERCASE": "Mostrar hashes en maiúscula", 21 | "LOOK_FOR_SUMFILES": "Buscar ficheiros suma xunto aos ficheiros que se están a analizar", 22 | "SUMFILE_UPPERCASE": "Exportar hashes en maiúscula", 23 | "SUMFILE_UNIX_ENDINGS": "Exportar ficheiros con final de liña Unix (LF)", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Exportar ficheiros suma con dobre espazo no canto de espazo-asterisco", 25 | "SUMFILE_FORWARD_SLASHES": "Usa rutas con barras diagonais nos ficheiros exportados", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Exportar ficheiros suma en formato .hash compatíbel con Corz", 27 | "SUMFILE_BANNER": "Engadir banner a ficheiros exportados", 28 | "SUMFILE_BANNER_DATE": "Engadir data ao banner", 29 | "CHECK_FOR_UPDATES": "Procurar actualizacións", 30 | "COPY_HASH": "Copiar hash", 31 | "COPY_LINE": "Copiar liña", 32 | "COPY_FILE": "Copiar nome do ficheiro", 33 | "COPY_EVERYTHING": "Copiar todo", 34 | "VT_NO_COMPATIBLE": "Non se habilitou ningún algoritmo compatíbel", 35 | "VT_NOT_FOUND": "Non se atopa na base de datos", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "Non dispoñíbel en compilacións de desenvolvemento", 37 | "UPDATE_AVAILABLE_TITLE": "Actualización dispoñíbel", 38 | "UPDATE_AVAILABLE_TEXT": "Nova versión %hu.%hu.%hu dispoñíbel", 39 | "UPDATE_NEWEST_TITLE": "Parabéns", 40 | "UPDATE_NEWEST_TEXT": "Xa estás na última versión", 41 | "CLIPBOARD_AUTOENABLE": "Se o portapapeis contén un hash, activa automáticamente os algoritmos desa lonxitude durante a execución", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Só se non houbese algoritmos desa lonxitude activados", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Desactivar os algoritmos restantes", 44 | "SETTINGS_TITLE": "Configuración", 45 | "CHECKAGAINST_AUTOFORMAT": "Reformatar automáticamente os hashes pegados no campo de cotexado", 46 | "CHECKAGAINST_STRICT": "Modo estrito para o campo de verificación de hashes", 47 | "HASH_SUMFILE_TOO": "Ao procesar un ficheiro suma, calcular o hash do ficheiro suma tamén", 48 | "ITEM_MATCHING": "1 ficheiro coincidente", 49 | "ITEMS_MATCHING": "%d ficheiros coincidentes", 50 | "SUMFILE_ALGORITHM_ONLY": "Ao procesar un ficheiro suma dun algoritmo coñecido, desactivar os demáis algoritmos", 51 | "ERROR_GROUP": "Erro", 52 | "MATCH_GROUP": "Coincide", 53 | "MISMATCH_GROUP": "Non coincide", 54 | "INSECURE_GROUP": "Inseguro", 55 | "UNKNOWN_GROUP": "Descoñecido", 56 | "FOREGROUND": "Primeiro plano", 57 | "BACKGROUND": "Segundo plano", 58 | "SUMMARY": "Resumo", 59 | "DISPLAY_MONOSPACE": "Mostrar os hash en fonte monoespazada" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/hr-HR.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_CROATIAN", 3 | "sublangid": "SUBLANG_CROATIAN_CROATIA", 4 | "strings": { 5 | "FILENAME": "Ime", 6 | "ALGORITHM": "Algoritam", 7 | "COPIED": "✔ Kopirano", 8 | "HASH": "Šifra", 9 | "CHECK_AGAINST": "Usporedi s:", 10 | "EXPORT_TO": "Izvoz u datoteku kontrolnog zbroja:", 11 | "EXPORT_BTN": "Izvezi …", 12 | "SUMFILE": "Interpretirano kao datoteka kontrolnog zbroja.", 13 | "DONE": "Gotovo!", 14 | "PROCESSING": "Obrada u tijeku …", 15 | "HASHES": "Šifre", 16 | "CLIPBOARD": "U međuspremnik", 17 | "NOMATCH": "Ništa se ne podudara.", 18 | "ERROR": "Greška", 19 | "CANCEL": "Odustani", 20 | "DISPLAY_UPPERCASE": "Prikaži šifre velikim slovima", 21 | "LOOK_FOR_SUMFILES": "Traži datoteke kontrolnih zbrojeva pored datoteka koje se šifriraju", 22 | "SUMFILE_UPPERCASE": "Izvezi šifre velikim slovima", 23 | "SUMFILE_UNIX_ENDINGS": "Izvezi datoteke sa završecima redaka za Unix", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Izvezi datoteke kontrolnog zbroja s dvostrukim razmakom umjesto razmaknice-zvjezdice", 25 | "SUMFILE_FORWARD_SLASHES": "Koristi kose crte za putanje u izvezenim datotekama", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Izvezi datoteke kontrolnog zbroja u corz .hash kompatibilnom formatu", 27 | "SUMFILE_BANNER": "Izvezenim datotekama dodaj naslov", 28 | "SUMFILE_BANNER_DATE": "U naslov dodaj datum", 29 | "CHECK_FOR_UPDATES": "Traži nove verzije", 30 | "COPY_HASH": "Kopiraj šifru", 31 | "COPY_LINE": "Kopiraj redak", 32 | "COPY_FILE": "Kopiraj ime datoteke", 33 | "COPY_EVERYTHING": "Kopiraj sve", 34 | "VT_NO_COMPATIBLE": "Nije aktiviran nijedan kompatibilan algoritam", 35 | "VT_NOT_FOUND": "Nije pronađeno u bazi podataka", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "Nedostupno u razvojnim izdanjima", 37 | "UPDATE_AVAILABLE_TITLE": "Dostupna je nova verzija", 38 | "UPDATE_AVAILABLE_TEXT": "Dostupna je nova verzija %hu.%hu.%hu", 39 | "UPDATE_NEWEST_TITLE": "Čestitamo", 40 | "UPDATE_NEWEST_TEXT": "Već imaš najnoviju verziju", 41 | "CLIPBOARD_AUTOENABLE": "Ako međuspremnik sadrži šifru, automatski aktiviraj algoritme te duljine za izvođenje", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Samo ako nije aktiviran nijedan algoritam te duljine", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Deaktiviraj sve ostale algoritme", 44 | "SETTINGS_TITLE": "Postavke", 45 | "CHECKAGAINST_AUTOFORMAT": "Automatski preformatiraj umetnute šifre u polju usporedbe", 46 | "CHECKAGAINST_STRICT": "Striktan modus za polje usporedbe šifre", 47 | "HASH_SUMFILE_TOO": "Prilikom obrade datoteke kontrolnog zbroja također šifriraj tu datoteku", 48 | "ITEM_MATCHING": "Podudaranje s 1 datotekom", 49 | "ITEMS_MATCHING": "%d odgovarajućih datoteka", 50 | "SUMFILE_ALGORITHM_ONLY": "Prilikom obrade datoteke kontrolnog zbroja poznatog algoritma, deakativiraj ostale algoritme", 51 | "ERROR_GROUP": "Greška", 52 | "MATCH_GROUP": "Poklapanje", 53 | "BACKGROUND": "Boja pozadine", 54 | "MISMATCH_GROUP": "Nepoklapanje", 55 | "INSECURE_GROUP": "Nesigurno", 56 | "UNKNOWN_GROUP": "Nepoznato", 57 | "FOREGROUND": "Prednja boja", 58 | "DISPLAY_MONOSPACE": "Prikaži šifre jednometričnim fontom", 59 | "SUMMARY": "Sažetak" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/hu-HU.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_HUNGARIAN", 3 | "sublangid": "SUBLANG_HUNGARIAN_HUNGARY", 4 | "strings": { 5 | "FILENAME": "Név", 6 | "ALGORITHM": "Algoritmus", 7 | "COPIED": "✔ Másolva", 8 | "HASH": "Hash", 9 | "CHECK_AGAINST": "Összehasonlítás evvel:", 10 | "EXPORT_TO": "Exportálás sum-fájlba:", 11 | "EXPORT_BTN": "Exportálás…", 12 | "SUMFILE": "Sum-fájlként értelmezve.", 13 | "DONE": "Kész!", 14 | "PROCESSING": "Feldolgozás…", 15 | "HASHES": "Hashek", 16 | "CLIPBOARD": "Vágólapra", 17 | "NOMATCH": "Nincs egyezés.", 18 | "ERROR": "Hiba", 19 | "CANCEL": "Mégse", 20 | "DISPLAY_UPPERCASE": "Hashek megjelenítése nagybetűvel", 21 | "LOOK_FOR_SUMFILES": "Sum-fájlok keresése a fájlok mellett", 22 | "SUMFILE_UPPERCASE": "Hashek exportálása nagybetűvel", 23 | "SUMFILE_UNIX_ENDINGS": "Exportálás Unix sorvégződésekkel", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Exportálás dupla space-szel, space-csillag helyett", 25 | "SUMFILE_FORWARD_SLASHES": "Exportálás perjeles utakkal", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Exportálás corz .hash kompatibilis formában", 27 | "SUMFILE_BANNER": "Banner használata az exportált fájlokban", 28 | "SUMFILE_BANNER_DATE": "Dátum hozzáadása a bannerhez", 29 | "CHECK_FOR_UPDATES": "Frissítés ellenőrzés", 30 | "COPY_HASH": "Hash másolása", 31 | "COPY_LINE": "Sor másolása", 32 | "COPY_FILE": "Fájlnév másolása", 33 | "COPY_EVERYTHING": "Minden másolása", 34 | "UPDATE_NEWEST_TEXT": "A legújabb verziót használod", 35 | "UPDATE_NEWEST_TITLE": "Gratulálunk", 36 | "UPDATE_AVAILABLE_TEXT": "Új verzió %hu.%hu.%hu elérhető", 37 | "UPDATE_AVAILABLE_TITLE": "Frissítés elérhető", 38 | "UPDATE_DISABLED_IN_DEV_BUILD": "Nem elérhető fejlesztői buildben", 39 | "VT_NOT_FOUND": "Nem található az adatbázisban", 40 | "VT_NO_COMPATIBLE": "Nincs kompatibilis algoritmus engedélyezve", 41 | "CLIPBOARD_AUTOENABLE_IF_NONE": "De csak ha nincs megfelelő hosszú már engedélyezve", 42 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "És az összes többi algoritmus letiltása", 43 | "CLIPBOARD_AUTOENABLE": "Ha a vágólapon egy hash van, az olyan hosszúságú algorithmusok automatikus engedélyezése", 44 | "SUMFILE_ALGORITHM_ONLY": "Ismert algoritmusú sum-fájl esetén minden más algoritmus letiltása", 45 | "ITEMS_MATCHING": "%d fájl egyezik", 46 | "ITEM_MATCHING": "1 fájl egyezik", 47 | "HASH_SUMFILE_TOO": "Sum-fájl ellenőrzés esetén a sum-fájl hashelése is", 48 | "CHECKAGAINST_STRICT": "Szigorú módú ellenőrző mező", 49 | "CHECKAGAINST_AUTOFORMAT": "Az ellenőrző mezőbe beillesztett hashek automatikus formázása", 50 | "SETTINGS_TITLE": "Beállítások", 51 | "ERROR_GROUP": "Hiba", 52 | "MISMATCH_GROUP": "Eltérés", 53 | "MATCH_GROUP": "Egyezés", 54 | "INSECURE_GROUP": "Nem biztonságos", 55 | "UNKNOWN_GROUP": "Ismeretlen", 56 | "FOREGROUND": "Előtér", 57 | "BACKGROUND": "Háttér", 58 | "DISPLAY_MONOSPACE": "Hashek megjelenítése monospace betűtípussal", 59 | "SUMMARY": "Összegzés" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/id.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_INDONESIAN", 3 | "sublangid": "SUBLANG_INDONESIAN_INDONESIA", 4 | "strings": { 5 | "FILENAME": "Nama", 6 | "ALGORITHM": "Algoritma", 7 | "COPIED": "✔ Disalin", 8 | "HASH": "Hash", 9 | "CHECK_AGAINST": "Periksa terhadap:", 10 | "EXPORT_TO": "Ekspor ke berkas sum:", 11 | "EXPORT_BTN": "Ekspor…", 12 | "SUMFILE": "Diinterpretasikan sebagai berkas sum.", 13 | "DONE": "Selesai!", 14 | "SUMMARY": "Ringkasan", 15 | "PROCESSING": "Memproses…", 16 | "HASHES": "Hash", 17 | "CLIPBOARD": "Ke papan klip", 18 | "NOMATCH": "Tidak ditemukan kecocokan.", 19 | "ERROR": "Kesalahan", 20 | "CANCEL": "Batal", 21 | "DISPLAY_UPPERCASE": "Tampilkan hash dalam huruf besar", 22 | "DISPLAY_MONOSPACE": "Tampilkan hash dalam huruf monospace", 23 | "LOOK_FOR_SUMFILES": "Cari berkas sum di sebelah berkas yang sedang di-hash", 24 | "SUMFILE_UPPERCASE": "Ekspor hash dalam huruf besar", 25 | "SUMFILE_UNIX_ENDINGS": "Ekspor berkas dengan akhiran baris Unix", 26 | "SUMFILE_USE_DOUBLE_SPACE": "Ekspor berkas sum dengan spasi ganda, bukan spasi tanda bintang", 27 | "SUMFILE_FORWARD_SLASHES": "Gunakan jalur garis miring ke depan dalam berkas yang diekspor", 28 | "SUMFILE_DOT_HASH_COMPATIBLE": "Ekspor berkas sum dalam format yang kompatibel dengan corz .hash", 29 | "SUMFILE_BANNER": "Tambahkan banner ke berkas yang diekspor", 30 | "SUMFILE_BANNER_DATE": "Tambahkan tanggal ke banner", 31 | "CHECK_FOR_UPDATES": "Periksa pembaruan", 32 | "COPY_HASH": "Salin hash", 33 | "COPY_LINE": "Salin baris", 34 | "COPY_FILE": "Salin nama berkas", 35 | "COPY_EVERYTHING": "Salin semuanya", 36 | "VT_NO_COMPATIBLE": "Tidak ada algoritma yang kompatibel diaktifkan", 37 | "VT_NOT_FOUND": "Tidak ditemukan dalam database", 38 | "UPDATE_DISABLED_IN_DEV_BUILD": "Tidak tersedia dalam pengembangan build", 39 | "UPDATE_AVAILABLE_TITLE": "Pembaruan tersedia", 40 | "UPDATE_AVAILABLE_TEXT": "Versi baru %hu.%hu.%hu tersedia", 41 | "UPDATE_NEWEST_TITLE": "Selamat", 42 | "UPDATE_NEWEST_TEXT": "Anda sudah menggunakan versi terbaru", 43 | "CLIPBOARD_AUTOENABLE": "Jika papan klip berisi hash, aktifkan algoritma dengan panjang tersebut secara otomatis untuk dijalankan", 44 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Hanya jika tidak ada algoritma yang sepanjang itu diaktifkan", 45 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Nonaktifkan semua algoritma lainnya", 46 | "SETTINGS_TITLE": "Pengaturan", 47 | "CHECKAGAINST_AUTOFORMAT": "Memformat ulang hash yang ditempelkan secara otomatis di bidang pengecekan", 48 | "CHECKAGAINST_STRICT": "Mode ketat untuk bidang pengecekan hash", 49 | "HASH_SUMFILE_TOO": "Saat memproses hash berkas sum, berkas sum juga", 50 | "ITEM_MATCHING": "1 berkas yang cocok", 51 | "ITEMS_MATCHING": "%d berkas yang cocok", 52 | "SUMFILE_ALGORITHM_ONLY": "Saat memproses berkas sum dari algoritma yang diketahui, nonaktifkan algoritma lain", 53 | "ERROR_GROUP": "Kesalahan", 54 | "MATCH_GROUP": "Cocok", 55 | "MISMATCH_GROUP": "Ketidakcocokan", 56 | "INSECURE_GROUP": "Tidak aman", 57 | "UNKNOWN_GROUP": "Tidak diketahui", 58 | "FOREGROUND": "Latar depan", 59 | "BACKGROUND": "Latar Belakang" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/it-IT.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_ITALIAN", 3 | "sublangid": "SUBLANG_ITALIAN", 4 | "strings": { 5 | "FILENAME": "Nome del file", 6 | "ALGORITHM": "Algoritmo", 7 | "COPIED": "✔ Copiato", 8 | "HASH": "Hash", 9 | "CHECK_AGAINST": "Verificare con:", 10 | "EXPORT_TO": "Esportare in file di checksum:", 11 | "EXPORT_BTN": "Esportare…", 12 | "SUMFILE": "Interpretato come file di checksum.", 13 | "DONE": "Completato!", 14 | "PROCESSING": "Elaborazione…", 15 | "HASHES": "Hash", 16 | "CLIPBOARD": "Copiare negli appunti", 17 | "NOMATCH": "Nessuna corrispondenza trovata.", 18 | "ERROR": "Errore", 19 | "UPDATE_NEWEST_TEXT": "Nessun aggiornamento disponibile", 20 | "UPDATE_NEWEST_TITLE": "Congratulazioni", 21 | "UPDATE_AVAILABLE_TEXT": "Nuova versione %hu.%hu.%hu disponibile", 22 | "UPDATE_AVAILABLE_TITLE": "Aggiornamento disponibile", 23 | "UPDATE_DISABLED_IN_DEV_BUILD": "Non disponibile nelle versioni di sviluppo", 24 | "VT_NOT_FOUND": "Non presente nel database", 25 | "VT_NO_COMPATIBLE": "Nessun algoritmo compatibile abilitato", 26 | "COPY_EVERYTHING": "Copiare tutto", 27 | "COPY_FILE": "Copiare nome file", 28 | "COPY_LINE": "Copiare riga", 29 | "CHECK_FOR_UPDATES": "Verifica disponibilità aggiornamenti", 30 | "CANCEL": "Annulla", 31 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Disabilitare tutti gli altri algoritmi", 32 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Solo se non risultano abilitati algoritmi di quella lunghezza", 33 | "CLIPBOARD_AUTOENABLE": "Se negli appunti è presente un Hash, abilitare automaticamente un algoritmo di quella lunghezza per la sessione", 34 | "COPY_HASH": "Copiare Hash", 35 | "SUMFILE_BANNER_DATE": "Aggiungere data al banner", 36 | "SUMFILE_BANNER": "Aggiungere banner ai file esportati", 37 | "SUMFILE_DOT_HASH_COMPATIBLE": "Esportare i file checksum in formato compatibile .hash di corz", 38 | "SUMFILE_FORWARD_SLASHES": "Utilizzare il carattere barra nei percorsi per i file esportati", 39 | "SUMFILE_USE_DOUBLE_SPACE": "Esportare i file checksum utilizzando il doppio spazio al posto di spazio-asterisco", 40 | "SUMFILE_UNIX_ENDINGS": "Esportare i file checksum con interruzioni riga Unix", 41 | "SUMFILE_UPPERCASE": "Esportare Hash in maiuscolo", 42 | "LOOK_FOR_SUMFILES": "Rilevare file di checksum adiacenti ai file da elaborare", 43 | "DISPLAY_UPPERCASE": "Visualizzare gli Hash in maiuscolo", 44 | "ITEMS_MATCHING": "%d corrispondenze trovate", 45 | "ITEM_MATCHING": "1 corrispondenza trovata", 46 | "CHECKAGAINST_STRICT": "Modalità ristretta per il campo di verifica Hash", 47 | "CHECKAGAINST_AUTOFORMAT": "Riformattare automaticamente gli Hash inseriti nel campo di verifica", 48 | "SETTINGS_TITLE": "Impostazioni", 49 | "HASH_SUMFILE_TOO": "Durante l'elaborazione di un file di checksum calcolane l'hash", 50 | "SUMFILE_ALGORITHM_ONLY": "Durante l'elaborazione di un file di checksum di un algoritmo noto, disabilitare gli altri algoritmi", 51 | "ERROR_GROUP": "Errore", 52 | "INSECURE_GROUP": "Dubbio", 53 | "UNKNOWN_GROUP": "Sconosciuto", 54 | "FOREGROUND": "Primo piano", 55 | "BACKGROUND": "Sfondo", 56 | "MATCH_GROUP": "Corrispondente", 57 | "MISMATCH_GROUP": "Differente", 58 | "DISPLAY_MONOSPACE": "Visualizza gli hash in caratteri monospazio", 59 | "SUMMARY": "Riassunto" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/ja-JP.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_JAPANESE", 3 | "sublangid": "SUBLANG_JAPANESE_JAPAN", 4 | "strings": { 5 | "FILENAME": "ファイル名", 6 | "ALGORITHM": "アルゴリズム", 7 | "COPIED": "✔ コピー完了", 8 | "HASH": "ハッシュ値", 9 | "CHECK_AGAINST": "次と比較:", 10 | "EXPORT_TO": "サムファイルとして出力:", 11 | "EXPORT_BTN": "出力…", 12 | "SUMFILE": "サムファイルとして解釈されました。", 13 | "DONE": "完了!", 14 | "PROCESSING": "処理中…", 15 | "HASHES": "ハッシュ値", 16 | "CLIPBOARD": "クリップボードへ", 17 | "NOMATCH": "一致するものがありません。", 18 | "ERROR": "エラー", 19 | "CANCEL": "キャンセル", 20 | "DISPLAY_UPPERCASE": "ハッシュ値を大文字で表示する", 21 | "LOOK_FOR_SUMFILES": "ハッシュ値を計算するファイルと対応するサムファイルを参照する", 22 | "SUMFILE_UPPERCASE": "ハッシュ値を大文字でファイル出力する", 23 | "SUMFILE_UNIX_ENDINGS": "Unixの改行コードでファイルを出力する", 24 | "SUMFILE_USE_DOUBLE_SPACE": "スペース-アスタリスクの代わりに2つのスペースを用いてファイルを出力する", 25 | "SUMFILE_FORWARD_SLASHES": "パスにフォワードスラッシュを用いてファイルを出力する", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "corz .hash 互換フォーマットでファイルを出力する", 27 | "SUMFILE_BANNER": "バナーを付加してファイルを出力する", 28 | "SUMFILE_BANNER_DATE": "バナーに日時を付加する", 29 | "CHECK_FOR_UPDATES": "アップデートを確認", 30 | "COPY_HASH": "ハッシュ値をコピー", 31 | "COPY_LINE": "行をコピー", 32 | "COPY_FILE": "ファイル名をコピー", 33 | "COPY_EVERYTHING": "すべてをコピー", 34 | "VT_NO_COMPATIBLE": "対応するアルゴリズムが有効になっていません", 35 | "VT_NOT_FOUND": "データベースの中に見つかりません", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "開発中ビルドでは使用できません", 37 | "UPDATE_AVAILABLE_TITLE": "アップデートが可能", 38 | "UPDATE_AVAILABLE_TEXT": "新バージョン %hu.%hu.%hu が入手可能です", 39 | "UPDATE_NEWEST_TITLE": "おめでとうございます", 40 | "UPDATE_NEWEST_TEXT": "すでに最新バージョンを使用しています", 41 | "CLIPBOARD_AUTOENABLE": "クリップボードにハッシュ値がある場合に限り、自動的にその長さのアルゴリズムを有効にする", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "その長さのどのアルゴリズムも有効でない場合に限る", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "他のすべてのアルゴリズムを無効にする", 44 | "SETTINGS_TITLE": "設定", 45 | "CHECKAGAINST_AUTOFORMAT": "チェッカーフィールドに貼り付けられたハッシュ値を自動的に再フォーマットする", 46 | "CHECKAGAINST_STRICT": "ハッシュ値チェッカーフィールドを厳格モードにする", 47 | "HASH_SUMFILE_TOO": "サムファイルを処理するときにサムファイルのハッシュ値も計算する", 48 | "ITEM_MATCHING": "1 ファイルと一致", 49 | "ITEMS_MATCHING": "%d ファイルと一致", 50 | "SUMFILE_ALGORITHM_ONLY": "既知のアルゴリズムのサムファイルを処理するとき、他のアルゴリズムを無効にする", 51 | "ERROR_GROUP": "エラー", 52 | "MATCH_GROUP": "一致", 53 | "MISMATCH_GROUP": "不一致", 54 | "INSECURE_GROUP": "安全ではない", 55 | "UNKNOWN_GROUP": "未知", 56 | "FOREGROUND": "フォアグラウンド", 57 | "BACKGROUND": "バックグラウンド", 58 | "SUMMARY": "要約", 59 | "DISPLAY_MONOSPACE": "ハッシュ値を等幅フォントで表示する" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/ko-KR.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_KOREAN", 3 | "sublangid": "SUBLANG_KOREAN", 4 | "strings": { 5 | "FILENAME": "이름", 6 | "ALGORITHM": "알고리즘", 7 | "COPIED": "✔ 복사됨", 8 | "HASH": "해시", 9 | "CHECK_AGAINST": "해시 비교:", 10 | "EXPORT_TO": "sumfile로 내보내기:", 11 | "EXPORT_BTN": "내보내기…", 12 | "SUMFILE": "sumfile을 불러왔습니다.", 13 | "DONE": "완료!", 14 | "PROCESSING": "처리 중…", 15 | "HASHES": "해시", 16 | "CLIPBOARD": "클립보드로", 17 | "NOMATCH": "일치하는 항목이 없습니다.", 18 | "ERROR": "오류", 19 | "CANCEL": "취소", 20 | "DISPLAY_UPPERCASE": "해시를 대문자로 표시", 21 | "LOOK_FOR_SUMFILES": "같은 폴더에 있는 sumfile 감지", 22 | "SUMFILE_UPPERCASE": "해시를 대문자로 내보내기", 23 | "SUMFILE_UNIX_ENDINGS": "Unix 줄 끝 형식으로 파일 내보내기", 24 | "SUMFILE_USE_DOUBLE_SPACE": "공백-별표 대신 공백 두 번으로 이루어진 sumfile 내보내기", 25 | "SUMFILE_FORWARD_SLASHES": "내보낸 파일 경로에 역슬래시 대신 슬래시 사용", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "corz .hash 호환 형식으로 sumfile 내보내기", 27 | "SUMFILE_BANNER": "내보낸 파일에 배너 추가", 28 | "SUMFILE_BANNER_DATE": "배너에 날짜 추가", 29 | "CHECK_FOR_UPDATES": "업데이트 확인", 30 | "COPY_HASH": "해시 복사", 31 | "COPY_LINE": "줄 복사", 32 | "COPY_FILE": "파일 이름 복사", 33 | "COPY_EVERYTHING": "모두 복사", 34 | "VT_NO_COMPATIBLE": "활성화되어 있는 호환 알고리즘이 없습니다", 35 | "VT_NOT_FOUND": "데이터베이스에 없음", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "개발 중인 빌드에서는 사용할 수 없습니다", 37 | "UPDATE_AVAILABLE_TITLE": "업데이트 가능", 38 | "UPDATE_AVAILABLE_TEXT": "%hu.%hu.%hu 버전으로의 업데이트가 있습니다", 39 | "UPDATE_NEWEST_TITLE": "축하합니다", 40 | "UPDATE_NEWEST_TEXT": "이미 최신 버전을 사용하고 있습니다", 41 | "CLIPBOARD_AUTOENABLE": "클립보드에 해시가 있을 경우 길이가 일치하는 알고리즘 자동 활성화", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "해당 길이의 알고리즘이 하나도 활성화되어 있지 않은 경우에만", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "다른 알고리즘 모두 비활성화", 44 | "SUMFILE_ALGORITHM_ONLY": "sumfile 처리 시 해당 알고리즘 외에 다른 알고리즘 사용 안 함", 45 | "ITEMS_MATCHING": "%d개 파일 일치", 46 | "ITEM_MATCHING": "1개 파일 일치", 47 | "HASH_SUMFILE_TOO": "sumfile 처리 시 sumfile 자체의 해시도 계산", 48 | "CHECKAGAINST_STRICT": "해시 비교 칸에 엄격한 규칙 사용", 49 | "CHECKAGAINST_AUTOFORMAT": "붙여넣기한 해시를 자동으로 해시 비교 칸에 맞추기", 50 | "SETTINGS_TITLE": "설정", 51 | "UNKNOWN_GROUP": "알 수 없음", 52 | "FOREGROUND": "글자 색", 53 | "ERROR_GROUP": "오류", 54 | "MATCH_GROUP": "일치", 55 | "MISMATCH_GROUP": "불일치", 56 | "INSECURE_GROUP": "안전하지 않음", 57 | "BACKGROUND": "배경 색", 58 | "SUMMARY": "요약", 59 | "DISPLAY_MONOSPACE": "해시를 고정폭 글꼴로 표시" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/lt-LT.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_LITHUANIAN", 3 | "sublangid": "SUBLANG_LITHUANIAN", 4 | "strings": { 5 | "FILENAME": "Pavadinimas", 6 | "ALGORITHM": "Algoritmas", 7 | "COPIED": "✔ Nukopijuota", 8 | "HASH": "Maiša", 9 | "CHECK_AGAINST": "Patikrinkite prieš:", 10 | "EXPORT_TO": "Eksportuoti į sumos failą:", 11 | "EXPORT_BTN": "Eksportuoti…", 12 | "SUMFILE": "Interpretuota kaip sumos failas.", 13 | "DONE": "Atlikta!", 14 | "PROCESSING": "Apdorojama…", 15 | "HASHES": "Maišos", 16 | "CLIPBOARD": "Į iškarpinę", 17 | "NOMATCH": "Atitikmuo nerastas.", 18 | "ERROR": "Klaida", 19 | "CANCEL": "Atšaukti", 20 | "DISPLAY_UPPERCASE": "Rodyti maišą didžiosiomis raidėmis", 21 | "LOOK_FOR_SUMFILES": "Ieškokite sumos failų šalia failų, kuriems atliekama maiša", 22 | "SUMFILE_UPPERCASE": "Eksportuoti maišas didžiosiomis raidėmis", 23 | "SUMFILE_UNIX_ENDINGS": "Eksportuoti failus su Unix eilučių galūnėmis", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Eksportuoti sumos failą su dvigubu tarpu, o ne tarpo žvaigždute", 25 | "SUMFILE_FORWARD_SLASHES": "Eksportuotose failuose naudoti pasvirojo brūkšnio kelius", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Eksportuoti suminius failus su corz .hash suderinamu formatu", 27 | "SUMFILE_BANNER": "Pridėti vėliavėlę prie eksportuojamų failų", 28 | "SUMFILE_BANNER_DATE": "Įtraukti datą į vėliavėlę", 29 | "CHECK_FOR_UPDATES": "Tikrinti, ar yra atnaujinimų", 30 | "COPY_HASH": "Kopijuoti maišą", 31 | "COPY_LINE": "Kopijuoti eilutę", 32 | "COPY_FILE": "Kopijuoti failo pavadinimą", 33 | "COPY_EVERYTHING": "Kopijuoti viską", 34 | "VT_NO_COMPATIBLE": "Neįgalintas joks suderinamas algoritmas", 35 | "VT_NOT_FOUND": "Nerasta duomenų bazėje", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "Neprieinama kūrėjo versijose", 37 | "UPDATE_AVAILABLE_TITLE": "Yra atnaujinimų", 38 | "UPDATE_AVAILABLE_TEXT": "Nauja versija %hu.%hu.%hu jau prieinama", 39 | "UPDATE_NEWEST_TITLE": "Sveikiname", 40 | "UPDATE_NEWEST_TEXT": "Jūs jau naudojate naujausią versiją", 41 | "CLIPBOARD_AUTOENABLE": "Jei iškarpinėje yra maiša, automatiškai įjungiami tokio ilgio algoritmai", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Tik tuo atveju, jei nėra įjungtas nė vienas tokio ilgio algoritmas", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Išjungti visus kitus algoritmus", 44 | "SETTINGS_TITLE": "Nustatymai", 45 | "CHECKAGAINST_AUTOFORMAT": "Automatiškai performatuoti įklijuotas maišas tikrinimo lauke", 46 | "CHECKAGAINST_STRICT": "Griežtas maišos tikrintuvo lauko režimas", 47 | "HASH_SUMFILE_TOO": "Apdorojant sumos failą taip pat atlikti ir sumos failo maišą", 48 | "ITEM_MATCHING": "1 atitinkantis failas", 49 | "ITEMS_MATCHING": "%d atitinkantys failai", 50 | "SUMFILE_ALGORITHM_ONLY": "Apdorojant žinomo algoritmo sumos failą, išjungti kitus algoritmus", 51 | "ERROR_GROUP": "Klaida", 52 | "MATCH_GROUP": "Atitikimas", 53 | "INSECURE_GROUP": "Nesaugus", 54 | "FOREGROUND": "Priekinio plano", 55 | "UNKNOWN_GROUP": "Nežinomas", 56 | "BACKGROUND": "Foninis", 57 | "MISMATCH_GROUP": "Neatitikimas", 58 | "SUMMARY": "Santrauka" 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Localization/nb-NO.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_NORWEGIAN", 3 | "sublangid": "SUBLANG_NORWEGIAN_BOKMAL", 4 | "strings": { 5 | "FILENAME": "Navn", 6 | "ALGORITHM": "Algoritme", 7 | "COPIED": "✔ Kopiert", 8 | "HASH": "Sjekksum", 9 | "CHECK_AGAINST": "Sjekk mot:", 10 | "EXPORT_TO": "Eksporter til sjekksumsfil:", 11 | "EXPORT_BTN": "Eksporter …", 12 | "SUMFILE": "Fortolket som sjekksumsfil.", 13 | "DONE": "Ferdig!", 14 | "PROCESSING": "Behandler …", 15 | "HASHES": "Sjekksummer", 16 | "CLIPBOARD": "Til utklippstavle", 17 | "NOMATCH": "Ingen treff.", 18 | "ERROR": "Feil", 19 | "CANCEL": "Avbryt", 20 | "DISPLAY_UPPERCASE": "Vis sjekksummer med store bokstaver", 21 | "LOOK_FOR_SUMFILES": "Se etter sjekksumsfiler blandt filene som blir sjekksumert", 22 | "SUMFILE_UPPERCASE": "Eksporter sjekksummer med store bokstaver", 23 | "SUMFILE_UNIX_ENDINGS": "Eksporter filer med Unix-linjeslutter", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Eksporter sjekksumsfiler med doble mellomrom istedenfor mellomroms-asterisk", 25 | "SUMFILE_FORWARD_SLASHES": "Bruk skråstreksstier i eksporterte filer", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Eksporer sjekksumsfiler i corz .hash-kompatiblelt format", 27 | "SUMFILE_BANNER": "Legg til banner i eksporterte filer", 28 | "SUMFILE_BANNER_DATE": "Legg til dato i banner", 29 | "CHECK_FOR_UPDATES": "Se etter oppdateringer", 30 | "COPY_HASH": "Kopier sjekksum", 31 | "COPY_LINE": "Kopier linje", 32 | "COPY_FILE": "Kopier filnavn", 33 | "COPY_EVERYTHING": "Kopier alt", 34 | "VT_NO_COMPATIBLE": "Ingen kompatibel algoritme aktivert", 35 | "VT_NOT_FOUND": "Ikke funnet i databasen", 36 | "UPDATE_NEWEST_TEXT": "Du er allerede på nyeste versjon", 37 | "UPDATE_NEWEST_TITLE": "Gratulerer", 38 | "UPDATE_AVAILABLE_TEXT": "Ny versjon %hu.%hu.%hu tilgjengelig", 39 | "UPDATE_AVAILABLE_TITLE": "Oppdatering tilgjengelig", 40 | "UPDATE_DISABLED_IN_DEV_BUILD": "Utilgjengelig i utviklingsbygg", 41 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Kun hvis ingen algoritmer av den lengden er påslått", 42 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Skru av alle andre algoritmer", 43 | "CLIPBOARD_AUTOENABLE": "Skru på algoritmer i under hele kjøringen vis utklippstavlen inneholder en sjekksum", 44 | "ITEMS_MATCHING": "%d matchende filer", 45 | "SETTINGS_TITLE": "Innstillinger", 46 | "ITEM_MATCHING": "1 matchende fil", 47 | "MATCH_GROUP": "Samsvar", 48 | "BACKGROUND": "Bakgrunn", 49 | "CHECKAGAINST_STRICT": "Streng modus for sjekksumskontrollfelt", 50 | "SUMMARY": "Sammendrag", 51 | "DISPLAY_MONOSPACE": "Viser sjekksummer i fastbreddeskrift", 52 | "HASH_SUMFILE_TOO": "Sjekksummer sjekksumsfilen ved behandling av den", 53 | "MISMATCH_GROUP": "Ikke samsvar", 54 | "UNKNOWN_GROUP": "Ukjent", 55 | "SUMFILE_ALGORITHM_ONLY": "Skru av andre algoritmer ved behandling av en sjekksumsfil av kjent algoritme", 56 | "ERROR_GROUP": "Feil", 57 | "FOREGROUND": "Forgrunn", 58 | "CHECKAGAINST_AUTOFORMAT": "Auto-reformater sjekksummer innlimt i kontrollfeltet", 59 | "INSECURE_GROUP": "Usikker" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/nl-NL.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_DUTCH", 3 | "sublangid": "SUBLANG_DUTCH", 4 | "strings": { 5 | "FILENAME": "Bestandsnaam", 6 | "ALGORITHM": "Algoritme", 7 | "COPIED": "✔ Gekopieerd", 8 | "HASH": "Hash", 9 | "CHECK_AGAINST": "Vergelijk met:", 10 | "EXPORT_TO": "Exporteer als hashbestand:", 11 | "EXPORT_BTN": "Exporteer…", 12 | "SUMFILE": "Geïnterpreteerd als hashbestand.", 13 | "DONE": "Klaar!", 14 | "PROCESSING": "Bezig…", 15 | "HASHES": "Hashes", 16 | "CLIPBOARD": "Naar klembord", 17 | "NOMATCH": "Geen overeenkomst gevonden.", 18 | "ERROR": "Fout", 19 | "CANCEL": "Annuleren", 20 | "DISPLAY_UPPERCASE": "Weergave hashes in hoofdletters", 21 | "LOOK_FOR_SUMFILES": "Zoek naar hashbestanden naast de bestanden die worden gehashed", 22 | "SUMFILE_UPPERCASE": "Exporteer hashes in hoofdletters", 23 | "SUMFILE_UNIX_ENDINGS": "Exporteer bestanden met Unix-regeleinden", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Exporteer hashbestanden met dubbele spaties i.p.v. spatie-sterretje", 25 | "SUMFILE_FORWARD_SLASHES": "Gebruik paden met schuine streep (/) in geëxporteerde bestanden", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Exporteer hashbestanden in corz .hash compatibel formaat", 27 | "SUMFILE_BANNER": "Voeg banner toe aan geëxporteerde bestanden", 28 | "SUMFILE_BANNER_DATE": "Voeg datum toe aan banner", 29 | "CHECK_FOR_UPDATES": "Controleer op nieuwe versie", 30 | "COPY_HASH": "Kopieer hash", 31 | "COPY_LINE": "Kopieer regel", 32 | "COPY_FILE": "Kopieer bestandsnaam", 33 | "COPY_EVERYTHING": "Kopieer alles", 34 | "VT_NO_COMPATIBLE": "Geen compatibel algoritme ingeschakeld", 35 | "VT_NOT_FOUND": "Niet in database gevonden", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "Niet beschikbaar in ontwikkelversies", 37 | "UPDATE_AVAILABLE_TITLE": "Nieuwe versie beschikbaar", 38 | "UPDATE_AVAILABLE_TEXT": "Nieuwe versie %hu.%hu.%hu beschikbaar", 39 | "UPDATE_NEWEST_TITLE": "Gefeliciteerd", 40 | "UPDATE_NEWEST_TEXT": "U heeft de laatste versie", 41 | "CLIPBOARD_AUTOENABLE": "Als er een hash op het klemboard staat, zet dan automatisch algoritmes aan voor die lengte", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Alleen als er geen algoritmes van die lengte zijn aangezet", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Zet alle andere algoritmes uit", 44 | "SETTINGS_TITLE": "Instellingen", 45 | "CHECKAGAINST_AUTOFORMAT": "Bij plakken van hashes in 'Vergelijken met' veld automatisch formaat aanpassen", 46 | "CHECKAGAINST_STRICT": "Strikte modus voor 'Vergelijken met' veld", 47 | "HASH_SUMFILE_TOO": "Maak ook hash van hashbestand bij verwerken hashbestand", 48 | "ITEM_MATCHING": "1 overeenkomend bestand", 49 | "ITEMS_MATCHING": "%d overeenkomende bestanden", 50 | "SUMFILE_ALGORITHM_ONLY": "Zet alle andere algoritmes uit bij het verwerken van een hashbestand met een bekend algoritme", 51 | "UNKNOWN_GROUP": "Onbekend", 52 | "ERROR_GROUP": "Foutmelding", 53 | "INSECURE_GROUP": "Onveilig", 54 | "BACKGROUND": "Achtergrond", 55 | "FOREGROUND": "Voorgrond", 56 | "MATCH_GROUP": "Overeenkomst", 57 | "MISMATCH_GROUP": "Niet-overeenkomend", 58 | "DISPLAY_MONOSPACE": "Geef hashes weer in monospace-lettertype", 59 | "SUMMARY": "Samenvatting" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/pl-PL.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_POLISH", 3 | "sublangid": "SUBLANG_POLISH_POLAND", 4 | "strings": { 5 | "FILENAME": "Nazwa", 6 | "ALGORITHM": "Algorytm", 7 | "COPIED": "✔ Skopiowano", 8 | "HASH": "Hash", 9 | "CHECK_AGAINST": "Porównaj z:", 10 | "EXPORT_TO": "Eksportuj jako plik sum:", 11 | "EXPORT_BTN": "Eksportuj…", 12 | "SUMFILE": "Zinterpretowano jako plik sum.", 13 | "DONE": "Skończone!", 14 | "PROCESSING": "Przetwarzanie…", 15 | "HASHES": "Hashe", 16 | "CLIPBOARD": "Do schowka", 17 | "NOMATCH": "Nie znaleziono dopasowania.", 18 | "ERROR": "Błąd", 19 | "CANCEL": "Anuluj", 20 | "DISPLAY_UPPERCASE": "Wyświetlaj hashe wielkimi literami", 21 | "LOOK_FOR_SUMFILES": "Wyszukaj pliki sum obok hashowanych plików", 22 | "SUMFILE_UPPERCASE": "Eksportuj hashe wielkimi literami", 23 | "SUMFILE_UNIX_ENDINGS": "Eksportuj pliki jako ze znakami końca linii zgodnymi z Unix", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Eksportuj pliki sum z ciągiem podwójnej spacji zamiast ciągu \"spacja-gwiazdka\"", 25 | "SUMFILE_FORWARD_SLASHES": "Użyj ścieżek z ukośnikiem prawym (slash, \"/\") w eksportowanych plikach", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Eksportuj pliki sum w formacie zgodnym z corz .hash", 27 | "SUMFILE_BANNER": "Dodaj baner do eksportowanych plików", 28 | "SUMFILE_BANNER_DATE": "Dodaj datę do banera", 29 | "CHECK_FOR_UPDATES": "Sprawdź aktualizacje", 30 | "COPY_HASH": "Skopiuj hash", 31 | "COPY_LINE": "Skopiuj linię", 32 | "COPY_FILE": "Skopiuj nazwę pliku", 33 | "COPY_EVERYTHING": "Skopiuj wszystko", 34 | "VT_NO_COMPATIBLE": "Brak włączonego kompatybilnego algorytmu", 35 | "VT_NOT_FOUND": "Nie znaleziono w bazie danych", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "Niedostępne w wydaniach rozwojowych", 37 | "UPDATE_AVAILABLE_TITLE": "Dostępna aktualizacja", 38 | "UPDATE_AVAILABLE_TEXT": "Dostępna jest nowa wersja %hu.%hu.%hu", 39 | "UPDATE_NEWEST_TITLE": "Gratulacje", 40 | "UPDATE_NEWEST_TEXT": "Masz już najnowszą wersję", 41 | "CLIPBOARD_AUTOENABLE": "Jeśli schowek zawiera hash, automatycznie włącz algorytmy o tej długości dla przebiegu", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Tylko wtedy, gdy nie są włączone żadne algorytmy o tej długości", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Wyłącz wszelkie inne algorytmy", 44 | "SETTINGS_TITLE": "Ustawienia", 45 | "CHECKAGAINST_AUTOFORMAT": "Sformatuj automatycznie wklejone hashe w polu porównania", 46 | "CHECKAGAINST_STRICT": "Tryb ścisły dla pola porównania hashy", 47 | "HASH_SUMFILE_TOO": "Podczas przetwarzania pliku hashy oblicz również hash tego pliku", 48 | "ITEM_MATCHING": "1 dopasowany plik", 49 | "ITEMS_MATCHING": "%d dopasowanych plików", 50 | "SUMFILE_ALGORITHM_ONLY": "Wyłącz pozostałe algorytmy podczas przetwarzania pliku sum znanego algorytmu", 51 | "ERROR_GROUP": "Błąd", 52 | "INSECURE_GROUP": "Niepewny", 53 | "UNKNOWN_GROUP": "Nieznany", 54 | "MATCH_GROUP": "Zgodny", 55 | "BACKGROUND": "Drugoplanowy", 56 | "FOREGROUND": "Pierwszoplanowy", 57 | "MISMATCH_GROUP": "Niezgodny", 58 | "DISPLAY_MONOSPACE": "Wyświetlaj hashe czcionką o stałej szerokości", 59 | "SUMMARY": "Podsumowanie" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/pt-BR.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_PORTUGUESE", 3 | "sublangid": "SUBLANG_PORTUGUESE_BRAZILIAN", 4 | "strings": { 5 | "FILENAME": "Nome", 6 | "ALGORITHM": "Algoritmo", 7 | "COPIED": "✔ Copiado", 8 | "HASH": "Hash", 9 | "CHECK_AGAINST": "Verificar contra:", 10 | "EXPORT_TO": "Exportar para arquivo de soma:", 11 | "EXPORT_BTN": "Exportar…", 12 | "SUMFILE": "Interpretado como arquivo de soma.", 13 | "DONE": "Concluído!", 14 | "PROCESSING": "Processando…", 15 | "HASHES": "Hashes", 16 | "CLIPBOARD": "Para a área de transferência", 17 | "NOMATCH": "Nenhuma correspondência encontrada.", 18 | "ERROR": "Erro", 19 | "CANCEL": "Cancelar", 20 | "DISPLAY_UPPERCASE": "Exibir hashes em letras maiúsculas", 21 | "LOOK_FOR_SUMFILES": "Procurar arquivos de soma próximos aos arquivos que estão sendo “hasheados”", 22 | "SUMFILE_UPPERCASE": "Exportar hashes em letras maiúsculas", 23 | "SUMFILE_UNIX_ENDINGS": "Exportar arquivos com finais de linha Unix", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Exportar arquivos de soma com espaço duplo em vez de espaço-asterisco", 25 | "SUMFILE_FORWARD_SLASHES": "Usar caminhos com barras nos arquivos exportados", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Exportar arquivos de soma em formato compatível com o .hash do corz", 27 | "SUMFILE_BANNER": "Adicionar banner aos arquivos exportados", 28 | "SUMFILE_BANNER_DATE": "Adicionar data ao banner", 29 | "CHECK_FOR_UPDATES": "Verificar atualizações", 30 | "COPY_HASH": "Copiar hash", 31 | "COPY_LINE": "Copiar linha", 32 | "COPY_FILE": "Copiar nome do arquivo", 33 | "COPY_EVERYTHING": "Copiar tudo", 34 | "VT_NO_COMPATIBLE": "Nenhum algoritmo compatível ativado", 35 | "VT_NOT_FOUND": "Não encontrado no banco de dados", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "Indisponível em versões de desenvolvimento", 37 | "UPDATE_AVAILABLE_TITLE": "Atualização disponível", 38 | "UPDATE_AVAILABLE_TEXT": "Nova versão %hu.%hu.%hu disponível", 39 | "UPDATE_NEWEST_TITLE": "Parabéns", 40 | "UPDATE_NEWEST_TEXT": "Você já está na versão mais recente", 41 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Desativar todos os outros algoritmos", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Somente se nenhum algoritmo do mesmo comprimento estiver habilitado", 43 | "CLIPBOARD_AUTOENABLE": "Se a área de transferência contiver um hash, habilite automaticamente algoritmos do mesmo comprimento para a execução", 44 | "ITEMS_MATCHING": "%d arquivos correspondentes", 45 | "ITEM_MATCHING": "1 arquivo correspondente", 46 | "CHECKAGAINST_AUTOFORMAT": "Reformatar automaticamente hashes colados no campo de verificação", 47 | "CHECKAGAINST_STRICT": "Modo rigoroso para o campo de verificação de hash", 48 | "SETTINGS_TITLE": "Configurações", 49 | "HASH_SUMFILE_TOO": "Ao processar um arquivo de soma, calcule o hash do arquivo de soma também", 50 | "SUMFILE_ALGORITHM_ONLY": "Ao processar um arquivo de soma de algoritmo conhecido, desative outros algoritmos", 51 | "ERROR_GROUP": "Erro", 52 | "MATCH_GROUP": "Correspondência", 53 | "MISMATCH_GROUP": "Sem correspondência", 54 | "INSECURE_GROUP": "Inseguro", 55 | "UNKNOWN_GROUP": "Desconhecido", 56 | "FOREGROUND": "Primeiro plano", 57 | "BACKGROUND": "Segundo plano", 58 | "SUMMARY": "Resumo", 59 | "DISPLAY_MONOSPACE": "Exibir hashes em fonte monoespaçada" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/pt-PT.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_PORTUGUESE", 3 | "sublangid": "SUBLANG_PORTUGUESE", 4 | "strings": { 5 | "FILENAME": "Nome", 6 | "ALGORITHM": "Algoritmo", 7 | "COPIED": "✔ Copiado", 8 | "HASH": "Hash", 9 | "CHECK_AGAINST": "Verificar contra:", 10 | "EXPORT_TO": "Exportar para ficheiro de soma:", 11 | "EXPORT_BTN": "Exportar…", 12 | "SUMFILE": "Interpretado como ficheiro de soma.", 13 | "DONE": "Concluído!", 14 | "PROCESSING": "A processar…", 15 | "HASHES": "Hashes", 16 | "CLIPBOARD": "Para a área de transferência", 17 | "NOMATCH": "Nenhuma correspondência encontrada.", 18 | "ERROR": "Erro", 19 | "CANCEL": "Cancelar", 20 | "DISPLAY_UPPERCASE": "Exibir hashes em letras maiúsculas", 21 | "LOOK_FOR_SUMFILES": "Procurar ficheiros de soma próximos aos ficheiros que estão sendo “hasheados”", 22 | "SUMFILE_UPPERCASE": "Exportar hashes em letras maiúsculas", 23 | "SUMFILE_UNIX_ENDINGS": "Exportar ficheiros com finais de linha Unix", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Exportar ficheiros de soma com espaço duplo em vez de espaço-asterisco", 25 | "SUMFILE_FORWARD_SLASHES": "Usar caminhos com barras nos ficheiros exportados", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Exportar ficheiros de soma em formato compatível com o .hash do corz", 27 | "SUMFILE_BANNER": "Adicionar banner aos ficheiros exportados", 28 | "SUMFILE_BANNER_DATE": "Adicionar data ao banner", 29 | "CHECK_FOR_UPDATES": "Verificar atualizações", 30 | "COPY_HASH": "Copiar hash", 31 | "COPY_LINE": "Copiar linha", 32 | "COPY_FILE": "Copiar nome do ficheiro", 33 | "COPY_EVERYTHING": "Copiar tudo", 34 | "VT_NO_COMPATIBLE": "Nenhum algoritmo compatível ativado", 35 | "VT_NOT_FOUND": "Não encontrado no banco de dados", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "Indisponível em versões de desenvolvimento", 37 | "UPDATE_AVAILABLE_TITLE": "Atualização disponível", 38 | "UPDATE_AVAILABLE_TEXT": "Nova versão %hu.%hu.%hu disponível", 39 | "UPDATE_NEWEST_TITLE": "Parabéns", 40 | "UPDATE_NEWEST_TEXT": "Já está na versão mais recente", 41 | "CLIPBOARD_AUTOENABLE": "Se a área de transferência contiver um hash, ative automaticamente algoritmos do mesmo comprimento para a execução", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Somente se nenhum algoritmo do mesmo comprimento estiver ativado", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Desativar todos os outros algoritmos", 44 | "SETTINGS_TITLE": "Configurações", 45 | "CHECKAGAINST_AUTOFORMAT": "Reformatar automaticamente hashes colados no campo de verificação", 46 | "CHECKAGAINST_STRICT": "Modo rigoroso para o campo de verificação de hash", 47 | "HASH_SUMFILE_TOO": "Ao processar um ficheiro de soma, calcule o hash do ficheiro de soma também", 48 | "ITEM_MATCHING": "1 ficheiro correspondente", 49 | "ITEMS_MATCHING": "%d ficheiros correspondentes", 50 | "SUMFILE_ALGORITHM_ONLY": "Ao processar um ficheiro de soma de algoritmo conhecido, desative outros algoritmos", 51 | "ERROR_GROUP": "Erro", 52 | "MATCH_GROUP": "Correspondência", 53 | "MISMATCH_GROUP": "Sem correspondência", 54 | "INSECURE_GROUP": "Inseguro", 55 | "UNKNOWN_GROUP": "Desconhecido", 56 | "FOREGROUND": "Primeiro plano", 57 | "BACKGROUND": "Segundo plano", 58 | "SUMMARY": "Resumo", 59 | "DISPLAY_MONOSPACE": "Exibir hashes em fonte monoespaçada" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/ro-RO.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_ROMANIAN", 3 | "sublangid": "SUBLANG_ROMANIAN_ROMANIA", 4 | "strings": { 5 | "FILENAME": "Nume", 6 | "ALGORITHM": "Algoritm", 7 | "COPIED": "✔ Copiat", 8 | "HASH": "Hash", 9 | "CHECK_AGAINST": "Se verifică:", 10 | "EXPORT_TO": "Exportați în fișierul suma:", 11 | "EXPORT_BTN": "Exportați…", 12 | "SUMFILE": "Interpretat ca fișierul suma.", 13 | "DONE": "Gata!", 14 | "PROCESSING": "In curs de procesare…", 15 | "HASHES": "Hașuri", 16 | "CLIPBOARD": "Către clipboard", 17 | "NOMATCH": "Nu s-a găsit nicio potrivire.", 18 | "ERROR": "Eroare", 19 | "CANCEL": "Anulează", 20 | "DISPLAY_UPPERCASE": "Afișarea hașurilor cu majuscule", 21 | "LOOK_FOR_SUMFILES": "Căutați fișierul suma în dreptul fișierelor care fac obiectul hașurării", 22 | "SUMFILE_UPPERCASE": "Exportă hașuri în majuscule", 23 | "SUMFILE_UNIX_ENDINGS": "Exportați fișiere cu terminații de linie Unix", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Exportați fișierul suma cu spațiu dublu în loc de spațiu-asterisc", 25 | "SUMFILE_FORWARD_SLASHES": "Utilizați căile de acces cu bară oblică în fișierele exportate", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Exportă fișierul suma în format compatibil cu corz .hash", 27 | "SUMFILE_BANNER": "Adăugați banner la fișierele exportate", 28 | "SUMFILE_BANNER_DATE": "Adăugați data la banner", 29 | "CHECK_FOR_UPDATES": "Verificați dacă există actualizări", 30 | "COPY_HASH": "Copiați hash", 31 | "COPY_LINE": "Copiați linia", 32 | "COPY_FILE": "Copiați numele fișierului", 33 | "COPY_EVERYTHING": "Copiați totul", 34 | "VT_NO_COMPATIBLE": "Niciun algoritm compatibil activat", 35 | "VT_NOT_FOUND": "Nu se găsește în baza de date", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "Indisponibil în versiunile de dezvoltare", 37 | "UPDATE_AVAILABLE_TITLE": "Actualizare disponibilă", 38 | "UPDATE_AVAILABLE_TEXT": "Noua versiune %hu.%hu.%hu disponibilă", 39 | "UPDATE_NEWEST_TITLE": "Felicitări", 40 | "UPDATE_NEWEST_TEXT": "Sunteți deja pe ultima versiune", 41 | "CLIPBOARD_AUTOENABLE": "Dacă clipboard-ul conține un hash, activați automat algoritmii cu lungimea respectivă pentru execuție", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Numai în cazul în care nu sunt activați algoritmi de această lungime", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Dezactivați toți ceilalți algoritmi", 44 | "SETTINGS_TITLE": "Setări", 45 | "CHECKAGAINST_AUTOFORMAT": "Reformatarea automată a hașurilor lipite în câmpul verificatorului", 46 | "CHECKAGAINST_STRICT": "Modul strict pentru câmpul de verificare hash", 47 | "HASH_SUMFILE_TOO": "Atunci când se procesează un fișier sumar, se adaugă un hash la fișierul sumar", 48 | "ITEM_MATCHING": "1 fișier de corespondență", 49 | "ITEMS_MATCHING": "%d fișiere corespunzătoare", 50 | "SUMFILE_ALGORITHM_ONLY": "La procesarea unui fișier sumar cu algoritm cunoscut, dezactivați ceilalți algoritmi", 51 | "ERROR_GROUP": "Eroare", 52 | "MATCH_GROUP": "Meci", 53 | "MISMATCH_GROUP": "Nepotrivire", 54 | "INSECURE_GROUP": "Nesigură", 55 | "UNKNOWN_GROUP": "Necunoscut", 56 | "FOREGROUND": "Prim-plan", 57 | "BACKGROUND": "Fond", 58 | "SUMMARY": "Sumar", 59 | "DISPLAY_MONOSPACE": "Afișează hașurile cu font monospațiu" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/ru-RU.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_RUSSIAN", 3 | "sublangid": "SUBLANG_RUSSIAN_RUSSIA", 4 | "strings": { 5 | "FILENAME": "Имя", 6 | "ALGORITHM": "Алгоритм", 7 | "COPIED": "✔ Скопировано", 8 | "HASH": "Хэш", 9 | "CHECK_AGAINST": "Проверить совпадения:", 10 | "EXPORT_TO": "Экспорт в хэш-файл:", 11 | "EXPORT_BTN": "Экспорт…", 12 | "SUMFILE": "Это хэш-файл.", 13 | "DONE": "Готово!", 14 | "PROCESSING": "Обработка…", 15 | "HASHES": "Хэши", 16 | "CLIPBOARD": "В буфер", 17 | "NOMATCH": "Совпадений не найдено.", 18 | "ERROR": "Ошибка", 19 | "COPY_EVERYTHING": "Копировать всё", 20 | "COPY_FILE": "Копировать имя файла", 21 | "COPY_LINE": "Копировать строку", 22 | "COPY_HASH": "Копировать хэш", 23 | "CHECK_FOR_UPDATES": "Проверить обновления", 24 | "SUMFILE_BANNER_DATE": "Добавить дату к заголовку", 25 | "CANCEL": "Отмена", 26 | "UPDATE_NEWEST_TEXT": "Вы используете последнюю версию", 27 | "UPDATE_NEWEST_TITLE": "Поздравляем", 28 | "UPDATE_AVAILABLE_TEXT": "Доступна новая версия %hu.%hu.%hu", 29 | "UPDATE_AVAILABLE_TITLE": "Доступно обновление", 30 | "UPDATE_DISABLED_IN_DEV_BUILD": "Недоступно в тестовой сборке", 31 | "VT_NOT_FOUND": "Не найдено в базе данных", 32 | "SUMFILE_BANNER": "Добавить заголовок в экспортируемые файлы", 33 | "SUMFILE_UPPERCASE": "Экспортировать хэши в верхнем регистре", 34 | "DISPLAY_UPPERCASE": "Показывать хэши в верхнем регистре", 35 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Отключать все другие алгоритмы", 36 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Только если не включены другие алгоритмы данной длины", 37 | "CLIPBOARD_AUTOENABLE": "При наличии хэша в буфере обмена автоматически включать алгоритмы подходящей длины", 38 | "VT_NO_COMPATIBLE": "Не включен подходящий алгоритм", 39 | "SUMFILE_DOT_HASH_COMPATIBLE": "Экспортировать хэш-файлы в формате corz .hash", 40 | "SUMFILE_FORWARD_SLASHES": "Экспортировать хэш-файлы с путями к файлам в Unix-формате", 41 | "SUMFILE_USE_DOUBLE_SPACE": "Экспортировать хэш-файлы с двумя пробелами вместо пробела со звёздочкой", 42 | "SUMFILE_UNIX_ENDINGS": "Экспортировать хэш-файлы с окончанием строк в Unix-формате", 43 | "LOOK_FOR_SUMFILES": "Поиск хэш-файлов в папке с обрабатываемыми файлами", 44 | "SETTINGS_TITLE": "Настройки", 45 | "SUMFILE_ALGORITHM_ONLY": "При обработке хэш-файлов отключать не использованные в них алгоритмы", 46 | "HASH_SUMFILE_TOO": "Дополнительно вычислять хэш хэш-файлов при их обработке", 47 | "CHECKAGAINST_AUTOFORMAT": "Автоматически форматировать хэши, вставленные в поле проверки", 48 | "ITEMS_MATCHING": "Совпадает %d файла(ов)", 49 | "ITEM_MATCHING": "Совпадает 1 файл", 50 | "CHECKAGAINST_STRICT": "Строгий режим в поле проверки хэша", 51 | "ERROR_GROUP": "Ошибка", 52 | "UNKNOWN_GROUP": "Неизвестно", 53 | "FOREGROUND": "Цвет текста", 54 | "BACKGROUND": "Цвет фона", 55 | "MATCH_GROUP": "Совпавшие", 56 | "MISMATCH_GROUP": "Несовпавшие", 57 | "INSECURE_GROUP": "Небезопасные", 58 | "SUMMARY": "Отчет", 59 | "DISPLAY_MONOSPACE": "Отображать хэши моноширинным шрифтом" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/sk-SK.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_SLOVAK", 3 | "sublangid": "SUBLANG_SLOVAK_SLOVAKIA", 4 | "strings": { 5 | "FILENAME": "Názov", 6 | "ALGORITHM": "Algoritmus", 7 | "COPIED": "✔ Skopírované", 8 | "HASH": "Hash", 9 | "CHECK_AGAINST": "Porovnať s:", 10 | "EXPORT_TO": "Exportovať do súboru sumfile:", 11 | "EXPORT_BTN": "Export…", 12 | "SUMFILE": "Použité ako sumfile.", 13 | "DONE": "Hotovo!", 14 | "PROCESSING": "Spracúvam…", 15 | "HASHES": "Hashe", 16 | "CLIPBOARD": "Do schránky", 17 | "NOMATCH": "Nebola nájdená žiadna zhoda.", 18 | "ERROR": "Chyba", 19 | "CANCEL": "Zrušiť", 20 | "DISPLAY_UPPERCASE": "Zobrazovať hashe veľkými písmenami", 21 | "LOOK_FOR_SUMFILES": "Hľadať sumfiles medzi hashovanými súbormi", 22 | "SUMFILE_UPPERCASE": "Exportovať hashe s veľkými písmenami", 23 | "SUMFILE_UNIX_ENDINGS": "Exportovať súbory s koncovkami riadkov systému Unix", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Exportovať sumfiles s dvojitou medzerou namiesto \"medzerníka s hviezdičkou\"", 25 | "SUMFILE_FORWARD_SLASHES": "Používať cesty s prednou lomkou v exportovaných súboroch", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Exportovať sumfiles vo formáte kompatibilnom s \"corz .hash\"", 27 | "SUMFILE_BANNER": "Pridať banner k exportovaným súborom", 28 | "SUMFILE_BANNER_DATE": "Pridať do bannera dátum", 29 | "CHECK_FOR_UPDATES": "Skontrolovať aktualizácie", 30 | "COPY_HASH": "Kopírovať hash", 31 | "COPY_LINE": "Kopírovať riadok", 32 | "COPY_FILE": "Kopírovať názov súboru", 33 | "COPY_EVERYTHING": "Kopírovať všetko", 34 | "VT_NO_COMPATIBLE": "Žiadny kompatibilný algoritmus nie je aktívny", 35 | "VT_NOT_FOUND": "Nebolo nájdené v databáze", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "Nedostupné vo vývojárskych kompiláciách", 37 | "UPDATE_AVAILABLE_TITLE": "Dostupný update", 38 | "UPDATE_AVAILABLE_TEXT": "Dostupná nová verzia: %hu.%hu.%hu", 39 | "UPDATE_NEWEST_TITLE": "Gratulujeme", 40 | "UPDATE_NEWEST_TEXT": "Máte najnovšiu verziu", 41 | "CLIPBOARD_AUTOENABLE": "Ak sa v schránke nachádza hash, automaticky dočasne povoliť algoritmy s rovnakou dĺžkou hashu", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Iba ak nie sú povolené algoritmy danej dĺžky", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Zakázať všetky ostatné algoritmy", 44 | "SETTINGS_TITLE": "Nastavenia", 45 | "CHECKAGAINST_AUTOFORMAT": "Automatické preformátovanie hashov vložených do porovnávacieho poľa", 46 | "CHECKAGAINST_STRICT": "Prísny režim pre porovnávacie pole hash hodnôt", 47 | "HASH_SUMFILE_TOO": "Pri spracovaní súčtového súboru hashujte aj súčtový súbor", 48 | "ITEM_MATCHING": "1 zhodný súbor", 49 | "ITEMS_MATCHING": "%d zhodných súborov", 50 | "SUMFILE_ALGORITHM_ONLY": "Pri spracúvaní sumfile so známym algoritmom, vypnúť ostatné algoritmy", 51 | "ERROR_GROUP": "Chyba", 52 | "MATCH_GROUP": "Zhoda", 53 | "MISMATCH_GROUP": "Nezhoda", 54 | "INSECURE_GROUP": "Nezabezpečená", 55 | "UNKNOWN_GROUP": "Neznáma", 56 | "FOREGROUND": "Popredie", 57 | "BACKGROUND": "Pozadie", 58 | "DISPLAY_MONOSPACE": "Zobrazenie hesiel v monospace písme", 59 | "SUMMARY": "Zhrnutie" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/sl-SI.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_SLOVENIAN", 3 | "sublangid": "SUBLANG_SLOVENIAN_SLOVENIA", 4 | "strings": { 5 | "FILENAME": "Ime datoteke", 6 | "ALGORITHM": "Algoritem", 7 | "COPIED": "✔ Kopirano", 8 | "HASH": "Hash", 9 | "CHECK_AGAINST": "Primerjaj s/z:", 10 | "EXPORT_TO": "Izvozi kot:", 11 | "EXPORT_BTN": "Izvozi…", 12 | "SUMFILE": "Razloži kot sumfile.", 13 | "DONE": "Končano!", 14 | "PROCESSING": "Pregledujem…", 15 | "HASHES": "Hashes", 16 | "CLIPBOARD": "Kopiraj v odložišče", 17 | "NOMATCH": "Ni najdenih zadetkov.", 18 | "ERROR": "Napaka", 19 | "CANCEL": "Prekliči", 20 | "DISPLAY_UPPERCASE": "Prikaži hashe z velikimi črkami", 21 | "LOOK_FOR_SUMFILES": "Poglej za sumfile zraven filov ki se hasirajo", 22 | "SUMFILE_UPPERCASE": "Izvozi hashe z uporabo velikih črk", 23 | "SUMFILE_UNIX_ENDINGS": "Izvozi file z Unixovimi končnicami", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Izvozi sumfile z uporabo dvojnega presledka, namesto z uporabo preslednice-zvezdice", 25 | "SUMFILE_FORWARD_SLASHES": "Uporabi navadno poševnico pri navajanju poti ob izvozu datotek", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Izvozi sumfile v formatu kompatibilnem z corz .hash", 27 | "SUMFILE_BANNER": "Dodaj transparentno pasico izvoženim datotekam", 28 | "SUMFILE_BANNER_DATE": "Dodaj datum v transparentno pasico", 29 | "CHECK_FOR_UPDATES": "Preveri posodobitve", 30 | "COPY_HASH": "Kopiraj hash", 31 | "COPY_LINE": "Kopiraj vrstico", 32 | "COPY_FILE": "Kopiraj ime datoteke", 33 | "COPY_EVERYTHING": "Kopiraj vse", 34 | "VT_NO_COMPATIBLE": "Ni omogočenega kompatibilnega algoritma", 35 | "VT_NOT_FOUND": "Ni zadetka v podatkovni bazi", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "Ni na voljo v razvojni različici", 37 | "UPDATE_AVAILABLE_TITLE": "Na voljo je posodobitev", 38 | "UPDATE_AVAILABLE_TEXT": "Nova različica %hu.%hu.%hu je na voljo", 39 | "UPDATE_NEWEST_TITLE": "Čestitke", 40 | "UPDATE_NEWEST_TEXT": "Nameščeno imate najnovejšo različico", 41 | "CLIPBOARD_AUTOENABLE": "Če odložišče vsebuje hash datoteke, samodejno omogoči algoritem ustrezne dolžine za dotični primer", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Samo v primeru, da ni izbran noben algoritem takšne dolžine", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Onemogoči vse ostale algoritme", 44 | "SETTINGS_TITLE": "Nastavitve", 45 | "CHECKAGAINST_AUTOFORMAT": "Samodejno prestrukturiraj prilepljene hashe v preglednem polju", 46 | "CHECKAGAINST_STRICT": "Strogi način za hash pregledno polje", 47 | "HASH_SUMFILE_TOO": "Med pregledom sumfile datoteke, ji generiraj tudi hash", 48 | "ITEM_MATCHING": "1 ujemajoča datoteka", 49 | "ITEMS_MATCHING": "%d ujemajočih datotek", 50 | "SUMFILE_ALGORITHM_ONLY": "Ob pregledovanju sumfile datotek znanih algoritmov, onemogoči druge algoritme", 51 | "ERROR_GROUP": "Napaka", 52 | "MATCH_GROUP": "Ujemanje", 53 | "MISMATCH_GROUP": "Neujemanje", 54 | "INSECURE_GROUP": "Nevarno", 55 | "UNKNOWN_GROUP": "Nepoznano", 56 | "FOREGROUND": "Ospredje", 57 | "BACKGROUND": "Ozadje" 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Localization/sv-SE.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_SWEDISH", 3 | "sublangid": "SUBLANG_SWEDISH", 4 | "strings": { 5 | "FILENAME": "Namn", 6 | "ALGORITHM": "Algoritm", 7 | "COPIED": "✔ Kopierad", 8 | "HASH": "Hashvärde", 9 | "CHECK_AGAINST": "Kontrollera mot:", 10 | "EXPORT_TO": "Exportera till summafil:", 11 | "EXPORT_BTN": "Exportera…", 12 | "SUMFILE": "Tolkas som summafil.", 13 | "DONE": "Klar!", 14 | "PROCESSING": "Arbetar…", 15 | "HASHES": "Hashvärden", 16 | "CLIPBOARD": "Till urklipp", 17 | "NOMATCH": "Hittade ingen matchning.", 18 | "ERROR": "Fel", 19 | "CANCEL": "Avbryt", 20 | "DISPLAY_UPPERCASE": "Visa hashvärden i versaler", 21 | "LOOK_FOR_SUMFILES": "Leta efter summafiler bredvid filer som hashas", 22 | "SUMFILE_UPPERCASE": "Exportera hashvärden i versaler", 23 | "SUMFILE_UNIX_ENDINGS": "Exportera filer med Unix-radändelser", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Exportera summafiler med dubbelt mellanslag i stället för mellanslagsasterisk", 25 | "SUMFILE_FORWARD_SLASHES": "Använd framåtriktade snedstreck i exporterade filer", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Exportera summafiler i corz .hash-kompatibelt format", 27 | "SUMFILE_BANNER": "Lägg till banner till exporterade filer", 28 | "SUMFILE_BANNER_DATE": "Lägg till datum i bannern", 29 | "CHECK_FOR_UPDATES": "Sök efter uppdateringar", 30 | "COPY_HASH": "Kopiera hashvärde", 31 | "COPY_LINE": "Kopiera rad", 32 | "COPY_FILE": "Kopiera filnamn", 33 | "COPY_EVERYTHING": "Kopiera allt", 34 | "VT_NO_COMPATIBLE": "Ingen kompatibel algoritm aktiverad", 35 | "VT_NOT_FOUND": "Hittades inte i databasen", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "Ej tillgängligt i utvecklingsversioner", 37 | "UPDATE_AVAILABLE_TITLE": "Uppdatering tillgänglig", 38 | "UPDATE_AVAILABLE_TEXT": "Ny version %hu.%hu.%hu tillgänglig", 39 | "UPDATE_NEWEST_TITLE": "Grattis", 40 | "UPDATE_NEWEST_TEXT": "Du har redan den senaste versionen", 41 | "CLIPBOARD_AUTOENABLE": "Om urklipp innehåller ett hashvärde, aktivera automatiskt algoritmer av den längden för körningen", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Endast om inga algoritmer av den längden är aktiverade", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Inaktivera alla andra algoritmer", 44 | "SETTINGS_TITLE": "Inställningar", 45 | "CHECKAGAINST_AUTOFORMAT": "Formatera om inklistrade hashvärden automatiskt i kontrollfältet", 46 | "CHECKAGAINST_STRICT": "Strikt läge för hashkontrollfält", 47 | "HASH_SUMFILE_TOO": "När du bearbetar en summafil hasha även summafilen", 48 | "ITEM_MATCHING": "1 matchande fil", 49 | "ITEMS_MATCHING": "%d matchande filer", 50 | "SUMFILE_ALGORITHM_ONLY": "När du bearbetar en summafil av känd algoritm, inaktivera andra algoritmer", 51 | "ERROR_GROUP": "Fel", 52 | "MATCH_GROUP": "Lika", 53 | "MISMATCH_GROUP": "Olika", 54 | "INSECURE_GROUP": "Osäker", 55 | "UNKNOWN_GROUP": "Okänd", 56 | "FOREGROUND": "Förgrund", 57 | "BACKGROUND": "Bakgrund", 58 | "DISPLAY_MONOSPACE": "Visa hashvärden i teckensnittet monospace", 59 | "SUMMARY": "Sammanfattning" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/ta-LK.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_TAMIL", 3 | "sublangid": "SUBLANG_TAMIL_SRI_LANKA", 4 | "strings": { 5 | "FILENAME": "பெயர்", 6 | "ALGORITHM": "படிமுறை", 7 | "COPIED": ". நகலெடுக்கப்பட்டது", 8 | "HASH": "ஆச்", 9 | "CHECK_AGAINST": "எதிராக சரிபார்க்கவும்:", 10 | "EXPORT_TO": "சம்ஃபைலுக்கு ஏற்றுமதி:", 11 | "EXPORT_BTN": "ஏற்றுமதி…", 12 | "SUMFILE": "சம்ஃபைல் என விளக்கப்படுகிறது.", 13 | "DONE": "முடிந்தது!", 14 | "SUMMARY": "சுருக்கம்", 15 | "PROCESSING": "செயலாக்கம்…", 16 | "HASHES": "ஆச்கள்", 17 | "CLIPBOARD": "இடைநிலைப்பலகைக்கு", 18 | "NOMATCH": "போட்டி எதுவும் கிடைக்கவில்லை.", 19 | "ERROR": "பிழை", 20 | "CANCEL": "ரத்துசெய்", 21 | "DISPLAY_UPPERCASE": "பெரிய எழுத்தில் ஆச்களைக் காண்பி", 22 | "DISPLAY_MONOSPACE": "மோனோச்பேச் எழுத்துருவில் ஆச்களைக் காண்பி", 23 | "LOOK_FOR_SUMFILES": "கோப்புகள் ஆசெட் செய்யப்படுவதற்கு அடுத்ததாக சம்ஃபைல்களைத் தேடுங்கள்", 24 | "SUMFILE_UPPERCASE": "பெரிய எழுத்தில் ஆச்களை ஏற்றுமதி செய்யுங்கள்", 25 | "SUMFILE_UNIX_ENDINGS": "யுனிக்ச் வரி முடிவுகளுடன் கோப்புகளை ஏற்றுமதி செய்யுங்கள்", 26 | "SUMFILE_USE_DOUBLE_SPACE": "விண்வெளி-அதிகப்படுவதற்கு பதிலாக இரட்டை இடத்துடன் சம்ஃபைல்களை ஏற்றுமதி செய்யுங்கள்", 27 | "SUMFILE_FORWARD_SLASHES": "ஏற்றுமதி செய்யப்பட்ட கோப்புகளில் முன்னோக்கி ச்லாச் பாதைகளைப் பயன்படுத்தவும்", 28 | "SUMFILE_DOT_HASH_COMPATIBLE": "கோர்ச் .ஆச் இணக்கமான வடிவத்தில் சம்ஃபைல்களை ஏற்றுமதி செய்யுங்கள்", 29 | "SUMFILE_BANNER": "ஏற்றுமதி செய்யப்பட்ட கோப்புகளுக்கு பேனரைச் சேர்க்கவும்", 30 | "SUMFILE_BANNER_DATE": "பேனரில் தேதியைச் சேர்க்கவும்", 31 | "CHECK_FOR_UPDATES": "புதுப்பிப்புகளை சரிபார்க்கவும்", 32 | "COPY_HASH": "ஆச் நகலெடுக்கவும்", 33 | "COPY_LINE": "நகல் வரி", 34 | "COPY_FILE": "கோப்பு பெயரை நகலெடுக்கவும்", 35 | "COPY_EVERYTHING": "எல்லாவற்றையும் நகலெடுக்கவும்", 36 | "VT_NO_COMPATIBLE": "இணக்கமான வழிமுறை எதுவும் இயக்கப்படவில்லை", 37 | "VT_NOT_FOUND": "தரவுத்தளத்தில் காணப்படவில்லை", 38 | "UPDATE_DISABLED_IN_DEV_BUILD": "வளர்ச்சி கட்டமைப்பில் கிடைக்கவில்லை", 39 | "UPDATE_AVAILABLE_TITLE": "புதுப்பிப்பு கிடைக்கிறது", 40 | "UPDATE_AVAILABLE_TEXT": "புதிய பதிப்பு%HU.%HU.%HU கிடைக்கிறது", 41 | "UPDATE_NEWEST_TITLE": "வாழ்த்துக்கள்", 42 | "UPDATE_NEWEST_TEXT": "நீங்கள் ஏற்கனவே அண்மைக் கால பதிப்பில் இருக்கிறீர்கள்", 43 | "CLIPBOARD_AUTOENABLE": "கிளிப்போர்டில் ஒரு ஆச் இருந்தால், தானாகவே அந்த நீளத்தின் வழிமுறைகளை இயக்கவும்", 44 | "CLIPBOARD_AUTOENABLE_IF_NONE": "அந்த நீளத்தின் வழிமுறைகள் எதுவும் இயக்கப்படவில்லை என்றால் மட்டுமே", 45 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "மற்ற எல்லா வழிமுறைகளையும் முடக்கவும்", 46 | "SETTINGS_TITLE": "அமைப்புகள்", 47 | "CHECKAGAINST_AUTOFORMAT": "செக்கர் துறையில் ஒட்டப்பட்ட ஆச்களை தானாக மறுவடிவமைப்பு செய்யுங்கள்", 48 | "CHECKAGAINST_STRICT": "ஆச் செக்கர் புலத்திற்கான கடுமையான பயன்முறை", 49 | "HASH_SUMFILE_TOO": "ஒரு சம்ஃபைல் ஆசை செயலாக்கும்போது சம்ஃபைலும் கூட", 50 | "ITEM_MATCHING": "பொருந்தக்கூடிய 1 கோப்பு", 51 | "ITEMS_MATCHING": "பொருந்தக்கூடிய கோப்புகள் %d", 52 | "SUMFILE_ALGORITHM_ONLY": "அறியப்பட்ட வழிமுறையின் ஒரு சம்ஃபைலை செயலாக்கும்போது, பிற வழிமுறைகளை முடக்கு", 53 | "ERROR_GROUP": "பிழை", 54 | "MATCH_GROUP": "போட்டி", 55 | "MISMATCH_GROUP": "பொருந்தாத", 56 | "INSECURE_GROUP": "பாதுகாப்பற்றது", 57 | "UNKNOWN_GROUP": "தெரியவில்லை", 58 | "FOREGROUND": "முன்புறம்", 59 | "BACKGROUND": "பின்னணி" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/th-TH.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_THAI", 3 | "sublangid": "SUBLANG_THAI_THAILAND", 4 | "strings": { 5 | "FILENAME": "ชื่อ", 6 | "ALGORITHM": "อัลกอริทึม", 7 | "COPIED": "✔ คัดลอกแล้ว", 8 | "HASH": "แฮช", 9 | "CHECK_AGAINST": "ตรวจสอบจากค่า:", 10 | "EXPORT_TO": "ส่งออกไปยังไฟล์ซัม:", 11 | "EXPORT_BTN": "ส่งออก…", 12 | "SUMFILE": "แปลเป็นไฟล์ซัม", 13 | "DONE": "เสร็จสิ้น!", 14 | "PROCESSING": "กำลังประมวลผล…", 15 | "HASHES": "แฮช", 16 | "CLIPBOARD": "ไปคลิปบอร์ด", 17 | "NOMATCH": "ไม่เหมือนกัน", 18 | "ERROR": "ผิดพลาด", 19 | "CANCEL": "ยกเลิก", 20 | "DISPLAY_UPPERCASE": "แสดงค่าแฮชเป็นตัวพิมพ์ใหญ่", 21 | "LOOK_FOR_SUMFILES": "มองหาไฟล์ซัมถัดจากไฟล์ที่กำลังแฮช", 22 | "SUMFILE_UPPERCASE": "ส่งออกแฮชเป็นตัวพิมพ์ใหญ่", 23 | "SUMFILE_UNIX_ENDINGS": "ส่งออกไฟล์ที่ลงท้ายด้วยบรรทัด Unix", 24 | "SUMFILE_USE_DOUBLE_SPACE": "ส่งออกไฟล์ซัมที่มีช่องว่างสองครั้งแทนการเว้นวรรคดอกจัน", 25 | "SUMFILE_FORWARD_SLASHES": "ใช้สแลชไปข้างหน้าในเส้นทางไฟล์ในไฟล์ที่ส่งออก", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "ส่งออกไฟล์ซัมในรูปแบบที่เข้ากันได้กับ corz .hash", 27 | "SUMFILE_BANNER": "เพิ่มแบนเนอร์ในไฟล์ที่ส่งออก", 28 | "SUMFILE_BANNER_DATE": "เพิ่มเวลาในแบนเนอร์", 29 | "CHECK_FOR_UPDATES": "ตรวจสอบอัพเดท", 30 | "COPY_HASH": "คลิปบอร์ดแฮช", 31 | "COPY_LINE": "คัดลอกบรรทัด", 32 | "COPY_FILE": "คัดลอกชื่อไฟล์", 33 | "COPY_EVERYTHING": "คัดลอกทั้งหมด", 34 | "VT_NO_COMPATIBLE": "ไม่ได้เปิดอัลกอริทึมที่เข้ากันได้", 35 | "VT_NOT_FOUND": "ไม่พบในฐานข้อมูล", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "ไม่พร้อมใช้งานในเวอร์ชันนี่", 37 | "UPDATE_AVAILABLE_TITLE": "มีอัปเดตใหม่", 38 | "UPDATE_AVAILABLE_TEXT": "มีเวอร์ชันใหม่ %hu.%hu.%hu", 39 | "UPDATE_NEWEST_TITLE": "ยินดีด้วย", 40 | "UPDATE_NEWEST_TEXT": "คุณใช้เวอร์ชันล่าสุดแล้ว", 41 | "CLIPBOARD_AUTOENABLE": "หากคลิปบอร์ดมีแฮช ให้เปิดใช้งานอัลกอริทึมของความยาวนั้นโดยอัตโนมัติ", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "เฉพาะในกรณีที่ไม่ได้เปิดใช้งานอัลกอริทึมของความยาวนั้น", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "ปิดใช้งานอัลกอริทึมอื่นๆ ทั้งหมด", 44 | "SETTINGS_TITLE": "การตั้งค่า", 45 | "CHECKAGAINST_AUTOFORMAT": "จัดรูปแบบแฮชที่วางใหม่ในฟิลด์ตรวจสอบโดยอัตโนมัติ", 46 | "CHECKAGAINST_STRICT": "โหมดเคร่งครัดสำหรับฟิลด์ตรวจสอบแฮช", 47 | "HASH_SUMFILE_TOO": "เมื่อประมวลผลไฟล์ซัมแฮชไฟล์ซัมด้วย", 48 | "ITEM_MATCHING": "พบ 1 ไฟล์", 49 | "ITEMS_MATCHING": "พบ %d ไฟล์", 50 | "SUMFILE_ALGORITHM_ONLY": "เมื่อประมวลผลไฟล์ซัมของอัลกอริทึมที่รู้จัก ให้ปิดใช้งานอัลกอริทึมอื่นๆ", 51 | "ERROR_GROUP": "ผิดพลาด", 52 | "MATCH_GROUP": "ตรงกัน", 53 | "MISMATCH_GROUP": "ไม่ตรงกัน", 54 | "INSECURE_GROUP": "ไม่ปลอดภัย", 55 | "UNKNOWN_GROUP": "ไม่ทราบ", 56 | "FOREGROUND": "พื้นหน้า", 57 | "BACKGROUND": "พื้นหลัง", 58 | "SUMMARY": "ข้อมูลสรุป", 59 | "DISPLAY_MONOSPACE": "แสดงค่าแฮชด้วยฟอนต์ monospace" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/tr-TR.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_TURKISH", 3 | "sublangid": "SUBLANG_TURKISH_TURKEY", 4 | "strings": { 5 | "FILENAME": "Dosya Adı", 6 | "ALGORITHM": "Algoritma", 7 | "COPIED": "✔ Kopyalandı", 8 | "HASH": "Sağlama Toplamı", 9 | "CHECK_AGAINST": "Karşılaştır:", 10 | "EXPORT_TO": "Sağlama Toplamı dosyasına çıkar:", 11 | "EXPORT_BTN": "Dışarı aktar…", 12 | "SUMFILE": "Sağlama toplamı dosyası düzenlendi.", 13 | "DONE": "Tamamlandı!", 14 | "PROCESSING": "İşleniyor…", 15 | "HASHES": "Sağlama Toplamları", 16 | "CLIPBOARD": "Panoya kopyala", 17 | "NOMATCH": "Eşleşme bulunamadı.", 18 | "ERROR": "Hata", 19 | "CANCEL": "İptal", 20 | "DISPLAY_UPPERCASE": "Sağlama toplamlarını büyük harf olarak göster", 21 | "LOOK_FOR_SUMFILES": "Hesaplanan dosyaların yanında dosyaya ait sağlama toplamı dosyalarını ara", 22 | "SUMFILE_UPPERCASE": "Sağlama toplamlarını büyük harf olarak ver", 23 | "SUMFILE_UNIX_ENDINGS": "Dosyaları Unix satır sonları ile dışa aktar", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Sağlama toplamlarını boşluk işareti yerine çift boşluk ile ver", 25 | "SUMFILE_FORWARD_SLASHES": "Dışa aktarılan dosyalarda eğik çizgi kullan", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Sağlama toplamı dosyalarını corz .hash uyumlu biçimde dışa aktar", 27 | "SUMFILE_BANNER": "Dışa aktarılan dosyalara bilgi ekle", 28 | "SUMFILE_BANNER_DATE": "Bilgiye tarih ekle", 29 | "CHECK_FOR_UPDATES": "Güncellemeleri denetle", 30 | "COPY_HASH": "Sağlama Toplamını kopyala", 31 | "COPY_LINE": "Satırı kopyala", 32 | "COPY_FILE": "Dosya adını kopyala", 33 | "COPY_EVERYTHING": "Her şeyi kopyala", 34 | "VT_NO_COMPATIBLE": "Uyumlu algoritma etkinleştirilmedi", 35 | "VT_NOT_FOUND": "Veri tabanında bulunamadı", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "Geliştirici sürümlerinde kullanılamaz", 37 | "UPDATE_AVAILABLE_TITLE": "Güncelleme mevcut", 38 | "UPDATE_AVAILABLE_TEXT": "Yeni sürüm %hu.%hu.%hu mevcut", 39 | "UPDATE_NEWEST_TITLE": "Tebrikler", 40 | "UPDATE_NEWEST_TEXT": "Zaten en son sürümü kullanıyorsunuz", 41 | "CLIPBOARD_AUTOENABLE": "Eğer panoda sağlama toplamı varsa, çalıştırmak için otomatik olarak o uzunluktaki algoritmaları etkinleştir", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Eğer o uzunlukta hiçbir algoritma etkinleştirilmemişse", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Diğer tüm algoritmaları devre dışı bırak", 44 | "SETTINGS_TITLE": "Ayarlar", 45 | "CHECKAGAINST_AUTOFORMAT": "Denetleyici alanına yapıştırılan sağlama toplamlarını otomatik olarak yeniden biçimlendir", 46 | "CHECKAGAINST_STRICT": "Sağlama toplamı denetleyici alanında katı mod", 47 | "HASH_SUMFILE_TOO": "Sağlama toplamı dosyası işlerken, sağlama toplamı dosyasının da sağlama toplamını oluştur", 48 | "ITEM_MATCHING": "1 eşleşen dosya", 49 | "ITEMS_MATCHING": "%d eşleşen dosya", 50 | "SUMFILE_ALGORITHM_ONLY": "Algoritması bilinen bir sağlama toplamı dosyasını işlerken, diğer algoritmaları devre dışı bırak", 51 | "ERROR_GROUP": "Hata", 52 | "MATCH_GROUP": "Eşleşen", 53 | "INSECURE_GROUP": "Güvensiz", 54 | "FOREGROUND": "Vurgu", 55 | "BACKGROUND": "Arka plan", 56 | "MISMATCH_GROUP": "Eşleşmeyen", 57 | "UNKNOWN_GROUP": "Bilinmeyen", 58 | "DISPLAY_MONOSPACE": "Sağlama toplamlarını monospace font ile göster", 59 | "SUMMARY": "Özet" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/uk-UA.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_UKRAINIAN", 3 | "sublangid": "SUBLANG_UKRAINIAN_UKRAINE", 4 | "strings": { 5 | "FILENAME": "Ім'я", 6 | "ALGORITHM": "Алгоритм", 7 | "COPIED": "✔ Скопійовано", 8 | "HASH": "Хеш", 9 | "CHECK_AGAINST": "Порівняти з:", 10 | "EXPORT_TO": "Експортувати як файл:", 11 | "EXPORT_BTN": "Експортувати…", 12 | "SUMFILE": "Цей підсумковий файл.", 13 | "DONE": "Готово!", 14 | "PROCESSING": "Обробка…", 15 | "HASHES": "Хеши", 16 | "CLIPBOARD": "У буфер", 17 | "NOMATCH": "Збігів не знайдено.", 18 | "ERROR": "Помилка", 19 | "CANCEL": "Скасувати", 20 | "DISPLAY_UPPERCASE": "Відображати хеши великими літерами", 21 | "LOOK_FOR_SUMFILES": "Пошук хеш-файлів поруч із оброблювальними файлами", 22 | "SUMFILE_UPPERCASE": "Екпортувати хеши великими літерами", 23 | "SUMFILE_UNIX_ENDINGS": "Експортувати хеш-файли із закінченням рядків у Unix-форматі", 24 | "SUMFILE_USE_DOUBLE_SPACE": "Експорт хеш-файлів з двома пробілами замість пробілу зі зірочкою", 25 | "SUMFILE_FORWARD_SLASHES": "Використовувати скісну риску для шляху при експортуванні файлів", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "Експорт хеш-файлів у форматі corz .hash", 27 | "SUMFILE_BANNER": "Додати заголовок у експортовані файли", 28 | "SUMFILE_BANNER_DATE": "Додати дату до заголовка", 29 | "CHECK_FOR_UPDATES": "Перевірити наявність оновлень", 30 | "COPY_HASH": "Копіювати хеш", 31 | "COPY_LINE": "Копіювати рядок", 32 | "COPY_FILE": "Копіювати назву файлу", 33 | "COPY_EVERYTHING": "Копіювати все", 34 | "VT_NO_COMPATIBLE": "Не ввімкнений відповідний алгоритм", 35 | "VT_NOT_FOUND": "Не знайдено в базі даних", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "Недоступно у тестовій збірці", 37 | "UPDATE_AVAILABLE_TITLE": "Доступне оновлення", 38 | "UPDATE_AVAILABLE_TEXT": "Доступна нова версія: %hu.%hu.%hu", 39 | "UPDATE_NEWEST_TITLE": "Вітаємо", 40 | "UPDATE_NEWEST_TEXT": "Ви використовуєте останню версію", 41 | "CLIPBOARD_AUTOENABLE": "За наявності хеша в буфері обміну автоматично вмикати алгоритми відповідної довжини", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "Тільки якщо не ввімкнені інші алгоритми такої ж довжинии", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "Вимкнути всі інші алгоритми", 44 | "SETTINGS_TITLE": "Налаштування", 45 | "CHECKAGAINST_AUTOFORMAT": "Автоматично переформатовувати вставлені хеші в поле перевірки", 46 | "CHECKAGAINST_STRICT": "Суворий режим у полі перевірки хешу", 47 | "HASH_SUMFILE_TOO": "Додатково обчислювати хеш хеш-файлів під час їх обробки", 48 | "ITEM_MATCHING": "1 відповідний файл", 49 | "ITEMS_MATCHING": "%d відповідних файлів", 50 | "SUMFILE_ALGORITHM_ONLY": "При обробці хеш-файлів вимкнути інші алгоритми", 51 | "ERROR_GROUP": "Помилка", 52 | "MISMATCH_GROUP": "Невідповідність", 53 | "INSECURE_GROUP": "Небезпека", 54 | "UNKNOWN_GROUP": "Невідоме", 55 | "BACKGROUND": "Колір фону", 56 | "MATCH_GROUP": "Відповідність", 57 | "FOREGROUND": "Колір тексту", 58 | "DISPLAY_MONOSPACE": "Відображати хеши моноширинним шрифтом", 59 | "SUMMARY": "Звіт" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/zh-CN.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_CHINESE", 3 | "sublangid": "SUBLANG_CHINESE_SIMPLIFIED", 4 | "strings": { 5 | "FILENAME": "文件名", 6 | "ALGORITHM": "算法", 7 | "COPIED": "✔ 已复制", 8 | "HASH": "哈希", 9 | "CHECK_AGAINST": "校验:", 10 | "EXPORT_TO": "导出为校验和文件:", 11 | "EXPORT_BTN": "导出…", 12 | "SUMFILE": "已解释为校验和文件。", 13 | "DONE": "完成!", 14 | "PROCESSING": "正在处理…", 15 | "HASHES": "哈希信息", 16 | "CLIPBOARD": "复制到剪贴板", 17 | "NOMATCH": "未找到匹配项。", 18 | "ERROR": "错误", 19 | "SUMFILE_BANNER_DATE": "在标题行中加入日期", 20 | "SUMFILE_BANNER": "在导出的文件中加入标题行", 21 | "UPDATE_NEWEST_TITLE": "恭喜", 22 | "UPDATE_DISABLED_IN_DEV_BUILD": "开发版不支持检查更新", 23 | "UPDATE_NEWEST_TEXT": "您已使用最新版", 24 | "UPDATE_AVAILABLE_TEXT": "发现新版本 %hu.%hu.%hu", 25 | "UPDATE_AVAILABLE_TITLE": "更新可用", 26 | "VT_NOT_FOUND": "数据库中未找到", 27 | "VT_NO_COMPATIBLE": "未启用兼容的算法", 28 | "COPY_EVERYTHING": "复制全部", 29 | "COPY_FILE": "复制文件名", 30 | "COPY_LINE": "复制整行", 31 | "COPY_HASH": "复制哈希值", 32 | "CHECK_FOR_UPDATES": "检查更新", 33 | "SUMFILE_DOT_HASH_COMPATIBLE": "将校验和文件导出为 corz .hash 兼容性格式", 34 | "SUMFILE_FORWARD_SLASHES": "在导出的文件中使用正斜杠", 35 | "SUMFILE_USE_DOUBLE_SPACE": "导出校验和文件时使用双空格而非空格加星号", 36 | "SUMFILE_UNIX_ENDINGS": "文件以 Unix 换行符导出", 37 | "SUMFILE_UPPERCASE": "哈希导出为大写字母", 38 | "LOOK_FOR_SUMFILES": "寻找与被校验文件相邻的校验和文件", 39 | "DISPLAY_UPPERCASE": "哈希显示为大写字母", 40 | "CANCEL": "取消", 41 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "禁用所有其他算法", 42 | "CLIPBOARD_AUTOENABLE_IF_NONE": "仅当符合哈希值长度的算法没有选中时", 43 | "CLIPBOARD_AUTOENABLE": "如果剪贴板包含哈希,则自动启用符合该哈希长度的算法", 44 | "CHECKAGAINST_AUTOFORMAT": "在 Hash 检查器中自动重新格式化粘贴的 Hash 值", 45 | "CHECKAGAINST_STRICT": "为 Hash 检查器启用严格模式", 46 | "HASH_SUMFILE_TOO": "在处理 Hash 文件时,也对校验文件进行 Hash 处理", 47 | "SUMFILE_ALGORITHM_ONLY": "确定 Hash 文件的算法后,不再尝试其他算法", 48 | "ITEMS_MATCHING": "%d 个匹配文件", 49 | "ITEM_MATCHING": "1个匹配文件", 50 | "SETTINGS_TITLE": "设置", 51 | "MISMATCH_GROUP": "不匹配", 52 | "INSECURE_GROUP": "不安全", 53 | "UNKNOWN_GROUP": "未知", 54 | "FOREGROUND": "前景", 55 | "BACKGROUND": "背景", 56 | "MATCH_GROUP": "匹配", 57 | "ERROR_GROUP": "错误", 58 | "DISPLAY_MONOSPACE": "使用等宽字体显示哈希", 59 | "SUMMARY": "总述" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Localization/zh-TW.json: -------------------------------------------------------------------------------- 1 | { 2 | "langid": "LANG_CHINESE", 3 | "sublangid": "SUBLANG_CHINESE_TRADITIONAL", 4 | "strings": { 5 | "FILENAME": "檔案名稱", 6 | "ALGORITHM": "演算法", 7 | "COPIED": "✔ 已複製", 8 | "HASH": "雜湊值", 9 | "CHECK_AGAINST": "核對:", 10 | "EXPORT_TO": "匯出為雜湊值驗證檔:", 11 | "EXPORT_BTN": "匯出…", 12 | "SUMFILE": "已判定為雜湊值驗證檔。", 13 | "DONE": "完成!", 14 | "PROCESSING": "處理中…", 15 | "HASHES": "雜湊值", 16 | "CLIPBOARD": "到剪貼簿", 17 | "NOMATCH": "未發現符合項目。", 18 | "ERROR": "錯誤", 19 | "CANCEL": "取消", 20 | "DISPLAY_UPPERCASE": "以大寫字母顯示雜湊值", 21 | "LOOK_FOR_SUMFILES": "搜尋與被核對檔案相鄰的雜湊值驗證檔檔案", 22 | "SUMFILE_UPPERCASE": "以大寫字母匯出雜湊值", 23 | "SUMFILE_UNIX_ENDINGS": "匯出檔案使用 Unix 行結尾", 24 | "SUMFILE_USE_DOUBLE_SPACE": "匯出核對和檔案時使用雙空格而非空格與星號", 25 | "SUMFILE_FORWARD_SLASHES": "匯出檔案中使用正斜線", 26 | "SUMFILE_DOT_HASH_COMPATIBLE": "將雜湊值驗證檔匯出為與 corz .hash 相容的檔案", 27 | "SUMFILE_BANNER": "匯出檔案中加入標註", 28 | "SUMFILE_BANNER_DATE": "日期加入標註", 29 | "CHECK_FOR_UPDATES": "檢查更新", 30 | "COPY_HASH": "複製雜湊值", 31 | "COPY_LINE": "複製整行", 32 | "COPY_FILE": "複製檔案名稱", 33 | "COPY_EVERYTHING": "複製全部", 34 | "VT_NO_COMPATIBLE": "未啟用相容演算法", 35 | "VT_NOT_FOUND": "資料庫中未尋得", 36 | "UPDATE_DISABLED_IN_DEV_BUILD": "無法於開發建構版中使用", 37 | "UPDATE_AVAILABLE_TITLE": "更新可用", 38 | "UPDATE_AVAILABLE_TEXT": "新版本 %hu.%hu.%hu 可用", 39 | "UPDATE_NEWEST_TITLE": "恭喜", 40 | "UPDATE_NEWEST_TEXT": "您已使用最新版", 41 | "CLIPBOARD_AUTOENABLE_IF_NONE": "僅用於沒有啟用與該長度相符之演算法時", 42 | "CLIPBOARD_AUTOENABLE": "如果剪貼簿內含雜湊值,自動啟用符合長度的演算法進行核對", 43 | "CLIPBOARD_AUTOENABLE_EXCLUSIVE": "停用所有其他演算法", 44 | "SETTINGS_TITLE": "設定", 45 | "CHECKAGAINST_AUTOFORMAT": "在雜湊值校驗器中自動重新格式化貼上的雜湊值", 46 | "CHECKAGAINST_STRICT": "為雜湊值校驗器啟用嚴格模式", 47 | "ITEMS_MATCHING": "%d 個符合檔案", 48 | "SUMFILE_ALGORITHM_ONLY": "確定雜湊值檔案的演算法後,不再嘗試其他演算法", 49 | "HASH_SUMFILE_TOO": "在處理雜湊值檔案時,也對雜湊值驗證檔進行雜湊值演算", 50 | "ITEM_MATCHING": "1 個符合檔案", 51 | "INSECURE_GROUP": "不安全", 52 | "FOREGROUND": "前景", 53 | "BACKGROUND": "背景", 54 | "ERROR_GROUP": "錯誤", 55 | "MATCH_GROUP": "符合", 56 | "MISMATCH_GROUP": "不符", 57 | "UNKNOWN_GROUP": "未知", 58 | "DISPLAY_MONOSPACE": "以等寬字體顯示雜湊值", 59 | "SUMMARY": "總結" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /OpenHashTab/.clang-format: -------------------------------------------------------------------------------- 1 | BasedOnStyle: LLVM 2 | AccessModifierOffset: -2 3 | AlignAfterOpenBracket: BlockIndent 4 | AlignArrayOfStructures: Right 5 | AlignConsecutiveAssignments: None 6 | AlignConsecutiveBitFields: AcrossEmptyLinesAndComments 7 | AlignConsecutiveMacros: Consecutive 8 | AlignEscapedNewlines: Left 9 | AlignOperands: Align 10 | AlignTrailingComments: true 11 | AllowAllArgumentsOnNextLine: false 12 | AllowAllConstructorInitializersOnNextLine: false 13 | AllowAllParametersOfDeclarationOnNextLine: false 14 | AllowShortBlocksOnASingleLine: Always 15 | AllowShortCaseLabelsOnASingleLine: false 16 | AllowShortFunctionsOnASingleLine: Inline 17 | AllowShortIfStatementsOnASingleLine: Never 18 | AllowShortLambdasOnASingleLine: All 19 | AllowShortLoopsOnASingleLine: false 20 | AlwaysBreakAfterReturnType: None 21 | AlwaysBreakBeforeMultilineStrings: true 22 | AlwaysBreakTemplateDeclarations: MultiLine 23 | BinPackArguments: false 24 | BinPackParameters: false 25 | BitFieldColonSpacing: Before 26 | BreakBeforeBraces: Custom 27 | BraceWrapping: 28 | AfterCaseLabel: false 29 | AfterClass: false 30 | AfterControlStatement: Never 31 | AfterEnum: false 32 | AfterFunction: false 33 | AfterNamespace: false 34 | AfterStruct: false 35 | AfterUnion: false 36 | AfterExternBlock: false 37 | BeforeCatch: false 38 | BeforeElse: false 39 | BeforeLambdaBody: false 40 | BeforeWhile: false 41 | IndentBraces: false 42 | SplitEmptyFunction: false 43 | SplitEmptyRecord: false 44 | SplitEmptyNamespace: false 45 | BreakBeforeBinaryOperators: NonAssignment 46 | BreakBeforeConceptDeclarations: Allowed 47 | BreakBeforeTernaryOperators: true 48 | BreakConstructorInitializers: BeforeComma 49 | BreakInheritanceList: BeforeComma 50 | BreakStringLiterals: false 51 | ColumnLimit: 0 52 | CompactNamespaces: false 53 | ContinuationIndentWidth: 2 54 | EmptyLineAfterAccessModifier: Never 55 | EmptyLineBeforeAccessModifier: Always 56 | FixNamespaceComments: true 57 | IncludeBlocks: Preserve 58 | IndentAccessModifiers: false 59 | IndentCaseLabels: false 60 | IndentExternBlock: NoIndent 61 | IndentGotoLabels: false 62 | IndentPPDirectives: None 63 | IndentWidth: 2 64 | IndentWrappedFunctionNames: false 65 | InsertTrailingCommas: Wrapped 66 | KeepEmptyLinesAtTheStartOfBlocks: false 67 | LambdaBodyIndentation: Signature 68 | MaxEmptyLinesToKeep: 2 69 | NamespaceIndentation: All 70 | PackConstructorInitializers: CurrentLine 71 | PointerAlignment: Left 72 | QualifierAlignment: Custom 73 | QualifierOrder: [ 'inline', 'static', 'constexpr', 'const', 'volatile', 'type', 'restrict' ] 74 | ReferenceAlignment: Left 75 | ReflowComments: false 76 | RequiresClausePosition: OwnLine 77 | SeparateDefinitionBlocks: Always 78 | ShortNamespaceLines: 10 79 | SortIncludes: CaseInsensitive 80 | SortUsingDeclarations: true 81 | SpaceAfterCStyleCast: false 82 | SpaceAfterLogicalNot: false 83 | SpaceAfterTemplateKeyword: true 84 | SpaceBeforeAssignmentOperators: true 85 | SpaceBeforeCpp11BracedList: false 86 | SpaceBeforeCtorInitializerColon: true 87 | SpaceBeforeInheritanceColon: true 88 | SpaceBeforeParens: ControlStatements 89 | SpaceBeforeRangeBasedForLoopColon: true 90 | SpaceBeforeSquareBrackets: false 91 | SpaceInEmptyBlock: false 92 | SpaceInEmptyParentheses: false 93 | SpacesBeforeTrailingComments: 1 94 | SpacesInAngles: false 95 | SpacesInCStyleCastParentheses: false 96 | SpacesInConditionalStatement: false 97 | SpacesInContainerLiterals: false 98 | SpacesInLineCommentPrefix: 99 | Minimum: 1 100 | Maximum: -1 101 | SpacesInParentheses: false 102 | SpacesInSquareBrackets: false 103 | Standard: c++20 104 | TabWidth: 2 105 | UseTab: Never 106 | -------------------------------------------------------------------------------- /OpenHashTab/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2019-2025 namazso 2 | # This file is part of OpenHashTab. 3 | # 4 | # OpenHashTab is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # OpenHashTab is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with OpenHashTab. If not, see . 16 | 17 | cmake_minimum_required(VERSION 3.14) 18 | 19 | project(ShellExtension) 20 | 21 | file(GLOB FILES CONFIGURE_DEPENDS *.cpp *.rc *.manifest) 22 | 23 | add_library(OpenHashTab SHARED ${FILES}) 24 | 25 | target_link_libraries(OpenHashTab PRIVATE 26 | Localization 27 | LegacyAlgorithms 28 | ctre 29 | concurrentqueue 30 | tiny-json 31 | ntdll.lib 32 | winhttp.lib 33 | ) 34 | 35 | target_compile_definitions(OpenHashTab PRIVATE 36 | UNICODE 37 | _UNICODE 38 | _WINDLL 39 | "CI_VERSION=\"${CI_VERSION}\"" 40 | "CI_VERSION_MAJOR=${CI_VERSION_MAJOR}" 41 | "CI_VERSION_MINOR=${CI_VERSION_MINOR}" 42 | "CI_VERSION_PATCH=${CI_VERSION_PATCH}" 43 | ) 44 | 45 | target_compile_options(OpenHashTab PRIVATE 46 | /EHsc 47 | ) 48 | 49 | target_link_options(OpenHashTab PRIVATE 50 | /EXPORT:DllCanUnloadNow 51 | /EXPORT:DllGetClassObject 52 | /DELAYLOAD:winhttp.dll 53 | ) 54 | 55 | target_precompile_headers(OpenHashTab PRIVATE stdafx.h) 56 | 57 | add_custom_command(TARGET OpenHashTab POST_BUILD 58 | COMMAND ${CMAKE_COMMAND} -E copy $ $ 59 | COMMAND_EXPAND_LISTS 60 | ) 61 | -------------------------------------------------------------------------------- /OpenHashTab/Coordinator.h: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #pragma once 17 | #include "path.h" 18 | #include "Settings.h" 19 | 20 | class FileHashTask; 21 | 22 | class Coordinator { 23 | public: 24 | static constexpr auto k_progress_resolution = 256u; 25 | 26 | private: 27 | std::list _files_raw; 28 | ProcessedFileList _files{}; 29 | HWND _window{}; 30 | uint64_t _size_total{}; 31 | std::atomic _size_progressed{}; 32 | std::list> _file_tasks; 33 | std::mutex _window_mutex{}; 34 | std::atomic _references{}; 35 | std::atomic _files_not_finished{}; 36 | bool _is_sumfile{}; 37 | 38 | void AddFile(const std::wstring& path, const ProcessedFileList::FileInfo& fi); 39 | 40 | public: 41 | Coordinator(std::list files); 42 | virtual ~Coordinator(); 43 | 44 | virtual void RegisterWindow(HWND window); 45 | virtual void UnregisterWindow(); 46 | 47 | unsigned Reference(); 48 | unsigned Dereference(); 49 | 50 | void AddFiles(); 51 | void ProcessFiles(); 52 | void Cancel(bool wait = true); 53 | void FileCompletionCallback(FileHashTask* file); 54 | void FileProgressCallback(uint64_t size_progress); 55 | 56 | // The window should probably only inspect files before processing or after all are done 57 | const std::list>& GetFiles() const { return _file_tasks; } 58 | 59 | bool IsSumfile() const { return _is_sumfile; } 60 | 61 | std::pair GetSumfileDefaultSavePathAndBaseName(); 62 | 63 | Settings settings; 64 | }; 65 | 66 | class PropPageCoordinator : public Coordinator { 67 | public: 68 | using Coordinator::Coordinator; 69 | ~PropPageCoordinator() override = default; 70 | 71 | void AddRef(HWND, LPPROPSHEETPAGEW) {} 72 | 73 | UINT Create(HWND, LPPROPSHEETPAGEW) { return 1; } 74 | 75 | void Release(HWND, LPPROPSHEETPAGEW) { delete this; } 76 | }; 77 | 78 | class StandaloneCoordinator : public Coordinator { 79 | public: 80 | using Coordinator::Coordinator; 81 | ~StandaloneCoordinator() override = default; 82 | 83 | void UnregisterWindow() override { 84 | Coordinator::UnregisterWindow(); 85 | PostQuitMessage(0); 86 | } 87 | }; 88 | 89 | class WindowedCoordinator : public Coordinator { 90 | public: 91 | using Coordinator::Coordinator; 92 | ~WindowedCoordinator() override = default; 93 | 94 | void UnregisterWindow() override { 95 | Coordinator::UnregisterWindow(); 96 | delete this; 97 | } 98 | }; 99 | -------------------------------------------------------------------------------- /OpenHashTab/Exporter.h: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #pragma once 17 | #include 18 | 19 | class FileHashTask; 20 | struct Settings; 21 | 22 | class Exporter { 23 | protected: 24 | ~Exporter() = default; 25 | 26 | constexpr Exporter() = default; 27 | 28 | public: 29 | [[nodiscard]] virtual const char* GetName() const = 0; 30 | [[nodiscard]] virtual const char* GetExtension() const = 0; 31 | virtual bool IsEnabled(Settings* settings) const = 0; 32 | virtual std::string GetExportString( 33 | Settings* settings, 34 | bool for_clipboard, 35 | const std::list& files 36 | ) const = 0; 37 | 38 | static constexpr auto k_count = LegacyHashAlgorithm::k_count + 2; 39 | static const std::array k_exporters; 40 | }; 41 | -------------------------------------------------------------------------------- /OpenHashTab/MainDialog.h: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #pragma once 17 | #include "hash_colors.h" 18 | #include "utl.h" 19 | #include "wnd.h" 20 | 21 | class Exporter; 22 | class FileHashTask; 23 | class Coordinator; 24 | 25 | class MainDialog { 26 | static constexpr auto k_status_update_timer_id = (UINT_PTR)0x7c253816f7ef92ea; 27 | 28 | enum ColIndex : int { 29 | ColIndex_Filename, 30 | ColIndex_Algorithm, 31 | ColIndex_Hash 32 | }; 33 | 34 | HWND _hwnd{}; 35 | utl::UniqueFont _font{utl::GetDPIScaledFont()}; 36 | utl::UniqueFont _mono_font{utl::GetDPIScaledFont(L"Lucida Console")}; 37 | Coordinator* _prop_page; 38 | wnd::WindowLayoutAdapter _adapter{_hwnd, IDD_OPENHASHTAB_PROPPAGE}; 39 | 40 | MAKE_IDC_MEMBER(_hwnd, HASH_LIST); 41 | MAKE_IDC_MEMBER(_hwnd, EDIT_HASH); 42 | MAKE_IDC_MEMBER(_hwnd, COMBO_EXPORT); 43 | MAKE_IDC_MEMBER(_hwnd, BUTTON_EXPORT); 44 | MAKE_IDC_MEMBER(_hwnd, STATIC_CHECK_AGAINST); 45 | MAKE_IDC_MEMBER(_hwnd, STATIC_EXPORT_TO); 46 | MAKE_IDC_MEMBER(_hwnd, STATIC_CHECK_RESULT); 47 | MAKE_IDC_MEMBER(_hwnd, STATIC_SUMFILE); 48 | MAKE_IDC_MEMBER(_hwnd, STATIC_PROCESSING); 49 | MAKE_IDC_MEMBER(_hwnd, BUTTON_CLIPBOARD); 50 | MAKE_IDC_MEMBER(_hwnd, BUTTON_SETTINGS); 51 | MAKE_IDC_MEMBER(_hwnd, BUTTON_CANCEL); 52 | MAKE_IDC_MEMBER(_hwnd, ALGORITHM_LIST); 53 | MAKE_IDC_MEMBER(_hwnd, PROGRESS); 54 | MAKE_IDC_MEMBER(_hwnd, BUTTON_VT); 55 | MAKE_IDC_MEMBER(_hwnd, BUTTON_SUMMARY); 56 | 57 | unsigned _count_error{}; 58 | unsigned _count_match{}; 59 | unsigned _count_mismatch{}; 60 | unsigned _count_unknown{}; 61 | 62 | ColIndex _last_sort_col = ColIndex_Filename; 63 | bool _last_sort_asc = false; 64 | 65 | bool _temporary_status{}; 66 | bool _finished{}; 67 | // volatile because reentrancy, and clang-tidy doesn't recognize that 68 | volatile bool _inhibit_reformat{}; 69 | HashColorType _check_against_color{HashColorType::Unknown}; 70 | utl::UniqueBrush _check_against_brush{}; 71 | 72 | static INT_PTR CustomDrawListView(LPARAM lparam, HWND list); 73 | 74 | std::string GetSumfileAsString(const Exporter* exporter, bool for_clipboard); 75 | void AddItemToFileList(LPCWSTR filename, LPCWSTR algorithm, LPCWSTR hash, LPARAM lparam); 76 | void SetTempStatus(LPCWSTR status, UINT time); 77 | void UpdateDefaultStatus(bool force_reset = false); 78 | 79 | void ListDoubleClick(int item, int subitem); 80 | void ListPopupMenu(POINT pt); 81 | void ListSort(ColIndex col, bool desc); 82 | 83 | void FileFinished(FileHashTask* file); 84 | 85 | public: 86 | MainDialog(HWND hwnd, void* prop_page); 87 | ~MainDialog(); 88 | 89 | INT_PTR DlgProc(UINT msg, WPARAM wparam, LPARAM lparam); 90 | 91 | private: 92 | INT_PTR OnInitDialog(UINT, WPARAM, LPARAM); 93 | INT_PTR OnAllFilesFinished(UINT, WPARAM, LPARAM); 94 | INT_PTR OnFileProgress(UINT, WPARAM, LPARAM lparam); 95 | INT_PTR OnStatusUpdateTimer(UINT, WPARAM, LPARAM); 96 | INT_PTR OnHashListNotify(UINT, WPARAM, LPARAM lparam); 97 | INT_PTR OnExportClicked(UINT, WPARAM, LPARAM); 98 | INT_PTR OnCancelClicked(UINT, WPARAM, LPARAM); 99 | INT_PTR OnVTClicked(UINT, WPARAM, LPARAM); 100 | INT_PTR OnSummaryClicked(UINT, WPARAM, LPARAM); 101 | INT_PTR OnClose(UINT, WPARAM, LPARAM); 102 | INT_PTR OnNeedAdjust(UINT, WPARAM, LPARAM); 103 | INT_PTR OnHashEditChanged(UINT, WPARAM, LPARAM); 104 | INT_PTR OnEditColor(UINT, WPARAM, LPARAM); 105 | INT_PTR OnClipboardClicked(UINT, WPARAM, LPARAM); 106 | INT_PTR OnSettingsClicked(UINT, WPARAM, LPARAM); 107 | }; 108 | -------------------------------------------------------------------------------- /OpenHashTab/Queues.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #include "Queues.h" 17 | 18 | moodycamel::ConcurrentQueue g_read_queue; 19 | -------------------------------------------------------------------------------- /OpenHashTab/Queues.h: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #pragma once 17 | 18 | 19 | #pragma clang diagnostic push 20 | #pragma clang diagnostic ignored "-Wall" 21 | #pragma clang diagnostic ignored "-Wsuggest-destructor-override" 22 | #pragma clang diagnostic ignored "-Wsign-conversion" 23 | #include 24 | #pragma clang diagnostic pop 25 | 26 | 27 | class FileHashTask; 28 | 29 | extern moodycamel::ConcurrentQueue g_read_queue; 30 | -------------------------------------------------------------------------------- /OpenHashTab/Settings.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #include "Settings.h" 17 | 18 | #include "utl.h" 19 | 20 | static constexpr auto k_reg_path = L"Software\\OpenHashTab"; 21 | 22 | DWORD detail::GetMachineSettingDWORD(const char* name, DWORD default_value) { 23 | DWORD value; 24 | DWORD size = sizeof(value); 25 | const auto status = RegGetValueW( 26 | HKEY_LOCAL_MACHINE, 27 | k_reg_path, 28 | utl::UTF8ToWide(name).c_str(), 29 | RRF_RT_REG_DWORD, 30 | nullptr, 31 | &value, 32 | &size 33 | ); 34 | return status == ERROR_SUCCESS ? value : default_value; 35 | } 36 | 37 | DWORD detail::GetSettingDWORD(const char* name, DWORD default_value) { 38 | DWORD value; 39 | DWORD size = sizeof(value); 40 | const auto status = RegGetValueW( 41 | HKEY_CURRENT_USER, 42 | k_reg_path, 43 | utl::UTF8ToWide(name).c_str(), 44 | RRF_RT_REG_DWORD, 45 | nullptr, 46 | &value, 47 | &size 48 | ); 49 | return status == ERROR_SUCCESS ? value : default_value; 50 | } 51 | 52 | void detail::SetSettingDWORD(const char* name, DWORD new_value) { 53 | RegSetKeyValueW( 54 | HKEY_CURRENT_USER, 55 | k_reg_path, 56 | utl::UTF8ToWide(name).c_str(), 57 | REG_DWORD, 58 | &new_value, 59 | sizeof(new_value) 60 | ); 61 | } 62 | 63 | Settings::Settings() { 64 | bool defaults[LegacyHashAlgorithm::k_count]{}; 65 | for (const auto name : {"MD5", "SHA-1", "SHA-256", "SHA-512"}) 66 | defaults[LegacyHashAlgorithm::IdxByName(name)] = true; 67 | for (auto i = 0u; i < LegacyHashAlgorithm::k_count; ++i) 68 | algorithms[i].Init(LegacyHashAlgorithm::Algorithms()[i].GetName(), defaults[i]); 69 | } 70 | -------------------------------------------------------------------------------- /OpenHashTab/SettingsDialog.h: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #pragma once 17 | 18 | #include "hash_colors.h" 19 | #include "wnd.h" 20 | 21 | struct Settings; 22 | 23 | class SettingsDialog { 24 | HWND _hwnd; 25 | 26 | MAKE_IDC_MEMBER(_hwnd, BUTTON_CHECK_FOR_UPDATES); 27 | MAKE_IDC_MEMBER(_hwnd, ALGORITHM_LIST); 28 | 29 | MAKE_IDC_MEMBER(_hwnd, CHECK_SUMFILE_BANNER); 30 | MAKE_IDC_MEMBER(_hwnd, CHECK_SUMFILE_BANNER_DATE); 31 | 32 | MAKE_IDC_MEMBER(_hwnd, CHECK_CLIPBOARD_AUTOENABLE); 33 | MAKE_IDC_MEMBER(_hwnd, CHECK_CLIPBOARD_AUTOENABLE_IF_NONE); 34 | MAKE_IDC_MEMBER(_hwnd, CHECK_CLIPBOARD_AUTOENABLE_EXCLUSIVE); 35 | 36 | MAKE_IDC_MEMBER(_hwnd, PROJECT_NAME); 37 | 38 | HWND _samples[std::size(HASH_COLOR_SETTING_MAP)]{}; 39 | 40 | Settings* _settings; 41 | utl::UniqueFont _font{utl::GetDPIScaledFont()}; 42 | bool _done_setup = false; 43 | 44 | void UpdateCheckboxAvailability(); 45 | void UpdateColorItems(); 46 | 47 | public: 48 | SettingsDialog(HWND handle, void* settings) 49 | : _hwnd(handle) 50 | , _settings((Settings*)settings) { 51 | for (size_t i = 0; i < std::size(HASH_COLOR_SETTING_MAP); ++i) 52 | _samples[i] = GetDlgItem(_hwnd, HASH_COLOR_SETTING_MAP[i].settings_dlg_sample); 53 | } 54 | 55 | INT_PTR DlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam); 56 | }; 57 | -------------------------------------------------------------------------------- /OpenHashTab/Standalone.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #include "Coordinator.h" 17 | #include "MainDialog.h" 18 | #include "path.h" 19 | #include "utl.h" 20 | 21 | // rundll32 OpenHashTab.dll,StandaloneEntry 22 | extern "C" __declspec(dllexport) int APIENTRY StandaloneEntryW( 23 | _In_opt_ HWND hWnd, 24 | _In_ HINSTANCE hRunDLLInstance, 25 | _In_ LPCWSTR lpCmdLine, 26 | _In_ int nShowCmd 27 | ) { 28 | UNREFERENCED_PARAMETER(hWnd); 29 | UNREFERENCED_PARAMETER(hRunDLLInstance); 30 | 31 | auto argc = 0; 32 | const auto argv = CommandLineToArgvW(lpCmdLine, &argc); 33 | const std::list files{argv, argv + argc}; 34 | LocalFree(argv); 35 | 36 | if (files.empty()) 37 | return 0; 38 | 39 | // TODO: Support per monitor / v2 DPI awareness too 40 | SetProcessDPIAware(); 41 | 42 | INITCOMMONCONTROLSEX iccex{ 43 | sizeof(INITCOMMONCONTROLSEX), 44 | ICC_WIN95_CLASSES | ICC_LINK_CLASS}; 45 | InitCommonControlsEx(&iccex); 46 | 47 | const auto coordinator = new StandaloneCoordinator(files); 48 | 49 | const auto dialog = wnd::CreateDialogFromChildDialogResourceParam( 50 | utl::GetInstance(), 51 | MAKEINTRESOURCEW(IDD_OPENHASHTAB_PROPPAGE), 52 | hWnd, 53 | &wnd::DlgProcClassBinder, 54 | reinterpret_cast(coordinator) 55 | ); 56 | ShowWindow(dialog, nShowCmd); 57 | 58 | MSG msg; 59 | 60 | // Main message loop: 61 | while (GetMessageW(&msg, nullptr, 0, 0)) { 62 | if (!IsDialogMessageW(dialog, &msg)) { 63 | TranslateMessage(&msg); 64 | DispatchMessageW(&msg); 65 | } 66 | } 67 | 68 | // this will wait for hash tasks to gracefully terminate. 69 | // should we maybe just kill ourselves with ExitProcess 70 | // and let the OS do the cleanup? 71 | delete coordinator; 72 | 73 | return (int)msg.wParam; 74 | } 75 | -------------------------------------------------------------------------------- /OpenHashTab/SumFileParser.h: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #pragma once 17 | 18 | using FileSum = std::pair>; 19 | using FileSumList = std::list; 20 | DWORD TryParseSumFile(HANDLE h, FileSumList& output); 21 | -------------------------------------------------------------------------------- /OpenHashTab/additional.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | true 18 | true 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /OpenHashTab/base64.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #include "base64.h" 17 | 18 | // clang-format off 19 | static const char encode_table[64]{ 20 | 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 21 | 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 22 | 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' 23 | }; 24 | 25 | // clang-format on 26 | 27 | std::string b64::encode(const uint8_t* src, size_t len) { 28 | const auto olen = 4 * ((len + 2) / 3); 29 | 30 | std::string str; 31 | str.resize(olen); 32 | 33 | const auto begin = src; 34 | const auto end = begin + len; 35 | auto it = begin; 36 | auto out = str.begin(); 37 | while (end - it >= 3) { 38 | *out++ = encode_table[it[0] >> 2]; 39 | *out++ = encode_table[((it[0] & 0x03) << 4) | (it[1] >> 4)]; 40 | *out++ = encode_table[((it[1] & 0x0f) << 2) | (it[2] >> 6)]; 41 | *out++ = encode_table[it[2] & 0x3f]; 42 | it += 3; 43 | } 44 | 45 | if (end - it) { 46 | *out++ = encode_table[it[0] >> 2]; 47 | if (end - it == 1) { 48 | *out++ = encode_table[(it[0] & 0x03) << 4]; 49 | *out++ = '='; 50 | } else { 51 | *out++ = encode_table[((it[0] & 0x03) << 4) | (it[1] >> 4)]; 52 | *out++ = encode_table[(it[1] & 0x0f) << 2]; 53 | } 54 | *out = '='; 55 | } 56 | 57 | return str; 58 | } 59 | 60 | // clang-format off 61 | static const uint32_t decode_table[256] = { 62 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63 | 0, 0, 0, 0, 62, 63, 62, 62, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 64 | 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 63, 0, 26, 27, 28, 29, 30, 31, 32, 65 | 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 66 | }; 67 | 68 | // clang-format on 69 | 70 | std::vector b64::decode(const char* str, const size_t len) { 71 | const auto p = reinterpret_cast(str); 72 | const auto pad = len > 0 && (len % 4 || p[len - 1] == '='); 73 | const auto L = ((len + 3) / 4 - pad) * 4; 74 | std::vector vec(L / 4 * 3 + pad, 0); 75 | 76 | for (size_t i = 0, j = 0; i < L; i += 4) { 77 | const auto n = decode_table[p[i]] << 18 | decode_table[p[i + 1]] << 12 | decode_table[p[i + 2]] << 6 | decode_table[p[i + 3]]; 78 | vec[j++] = n >> 16 & 0xFF; 79 | vec[j++] = n >> 8 & 0xFF; 80 | vec[j++] = n & 0xFF; 81 | } 82 | if (pad) { 83 | auto n = decode_table[p[L]] << 18 | decode_table[p[L + 1]] << 12; 84 | vec[vec.size() - 1] = n >> 16 & 0xFF; 85 | 86 | if (len > L + 2 && p[L + 2] != '=') { 87 | n |= decode_table[p[L + 2]] << 6; 88 | vec.push_back(n >> 8 & 0xFF); 89 | } 90 | } 91 | return vec; 92 | } 93 | -------------------------------------------------------------------------------- /OpenHashTab/base64.h: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #pragma once 17 | 18 | namespace b64 { 19 | std::string encode(const uint8_t* src, size_t len); 20 | std::vector decode(const char* str, const size_t len); 21 | } 22 | -------------------------------------------------------------------------------- /OpenHashTab/cog.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/namazso/OpenHashTab/e02c94ad0dc6943d4d997a972d7cf91ab055213a/OpenHashTab/cog.ico -------------------------------------------------------------------------------- /OpenHashTab/hash_colors.h: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #pragma once 17 | #include "Settings.h" 18 | 19 | enum class HashColorType { 20 | Error, 21 | Match, 22 | Insecure, 23 | Mismatch, 24 | Unknown 25 | }; 26 | 27 | struct HashColorSettingEntry { 28 | RegistrySetting Settings::*fg_enabled; 29 | RegistrySetting Settings::*fg_color; 30 | RegistrySetting Settings::*bg_enabled; 31 | RegistrySetting Settings::*bg_color; 32 | int settings_dlg_group; 33 | int settings_dlg_fg_check; 34 | int settings_dlg_fg_btn; 35 | int settings_dlg_bg_check; 36 | int settings_dlg_bg_btn; 37 | int settings_dlg_sample; 38 | int settings_dlg_group_str; 39 | }; 40 | 41 | static constexpr HashColorSettingEntry HASH_COLOR_SETTING_MAP[5] = { 42 | { &Settings::error_fg_enabled, 43 | &Settings::error_fg_color, 44 | &Settings::error_bg_enabled, 45 | &Settings::error_bg_color, 46 | IDC_ERROR_GROUP, 47 | IDC_ERROR_FG_CHECK, 48 | IDC_ERROR_FG_BTN, 49 | IDC_ERROR_BG_CHECK, 50 | IDC_ERROR_BG_BTN, 51 | IDC_ERROR_SAMPLE, 52 | IDS_ERROR_GROUP }, 53 | { &Settings::match_fg_enabled, 54 | &Settings::match_fg_color, 55 | &Settings::match_bg_enabled, 56 | &Settings::match_bg_color, 57 | IDC_MATCH_GROUP, 58 | IDC_MATCH_FG_CHECK, 59 | IDC_MATCH_FG_BTN, 60 | IDC_MATCH_BG_CHECK, 61 | IDC_MATCH_BG_BTN, 62 | IDC_MATCH_SAMPLE, 63 | IDS_MATCH_GROUP }, 64 | {&Settings::insecure_fg_enabled, 65 | &Settings::insecure_fg_color, 66 | &Settings::insecure_bg_enabled, 67 | &Settings::insecure_bg_color, 68 | IDC_INSECURE_GROUP, 69 | IDC_INSECURE_FG_CHECK, 70 | IDC_INSECURE_FG_BTN, 71 | IDC_INSECURE_BG_CHECK, 72 | IDC_INSECURE_BG_BTN, 73 | IDC_INSECURE_SAMPLE, 74 | IDS_INSECURE_GROUP}, 75 | {&Settings::mismatch_fg_enabled, 76 | &Settings::mismatch_fg_color, 77 | &Settings::mismatch_bg_enabled, 78 | &Settings::mismatch_bg_color, 79 | IDC_MISMATCH_GROUP, 80 | IDC_MISMATCH_FG_CHECK, 81 | IDC_MISMATCH_FG_BTN, 82 | IDC_MISMATCH_BG_CHECK, 83 | IDC_MISMATCH_BG_BTN, 84 | IDC_MISMATCH_SAMPLE, 85 | IDS_MISMATCH_GROUP}, 86 | { &Settings::unknown_fg_enabled, 87 | &Settings::unknown_fg_color, 88 | &Settings::unknown_bg_enabled, 89 | &Settings::unknown_bg_color, 90 | IDC_UNKNOWN_GROUP, 91 | IDC_UNKNOWN_FG_CHECK, 92 | IDC_UNKNOWN_FG_BTN, 93 | IDC_UNKNOWN_BG_CHECK, 94 | IDC_UNKNOWN_BG_BTN, 95 | IDC_UNKNOWN_SAMPLE, 96 | IDS_UNKNOWN_GROUP }, 97 | }; 98 | -------------------------------------------------------------------------------- /OpenHashTab/https.h: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #pragma once 17 | 18 | struct HTTPRequest { 19 | const wchar_t* user_agent; 20 | const wchar_t* server_name; 21 | const wchar_t* method; 22 | const wchar_t* uri; 23 | const wchar_t* headers; 24 | const void* body; 25 | DWORD body_size; 26 | }; 27 | 28 | struct HTTPResult { 29 | std::string body; 30 | DWORD error_code; 31 | 32 | union { 33 | DWORD http_code; 34 | DWORD error_location; 35 | }; 36 | }; 37 | 38 | HTTPResult DoHTTPS(const HTTPRequest& r); 39 | -------------------------------------------------------------------------------- /OpenHashTab/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/namazso/OpenHashTab/e02c94ad0dc6943d4d997a972d7cf91ab055213a/OpenHashTab/icon.ico -------------------------------------------------------------------------------- /OpenHashTab/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/namazso/OpenHashTab/e02c94ad0dc6943d4d997a972d7cf91ab055213a/OpenHashTab/icon.png -------------------------------------------------------------------------------- /OpenHashTab/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 15 | 17 | 18 | 20 | image/svg+xml 21 | 23 | 24 | 25 | 26 | 27 | 48 | 50 | 52 | 53 | 56 | 63 | 70 | 75 | 79 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /OpenHashTab/json.h: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #pragma once 17 | 18 | #pragma clang diagnostic push 19 | #pragma clang diagnostic ignored "-Wall" 20 | #pragma clang diagnostic ignored "-Wreserved-macro-identifier" 21 | #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" 22 | #include 23 | #pragma clang diagnostic pop 24 | 25 | class json_parser : jsonPool_t { 26 | static json_t* alloc_fn(jsonPool_t* pool) { 27 | const auto list_pool = static_cast(pool); // NOLINT(cppcoreguidelines-pro-type-static-cast-downcast) 28 | return &list_pool->_list.emplace_back(); 29 | } 30 | 31 | std::list _list{}; 32 | std::string _str{}; 33 | const json_t* _root{}; 34 | 35 | public: 36 | json_parser() 37 | : jsonPool_t{&alloc_fn, &alloc_fn} {} 38 | 39 | explicit json_parser(const char* str) 40 | : jsonPool_t{&alloc_fn, &alloc_fn} 41 | , _str{str} { 42 | _root = json_createWithPool(_str.data(), this); 43 | } 44 | 45 | json_parser(const json_parser&) = delete; 46 | json_parser(json_parser&&) = delete; 47 | json_parser& operator=(const json_parser&) = delete; 48 | json_parser& operator=(json_parser&&) = delete; 49 | 50 | void parse(const char* str) { 51 | _str = str; 52 | _list.clear(); 53 | _root = json_createWithPool(_str.data(), this); 54 | } 55 | 56 | [[nodiscard]] const json_t* root() const { return _root; } 57 | }; 58 | -------------------------------------------------------------------------------- /OpenHashTab/path.h: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #pragma once 17 | #include 18 | 19 | #include "Settings.h" 20 | 21 | struct ProcessedFileList { 22 | // -2: not sumfile 23 | // -1: unknown sumfile 24 | // 0+: a sumfile belonging to the algorithm given 25 | // 26 | // If the main file is a sumfile of a hash format we don't have enabled we want to enable it for this session. 27 | int sumfile_type{-2}; 28 | 29 | // A Win32 path to a directory that supposedly contains all files hashed. Ends with a slash. 30 | std::wstring base_path; 31 | 32 | struct FileInfo { 33 | // Path relative to base_path, absolute if base_path is not root for the file 34 | std::wstring relative_path; 35 | 36 | // Expected hashes. We'll try to figure out which belongs to what algorithm 37 | std::list> expected_hashes; 38 | }; 39 | 40 | // Files to hash, keyed by normalized path 41 | std::unordered_map files; 42 | }; 43 | 44 | ProcessedFileList ProcessEverything(std::list list, const Settings* settings); 45 | -------------------------------------------------------------------------------- /OpenHashTab/stdafx.h: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #pragma once 17 | 18 | // Beware: Most of these macros and include ordering are figured out via trying until it compiles. 19 | 20 | #ifndef STRICT 21 | #define STRICT 22 | #endif 23 | 24 | #define NOMINMAX 25 | 26 | // thanks, microsoft 27 | #define Unknown Unknown_FROM_WINDOWS 28 | 29 | #include 30 | 31 | // Windows 7 32 | #define _WIN32_WINNT 0x0601 33 | 34 | #include 35 | 36 | #define ISOLATION_AWARE_ENABLED 1 37 | #define SIDEBYSIDE_COMMONCONTROLS 1 38 | 39 | #include 40 | 41 | #define WIN32_NO_STATUS 42 | 43 | // ATL 44 | #define _ATL_APARTMENT_THREADED 45 | #define _ATL_NO_AUTOMATIC_NAMESPACE 46 | #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit 47 | #define ATL_NO_ASSERT_ON_DESTROY_NONEXISTENT_WINDOW 48 | 49 | #include "resource.h" 50 | 51 | // Windows 52 | #include 53 | 54 | #include 55 | 56 | #include 57 | 58 | #include 59 | #include 60 | #include 61 | #include 62 | #include 63 | #include 64 | #include 65 | #include 66 | #include 67 | #include 68 | #include 69 | 70 | #undef Unknown 71 | 72 | #include 73 | #include 74 | #include 75 | #include 76 | #include 77 | #include 78 | #include 79 | #include 80 | #include 81 | #include 82 | #include 83 | #include 84 | #include 85 | #include 86 | #include 87 | #include 88 | 89 | #pragma clang diagnostic push 90 | #pragma clang diagnostic ignored "-Wall" 91 | #include 92 | #pragma clang diagnostic pop 93 | 94 | EXTERN_C const IID LIBID_OpenHashTabLib; 95 | EXTERN_C const IID IID_IOpenHashTabShlExt; 96 | EXTERN_C const IID CLSID_OpenHashTabShlExt; 97 | 98 | #undef CONTAINING_RECORD 99 | #define CONTAINING_RECORD(address, type, field) \ 100 | ((std::add_pointer_t)((ULONG_PTR)(address)-offsetof(type, field))) 101 | -------------------------------------------------------------------------------- /OpenHashTab/sum.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/namazso/OpenHashTab/e02c94ad0dc6943d4d997a972d7cf91ab055213a/OpenHashTab/sum.ico -------------------------------------------------------------------------------- /OpenHashTab/updatecheck.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #include "utl.h" 17 | 18 | #include "https.h" 19 | #include "json.h" 20 | 21 | utl::Version utl::GetLatestVersion() { 22 | HTTPRequest r{}; 23 | r.user_agent = L"OpenHashTab_Update_Checker"; 24 | r.server_name = L"api.github.com"; 25 | r.method = L"GET"; 26 | r.uri = L"/repos/namazso/OpenHashTab/tags"; 27 | r.headers = L"Content-Type: application/json\r\nAccept: application/vnd.github.v3+json\r\n"; 28 | 29 | const auto reply = DoHTTPS(r); 30 | 31 | if (reply.error_code) 32 | throw std::runtime_error(FormatString( 33 | "Error %08X at %d: %ls", 34 | reply.error_code, 35 | reply.error_location, 36 | ErrorToString(reply.error_code).c_str() 37 | )); 38 | 39 | if (reply.http_code != 200) 40 | throw std::runtime_error(FormatString( 41 | "HTTP Status %d received. Server says: %s", 42 | reply.http_code, 43 | reply.body.c_str() 44 | )); 45 | 46 | 47 | json_parser parser{reply.body.c_str()}; 48 | const auto j_root = parser.root(); 49 | 50 | if (!j_root) 51 | throw std::runtime_error(FormatString( 52 | "JSON parse error. Body: %s", 53 | reply.body.c_str() 54 | )); 55 | 56 | const json_t* j_child; 57 | const json_t* j_name; 58 | 59 | if (json_getType(j_root) != JSON_ARRAY || !((j_child = json_getChild(j_root))) || json_getType(j_child) != JSON_OBJ || !((j_name = json_getProperty(j_child, "name"))) || json_getType(j_name) != JSON_TEXT) 60 | throw std::runtime_error(FormatString( 61 | "Malformed reply. Body: %s", 62 | reply.body.c_str() 63 | )); 64 | 65 | const auto ver = json_getValue(j_name); 66 | Version v{}; 67 | if (3 != sscanf_s(ver, "v%hu.%hu.%hu", &v.major, &v.minor, &v.patch)) 68 | throw std::runtime_error(FormatString( 69 | "Malformed version number: %s", 70 | ver 71 | )); 72 | 73 | return v; 74 | } 75 | -------------------------------------------------------------------------------- /OpenHashTab/virustotal.h: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #pragma once 17 | 18 | class FileHashTask; 19 | struct Settings; 20 | 21 | namespace vt { 22 | bool CheckForToS(Settings* settings, HWND hwnd); 23 | 24 | struct Result { 25 | std::string permalink; 26 | FileHashTask* file{}; 27 | int positives{}; 28 | int total{}; 29 | bool found{}; 30 | }; 31 | 32 | std::list Query(const std::list& files, size_t algo); 33 | } 34 | -------------------------------------------------------------------------------- /OpenHashTab/virustotal_api.h: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | #pragma once 17 | 18 | // https://github.com/m417z/winbindex/blob/a22c6608f4e9115793ece1b9242691c4ac72ee26/data/upd04_get_virustotal_data.py#L52C1-L64 19 | 20 | // VT api checks this 21 | #define VT_USERAGENT "VirusTotal" 22 | 23 | #define VT_MAGICNUMBERS \ 24 | "4e3202fdb" \ 25 | "e953d628f" \ 26 | "650229af5" \ 27 | "b3eb49cd4" \ 28 | "6b2d3bfe5" \ 29 | "546ae3c5f" \ 30 | "a48b554e0" \ 31 | "c" 32 | -------------------------------------------------------------------------------- /OpenHashTab/vt.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/namazso/OpenHashTab/e02c94ad0dc6943d4d997a972d7cf91ab055213a/OpenHashTab/vt.ico -------------------------------------------------------------------------------- /StandaloneStub/.clang-format: -------------------------------------------------------------------------------- 1 | BasedOnStyle: LLVM 2 | AccessModifierOffset: -2 3 | AlignAfterOpenBracket: BlockIndent 4 | AlignArrayOfStructures: Right 5 | AlignConsecutiveAssignments: None 6 | AlignConsecutiveBitFields: AcrossEmptyLinesAndComments 7 | AlignConsecutiveMacros: Consecutive 8 | AlignEscapedNewlines: Left 9 | AlignOperands: Align 10 | AlignTrailingComments: true 11 | AllowAllArgumentsOnNextLine: false 12 | AllowAllConstructorInitializersOnNextLine: false 13 | AllowAllParametersOfDeclarationOnNextLine: false 14 | AllowShortBlocksOnASingleLine: Always 15 | AllowShortCaseLabelsOnASingleLine: false 16 | AllowShortFunctionsOnASingleLine: Inline 17 | AllowShortIfStatementsOnASingleLine: Never 18 | AllowShortLambdasOnASingleLine: All 19 | AllowShortLoopsOnASingleLine: false 20 | AlwaysBreakAfterReturnType: None 21 | AlwaysBreakBeforeMultilineStrings: true 22 | AlwaysBreakTemplateDeclarations: MultiLine 23 | BinPackArguments: false 24 | BinPackParameters: false 25 | BitFieldColonSpacing: Before 26 | BreakBeforeBraces: Custom 27 | BraceWrapping: 28 | AfterCaseLabel: false 29 | AfterClass: false 30 | AfterControlStatement: Never 31 | AfterEnum: false 32 | AfterFunction: false 33 | AfterNamespace: false 34 | AfterStruct: false 35 | AfterUnion: false 36 | AfterExternBlock: false 37 | BeforeCatch: false 38 | BeforeElse: false 39 | BeforeLambdaBody: false 40 | BeforeWhile: false 41 | IndentBraces: false 42 | SplitEmptyFunction: false 43 | SplitEmptyRecord: false 44 | SplitEmptyNamespace: false 45 | BreakBeforeBinaryOperators: NonAssignment 46 | BreakBeforeConceptDeclarations: Allowed 47 | BreakBeforeTernaryOperators: true 48 | BreakConstructorInitializers: BeforeComma 49 | BreakInheritanceList: BeforeComma 50 | BreakStringLiterals: false 51 | ColumnLimit: 0 52 | CompactNamespaces: false 53 | ContinuationIndentWidth: 2 54 | EmptyLineAfterAccessModifier: Never 55 | EmptyLineBeforeAccessModifier: Always 56 | FixNamespaceComments: true 57 | IncludeBlocks: Preserve 58 | IndentAccessModifiers: false 59 | IndentCaseLabels: false 60 | IndentExternBlock: NoIndent 61 | IndentGotoLabels: false 62 | IndentPPDirectives: None 63 | IndentWidth: 2 64 | IndentWrappedFunctionNames: false 65 | InsertTrailingCommas: Wrapped 66 | KeepEmptyLinesAtTheStartOfBlocks: false 67 | LambdaBodyIndentation: Signature 68 | MaxEmptyLinesToKeep: 2 69 | NamespaceIndentation: All 70 | PackConstructorInitializers: CurrentLine 71 | PointerAlignment: Left 72 | QualifierAlignment: Custom 73 | QualifierOrder: [ 'inline', 'static', 'constexpr', 'const', 'volatile', 'type', 'restrict' ] 74 | ReferenceAlignment: Left 75 | ReflowComments: false 76 | RequiresClausePosition: OwnLine 77 | SeparateDefinitionBlocks: Always 78 | ShortNamespaceLines: 10 79 | SortIncludes: CaseInsensitive 80 | SortUsingDeclarations: true 81 | SpaceAfterCStyleCast: false 82 | SpaceAfterLogicalNot: false 83 | SpaceAfterTemplateKeyword: true 84 | SpaceBeforeAssignmentOperators: true 85 | SpaceBeforeCpp11BracedList: false 86 | SpaceBeforeCtorInitializerColon: true 87 | SpaceBeforeInheritanceColon: true 88 | SpaceBeforeParens: ControlStatements 89 | SpaceBeforeRangeBasedForLoopColon: true 90 | SpaceBeforeSquareBrackets: false 91 | SpaceInEmptyBlock: false 92 | SpaceInEmptyParentheses: false 93 | SpacesBeforeTrailingComments: 1 94 | SpacesInAngles: false 95 | SpacesInCStyleCastParentheses: false 96 | SpacesInConditionalStatement: false 97 | SpacesInContainerLiterals: false 98 | SpacesInLineCommentPrefix: 99 | Minimum: 1 100 | Maximum: -1 101 | SpacesInParentheses: false 102 | SpacesInSquareBrackets: false 103 | Standard: c++20 104 | TabWidth: 2 105 | UseTab: Never 106 | -------------------------------------------------------------------------------- /StandaloneStub/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2019-2025 namazso 2 | # This file is part of OpenHashTab. 3 | # 4 | # OpenHashTab is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # OpenHashTab is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with OpenHashTab. If not, see . 16 | 17 | project(StandaloneStub) 18 | 19 | add_executable(${PROJECT_NAME} StandaloneStub.cpp StandaloneStub.rc) 20 | 21 | target_link_libraries(${PROJECT_NAME} OpenHashTab) 22 | target_link_options(${PROJECT_NAME} PRIVATE /subsystem:windows) 23 | -------------------------------------------------------------------------------- /StandaloneStub/StandaloneStub.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | 17 | #define WIN32_LEAN_AND_MEAN 18 | #include 19 | 20 | extern "C" __declspec(dllimport) int APIENTRY StandaloneEntryW( 21 | _In_opt_ HWND hWnd, 22 | _In_ HINSTANCE hRunDLLInstance, 23 | _In_ LPCWSTR lpCmdLine, 24 | _In_ int nShowCmd 25 | ); 26 | 27 | int APIENTRY wWinMain( 28 | _In_ HINSTANCE hInstance, 29 | _In_opt_ HINSTANCE hPrevInstance, 30 | _In_ LPWSTR lpCmdLine, 31 | _In_ int nCmdShow 32 | ) { 33 | UNREFERENCED_PARAMETER(hPrevInstance); 34 | return StandaloneEntryW(nullptr, hInstance, lpCmdLine, nCmdShow); 35 | } 36 | -------------------------------------------------------------------------------- /StandaloneStub/StandaloneStub.rc: -------------------------------------------------------------------------------- 1 | // Copyright 2019-2025 namazso 2 | // This file is part of OpenHashTab. 3 | // 4 | // OpenHashTab is free software: you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation, either version 3 of the License, or 7 | // (at your option) any later version. 8 | // 9 | // OpenHashTab is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with OpenHashTab. If not, see . 16 | 17 | 0 ICON "..\\OpenHashTab\\icon.ico" 18 | -------------------------------------------------------------------------------- /build_algorithms.ps1: -------------------------------------------------------------------------------- 1 | # Copyright 2019-2025 namazso 2 | # This file is part of OpenHashTab. 3 | # 4 | # OpenHashTab is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # OpenHashTab is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with OpenHashTab. If not, see . 16 | 17 | $VSRoot = (& vswhere -property installationPath); 18 | 19 | function Invoke-CmdScript { 20 | param( 21 | [String] $scriptName 22 | ) 23 | $cmdLine = """$scriptName"" $args & set" 24 | & $Env:SystemRoot\system32\cmd.exe /c $cmdLine | 25 | Select-String '^([^=]*)=(.*)$' | ForEach-Object { 26 | $varName = $_.Matches[0].Groups[1].Value 27 | $varValue = $_.Matches[0].Groups[2].Value 28 | Set-Item Env:$varName $varValue 29 | } 30 | } 31 | 32 | $Environment = (Get-ChildItem Env:); 33 | 34 | "SSE2", "AVX", "AVX2", "AVX512", "ARM64" | ForEach-Object { 35 | $ExtraFlags = ""; 36 | If ($_ -eq "ARM64") { 37 | Invoke-CmdScript "$VSRoot\VC\Auxiliary\Build\vcvarsamd64_arm64.bat" 38 | $ExtraFlags = "--target=arm64-pc-windows-msvc"; 39 | } Else { 40 | Invoke-CmdScript "$VSRoot\VC\Auxiliary\Build\vcvars64.bat" 41 | } 42 | Set-Item Env:CFLAGS $ExtraFlags 43 | Set-Item Env:CXXFLAGS $ExtraFlags 44 | 45 | mkdir -ErrorAction Ignore "cmake-algorithms-$_" 46 | cmake ` 47 | -G Ninja ` 48 | -S Algorithms ` 49 | -B "cmake-algorithms-$_" ` 50 | --install-prefix ((Get-Item AlgorithmsDlls).FullName) ` 51 | "-DOHT_FLAVOR=$_" ` 52 | -DCMAKE_BUILD_TYPE=RelWithDebInfo ` 53 | -DCMAKE_C_COMPILER=clang-cl ` 54 | -DCMAKE_CXX_COMPILER=clang-cl 55 | cmake --build "cmake-algorithms-$_" 56 | cmake --install "cmake-algorithms-$_" 57 | 58 | Remove-Item -Path Env:* 59 | $Environment | ForEach-Object { Set-Item "env:$($_.Name)" $_.Value } 60 | } 61 | -------------------------------------------------------------------------------- /build_openhashtab.ps1: -------------------------------------------------------------------------------- 1 | # Copyright 2019-2025 namazso 2 | # This file is part of OpenHashTab. 3 | # 4 | # OpenHashTab is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # OpenHashTab is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with OpenHashTab. If not, see . 16 | 17 | $VSRoot = (& vswhere -property installationPath); 18 | 19 | function Invoke-CmdScript { 20 | param( 21 | [String] $scriptName 22 | ) 23 | $cmdLine = """$scriptName"" $args & set" 24 | & $Env:SystemRoot\system32\cmd.exe /c $cmdLine | 25 | Select-String '^([^=]*)=(.*)$' | ForEach-Object { 26 | $varName = $_.Matches[0].Groups[1].Value 27 | $varValue = $_.Matches[0].Groups[2].Value 28 | Set-Item Env:$varName $varValue 29 | } 30 | } 31 | 32 | $Env:RC = "llvm-rc"; 33 | 34 | If (Test-Path "Env:CI_VERSION") { 35 | $CI_VERSION = $Env:CI_VERSION; 36 | $CI_VERSION_MAJOR = $Env:CI_VERSION_MAJOR; 37 | $CI_VERSION_MINOR = $Env:CI_VERSION_MINOR; 38 | $CI_VERSION_PATCH = $Env:CI_VERSION_PATCH; 39 | } Else { 40 | $CI_VERSION = "(unknown)"; 41 | $CI_VERSION_MAJOR = 0; 42 | $CI_VERSION_MINOR = 0; 43 | $CI_VERSION_PATCH = 0; 44 | } 45 | 46 | $Environment = (Get-ChildItem Env:); 47 | 48 | Invoke-CmdScript "$VSRoot\VC\Auxiliary\Build\vcvars64.bat" 49 | 50 | cmake ` 51 | -G Ninja ` 52 | -S . ` 53 | -B "cmake-openhashtab-x64" ` 54 | -DCMAKE_BUILD_TYPE=RelWithDebInfo ` 55 | -DCMAKE_C_COMPILER=clang-cl ` 56 | -DCMAKE_CXX_COMPILER=clang-cl ` 57 | -DCMAKE_MT=mt ` 58 | "-DCI_VERSION=$CI_VERSION" ` 59 | "-DCI_VERSION_MINOR=$CI_VERSION_MINOR" ` 60 | "-DCI_VERSION_MAJOR=$CI_VERSION_MAJOR" ` 61 | "-DCI_VERSION_PATCH=$CI_VERSION_PATCH" 62 | cmake --build "cmake-openhashtab-x64" 63 | 64 | Remove-Item -Path Env:* 65 | $Environment | ForEach-Object { Set-Item "env:$($_.Name)" $_.Value } 66 | 67 | Invoke-CmdScript "$VSRoot\VC\Auxiliary\Build\vcvarsamd64_arm64.bat" 68 | $ExtraFlags = "--target=arm64-pc-windows-msvc"; 69 | 70 | Set-Item Env:CFLAGS $ExtraFlags 71 | Set-Item Env:CXXFLAGS $ExtraFlags 72 | 73 | cmake ` 74 | -G Ninja ` 75 | -S . ` 76 | -B "cmake-openhashtab-ARM64" ` 77 | -DCMAKE_BUILD_TYPE=RelWithDebInfo ` 78 | -DCMAKE_C_COMPILER=clang-cl ` 79 | -DCMAKE_CXX_COMPILER=clang-cl ` 80 | -DCMAKE_MT=mt ` 81 | "-DCI_VERSION=$CI_VERSION" ` 82 | "-DCI_VERSION_MINOR=$CI_VERSION_MINOR" ` 83 | "-DCI_VERSION_MAJOR=$CI_VERSION_MAJOR" ` 84 | "-DCI_VERSION_PATCH=$CI_VERSION_PATCH" 85 | cmake --build "cmake-openhashtab-ARM64" 86 | 87 | Remove-Item -Path Env:* 88 | $Environment | ForEach-Object { Set-Item "env:$($_.Name)" $_.Value } 89 | --------------------------------------------------------------------------------