diff --git a/.eslintrc.yml b/.eslintrc.yml deleted file mode 100644 index 43d9228e..00000000 --- a/.eslintrc.yml +++ /dev/null @@ -1,31 +0,0 @@ -env: - es6: true - mocha: true - amd: true - node: true - browser: true - -globals: - loot: false - should: false - -extends: - - "eslint:recommended" - - "airbnb-base" - -rules: - strict: off - no-param-reassign: - - error - - props: false - max-len: warn - linebreak-style: off - no-underscore-dangle: off - arrow-parens: off - no-undef: warn - no-mixed-operators: - - error - - allowSamePrecedence: true - -plugins: - - eslint-plugin-html diff --git a/.gitignore b/.gitignore index 6742bc77..b1bfc80f 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,3 @@ Thumbs.db *.sdf *.opensdf build -*.mo -bower_components -node_modules diff --git a/.travis.yml b/.travis.yml index b6c9ac3c..94dd2080 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,29 +6,14 @@ addons: apt: sources: - ubuntu-toolchain-r-test # ppa:ubuntu-toolchain-r/test - - kubuntu-backports # ppa:kubuntu-ppa/backports packages: - libbz2-dev - libssl-dev - gcc-5 - g++-5 - - cmake - - cmake-data - # GUI dependencies - - libx11-dev - - libgtk2.0-dev - - libnss3-dev - - libgconf2-dev - - libxss-dev - - libasound2-dev - - libxtst-dev - # Scripting dependencies - - imagemagick cache: directories: - - $TRAVIS_BUILD_DIR/node_modules - - $TRAVIS_BUILD_DIR/bower_components - $HOME/boost_1_61_0/boost - $HOME/boost_1_61_0/stage/lib @@ -36,16 +21,7 @@ install: # Use GCC 5. - if [ "$CXX" = "g++" ]; then export CXX="g++-5" CC="gcc-5"; fi - export CXXFLAGS="-fPIC" CFLAGS="-fPIC" - # Install the latest stable Node.js. The default Node.js version is too old - # for some of the JavaScript syntax used. - - npm install -g nvm - - nvm install node - # Install Node.js dependencies - - npm install - # Add local binary path to PATH - - export PATH="./node_modules/.bin:$PATH" - # Install runtime dependencies using Bower - - bower install + # Build Boost. - wget https://raw.githubusercontent.com/WrinklyNinja/ci-scripts/1.0.0/install_boost.py - python install_boost.py --directory ~ --boost-version 1.61.0 atomic chrono date_time filesystem iostreams locale log regex system thread # Install packages for generating documentation @@ -58,11 +34,13 @@ install: - tar -xf doxygen-1.8.12.linux.bin.tar.gz # Add Doxygen binary path to PATH - export PATH="$PWD/doxygen-1.8.12/bin:$PATH" + # Get CMake (version available in repositories is too old, needs to be 3.1+) + - wget --no-check-certificate https://cmake.org/files/v3.7/cmake-3.7.2-Linux-x86_64.tar.gz + - tar -xzf cmake-3.7.2-Linux-x86_64.tar.gz + - export PATH=$PWD/cmake-3.7.2-Linux-x86_64/bin:$PATH before_script: - mkdir build - - node scripts/create_ico.js - # Move into the cloned LOOT repo build path. - cd build # Link dynamically to the C++ standard library runtime. - cmake .. -DBOOST_ROOT=~/boost_1_61_0 @@ -71,49 +49,38 @@ script: - make all - ./loot_api_internals_tests - ./loot_api_tests - - ./loot_gui_tests after_success: - cd $TRAVIS_BUILD_DIR - # Get the full repo history before trying to run the archiver. - - git fetch --unshallow - - node scripts/potomo.js - sphinx-build -b html docs build/docs/html - - node scripts/archive.js - # Need to replace the HEAD branch descriptor in the archive filenames - - for ARCHIVE in build/*.tar.xz; do mv $ARCHIVE $(echo $ARCHIVE | sed "s/HEAD/$TRAVIS_BRANCH/"); done + - cd build + - cpack + - cd .. + # Get the full repo history before trying to run git describe. + - git fetch --unshallow + - GIT_DESCRIBE=$(git describe --tags --long --always --abbrev=7) # Make copies of the archives for GitHub deployment to find. - - cp $(ls build/loot-api_*.tar.xz) build/loot-api.tar.xz + - cp $(ls build/package/loot_api-*.tar.xz) build/loot-api.tar.xz # Need to replace the Bintray config files' version placeholders. - - VERSION=$(ls build/loot_*.tar.xz | sed 's/build\/loot_//;s/.tar.xz//;') - - sed -i "s/REPLACE_THIS_VERSION/$VERSION/" scripts/travis/loot.bintray.json - - sed -i "s/REPLACE_THIS_VERSION/$VERSION/" scripts/travis/loot-api.bintray.json + - sed -i "s/REPLACE_THIS_VERSION/${GIT_DESCRIBE}_${TRAVIS_BRANCH}/" scripts/travis/loot-api.bintray.json deploy: - - provider: bintray - file: scripts/travis/loot.bintray.json - user: wrinklyninja - key: - secure: "CyJpCbkO4pK+h4ZFDqwS3FZNwTaY7638IT7uzVKhGQV2CD9nMR7mb9bL6DG/Uxs91MuBeCu8RwzXtK5IVmPkH5AbMO95JMsjor+t8lT6AHhjvgmAhOBXJa5qMbFBFbLQErTdudHIcOxgjyjA5vqt5Zf0DlWty7WnE10WoU/O7qg=" - skip_cleanup: true - on: - all_branches: true - provider: bintray file: scripts/travis/loot-api.bintray.json user: wrinklyninja key: - secure: "CyJpCbkO4pK+h4ZFDqwS3FZNwTaY7638IT7uzVKhGQV2CD9nMR7mb9bL6DG/Uxs91MuBeCu8RwzXtK5IVmPkH5AbMO95JMsjor+t8lT6AHhjvgmAhOBXJa5qMbFBFbLQErTdudHIcOxgjyjA5vqt5Zf0DlWty7WnE10WoU/O7qg=" + secure: "zczTW2fGiTDlrgCtDyWAcQ+FftErR8XFZ7Lz3Mnj3gbedlS7wKdpffXngpepGGQQp3N5Jt0F51mQDrRFfvgmSk0IpuSVKkzuUNt5aJEav7LYb9tho4afXGu/fd3Sj8nF0NM4rB9b2sHMKOLSBD/a+7qsf0q3W4lFZGRQPzqq6RBqB0p8brsdf4g/aoVjAGltUtagMNMYJbs5MNsZLX0Zw9pRB4bSvCf9YNXLcMckA2FQC+xiWAliMOQQlnQU5QZgzNypiTvYpyYwhLM3Xy6/QB9WkABDPEfYNcnOX7JRI81Q6QGWbbSNpDcGI1LmxDwYCftpI7ilbL+yj8Al6AFAn4Ia3AcMpoXv9De/11HYftwYL+76Lud+EaCZimy5FIj6d+GBVwiZkpnbEi8r0LJ0o9dBlLJESqSRwqhYH25fahSgfT/Tew5ftigOfJRY/sYXYXJS5TLeV7OaP6LXAivBWttB3Wo3OcE+4HsvmpgIrHGhvKsmtAQMs2ddBwKdro9jqtaCBbM2To05FtQ1/RYV2dD3v8nF7CwSX6VLp1a973CUZ5/IF3R6ONeCVwkxVqe7hPlo65NAx8L8jvxjksYIQ/r1aPhJLU7UCPPic47I/6M0fsRnT8pcRymnMcfQ5QT7h7gtqQQRJzYKaalkYVObw1ygDsqgPh5LZTf6U6S+bG8=" skip_cleanup: true on: all_branches: true - provider: releases api_key: - secure: "TuiXR/J5cdvgAXqU5x79E7thXwzN4Jqo1vKolPPb5ahrBllBHFh23awyOIdlTnXY1aS6NjS85uIiD3TNZ/hwrtDsjMgNs1ofL6A9B+7uQJjpK8JqFUECrJCMsEhnwRSzIUeqDeZp440x3c0bTFqfSMErrG/ga5S+VyNYHYREqo4=" + secure: "HBBghmIDgWsPq6YVrKh/M0au51ffWQdnaNr2QUFBEzsrMUgaAR04vd3eLtodHr5W2m6fJFfvIDnROYh2KnFQP0MFwEkldyToHpAJqoSxOJ2uJzq7TOiWTVlKbdnutQ+0GS0URcoM32uxRgkduWWe9McZ1mj12oyV2PKR2ojtNp9ni12O2qfzH32YPdQZ3zutxRgB82OZ0qj7HMHfD4v0yPhBncZaEWFTKKRy/LgJvaEGsEsb7u8MidRVpo/pNbNirjlh7Vlx4tm7kT2R4/ehH8H2y3MjxCaacfzaqi6LoGqMBVEjhpETI1COMvhezUdzmB/GBdX8zlTKuSs1GwiUl6FXnEPxnIU+qllx5PkHeph3GpkPZ8ChUuqnEksaBZsnVQ0D06KrivLb5otlRkfk4xfEX/68KUP7y/dNVZCVYOHSPD0N+iaKhGhTkjt77xJQ0z3U1qtoHrbtSdVUdeb+xIiyYCr8mHrQy+gNGqB8NLtpsdqWpjKh/BAcYnlu15VZLq6AASpLaDeBsCGXm/Er15z5meXDyRPtR1qT9XZgDEMXsn7ywe/dNfNxiY8sPxNn6vpqNvD7AR4s8nYm7qAm3JBw5xBaqh5HpkibIcNADkZGvDWjsbvO48/g1J5R+XT6CE77Qbj9UcYR532TbD0VSYFr6+snTf0Vwe1JgoiHNSk=" file: - build/loot-api.tar.xz skip_cleanup: true on: - repo: loot/loot + repo: loot/loot-api tags: true notifications: diff --git a/CMakeLists.txt b/CMakeLists.txt index a64aa0f7..e2824e1d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required (VERSION 2.8.12.1) cmake_policy(SET CMP0015 NEW) -project (LOOT) +project (loot_api) include(ExternalProject) option(BUILD_SHARED_LIBS "Build a shared library" ON) @@ -123,41 +123,6 @@ ExternalProject_Get_Property(yaml-cpp SOURCE_DIR BINARY_DIR) set(YAML_CPP_INCLUDE_DIRS "${SOURCE_DIR}/include") set(YAML_CPP_LIBRARIES "${BINARY_DIR}/${CMAKE_CFG_INTDIR}/libyaml-cpp${CMAKE_STATIC_LIBRARY_SUFFIX}") -IF (CMAKE_SYSTEM_NAME MATCHES "Windows") - set(CEF_URL "http://opensource.spotify.com/cefbuilds/cef_binary_3.2924.1561.g06fde99_windows32_minimal.tar.bz2") - set(CEF_URL_HASH "6ad9d9280f0b7d28e4cc8816b87f28dd3f8b0453") - set(CEF_PRECOMPILED_BINARIES "libcef.dll" "natives_blob.bin" "snapshot_blob.bin" "d3dcompiler_47.dll" "libEGL.dll" "libGLESv2.dll" "chrome_elf.dll") - set(CEF_LIB libcef${CMAKE_STATIC_LIBRARY_SUFFIX}) -ELSE () - set(CEF_URL "http://opensource.spotify.com/cefbuilds/cef_binary_3.2924.1561.g06fde99_linux64_minimal.tar.bz2") - set(CEF_URL_HASH "62e008195d7891134e12b7dd58ee42c3c8f316b3") - set(CEF_PRECOMPILED_BINARIES "libcef.so" "natives_blob.bin" "snapshot_blob.bin" "chrome-sandbox") - set(CEF_LIB libcef${CMAKE_SHARED_LIBRARY_SUFFIX}) -ENDIF() - -ExternalProject_Add(cef - PREFIX "external" - URL ${CEF_URL} - URL_HASH SHA1=${CEF_URL_HASH} - PATCH_COMMAND ${CMAKE_COMMAND} -DMSVC_STATIC_RUNTIME=${MSVC_STATIC_RUNTIME} -P "${CMAKE_SOURCE_DIR}/scripts/cmake/configure_cef.cmake" - CMAKE_ARGS -DUSE_SANDBOX=OFF - BUILD_COMMAND ${CMAKE_COMMAND} --build . --target libcef_dll_wrapper --config $(CONFIGURATION) - INSTALL_COMMAND "") -ExternalProject_Get_Property(cef SOURCE_DIR BINARY_DIR) -set(CEF_INCLUDE_DIRS "${SOURCE_DIR}") -set(CEF_LIBRARIES "${SOURCE_DIR}/Release/${CEF_LIB}" - "${BINARY_DIR}/libcef_dll_wrapper/${CMAKE_CFG_INTDIR}/libcef_dll_wrapper${CMAKE_STATIC_LIBRARY_SUFFIX}") -set(CEF_RESOURCES_DIR "${SOURCE_DIR}/Resources") -set(CEF_RESOURCES "cef.pak" - "cef_100_percent.pak" - "cef_200_percent.pak" - "devtools_resources.pak" - "icudtl.dat") -set(CEF_LOCALES_DIR "${CEF_RESOURCES_DIR}/locales") -set(CEF_LOCALE_FILE "en-US.pak") -set(CEF_PRECOMPILED_BINARIES_DIR "${SOURCE_DIR}/Release") - - ############################## # General Settings ############################## @@ -241,65 +206,6 @@ set (LOOT_API_HEADERS "${CMAKE_SOURCE_DIR}/include/loot/api.h" "${CMAKE_SOURCE_DIR}/src/api/helpers/crc.h" "${CMAKE_SOURCE_DIR}/src/api/helpers/version.h") -set (LOOT_GUI_SRC "${CMAKE_SOURCE_DIR}/src/gui/main.cpp" - "${CMAKE_SOURCE_DIR}/src/gui/helpers.cpp" - "${CMAKE_SOURCE_DIR}/src/gui/loot_handler.cpp" - "${CMAKE_SOURCE_DIR}/src/gui/loot_app.cpp" - "${CMAKE_SOURCE_DIR}/src/gui/loot_scheme_handler_factory.cpp" - "${CMAKE_SOURCE_DIR}/src/gui/query_handler.cpp" - "${CMAKE_SOURCE_DIR}/src/gui/state/game.cpp" - "${CMAKE_SOURCE_DIR}/src/gui/state/game_settings.cpp" - "${CMAKE_SOURCE_DIR}/src/gui/state/loot_paths.cpp" - "${CMAKE_SOURCE_DIR}/src/gui/state/loot_settings.cpp" - "${CMAKE_SOURCE_DIR}/src/gui/state/loot_state.cpp" - "${CMAKE_SOURCE_DIR}/src/gui/resource.rc") - -set (LOOT_GUI_HEADERS "${CMAKE_SOURCE_DIR}/src/gui/editor_message.h" - "${CMAKE_SOURCE_DIR}/src/gui/helpers.h" - "${CMAKE_SOURCE_DIR}/src/gui/loot_handler.h" - "${CMAKE_SOURCE_DIR}/src/gui/loot_app.h" - "${CMAKE_SOURCE_DIR}/src/gui/loot_scheme_handler_factory.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/json.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/apply_sort_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/cancel_find_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/cancel_sort_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/change_game_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/clear_all_metadata_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/clear_plugin_metadata_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/clipboard_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/close_settings_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/copy_content_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/copy_load_order_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/copy_metadata_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/discard_unapplied_changes_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/editor_opened_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/editor_closed_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/get_conflicting_plugins_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/get_game_data_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/get_game_types_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/get_init_errors_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/get_installed_games_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/get_languages_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/get_settings_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/get_version_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/metadata_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/open_log_location_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/open_readme_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/redate_plugins_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/save_filter_state_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/sort_plugins_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query/update_masterlist_query.h" - "${CMAKE_SOURCE_DIR}/src/gui/query_handler.h" - "${CMAKE_SOURCE_DIR}/src/gui/state/game.h" - "${CMAKE_SOURCE_DIR}/src/gui/state/game_detection_error.h" - "${CMAKE_SOURCE_DIR}/src/gui/state/game_settings.h" - "${CMAKE_SOURCE_DIR}/src/gui/state/loot_paths.h" - "${CMAKE_SOURCE_DIR}/src/gui/state/loot_settings.h" - "${CMAKE_SOURCE_DIR}/src/gui/state/loot_state.h" - "${CMAKE_SOURCE_DIR}/src/gui/resource.h" - "${CMAKE_SOURCE_DIR}/src/gui/yaml_simple_message_helpers.h") - set (LOOT_TESTS_SRC "${CMAKE_SOURCE_DIR}/src/tests/api/internals/main.cpp") set (LOOT_TESTS_HEADERS "${CMAKE_SOURCE_DIR}/src/tests/api/internals/game/game_test.h" @@ -337,42 +243,19 @@ set(LOOT_API_TESTS_HEADERS "${CMAKE_SOURCE_DIR}/src/tests/api/interface/api_gam "${CMAKE_SOURCE_DIR}/src/tests/api/interface/is_compatible_test.h" "${CMAKE_SOURCE_DIR}/src/tests/common_game_test_fixture.h") -set(LOOT_GUI_TESTS_SRC "${CMAKE_SOURCE_DIR}/src/gui/state/game.cpp" - "${CMAKE_SOURCE_DIR}/src/gui/state/game_settings.cpp" - "${CMAKE_SOURCE_DIR}/src/gui/state/loot_paths.cpp" - "${CMAKE_SOURCE_DIR}/src/gui/state/loot_settings.cpp" - "${CMAKE_SOURCE_DIR}/src/gui/state/loot_state.cpp" - "${CMAKE_SOURCE_DIR}/src/tests/gui/main.cpp") - -set (LOOT_GUI_TESTS_HEADERS "${CMAKE_SOURCE_DIR}/src/gui/state/game.h" - "${CMAKE_SOURCE_DIR}/src/gui/state/game_settings.h" - "${CMAKE_SOURCE_DIR}/src/gui/state/loot_paths.h" - "${CMAKE_SOURCE_DIR}/src/gui/state/loot_settings.h" - "${CMAKE_SOURCE_DIR}/src/gui/state/loot_state.h" - "${CMAKE_SOURCE_DIR}/src/tests/gui/state/game_test.h" - "${CMAKE_SOURCE_DIR}/src/tests/gui/state/game_settings_test.h" - "${CMAKE_SOURCE_DIR}/src/tests/gui/state/loot_paths_test.h" - "${CMAKE_SOURCE_DIR}/src/tests/gui/state/loot_settings_test.h" - "${CMAKE_SOURCE_DIR}/src/tests/gui/state/loot_state_test.h") - -source_group("Header Files\\gui" FILES ${LOOT_GUI_HEADERS}) source_group("Header Files\\api" FILES ${LOOT_API_HEADERS}) source_group("Header Files\\tests" FILES ${LOOT_TESTS_HEADERS}) source_group("Header Files\\tests" FILES ${LOOT_API_TESTS_HEADERS}) -source_group("Header Files\\tests" FILES ${LOOT_GUI_TESTS_HEADERS}) -source_group("Source Files\\gui" FILES ${LOOT_GUI_SRC}) source_group("Source Files\\api" FILES ${LOOT_API_SRC}) source_group("Source Files\\tests" FILES ${LOOT_TESTS_SRC}) source_group("Source Files\\tests" FILES ${LOOT_API_TESTS_SRC}) -source_group("Header Files\\tests" FILES ${LOOT_GUI_TESTS_SRC}) # Include source and library directories. include_directories ("${CMAKE_SOURCE_DIR}/src" "${CMAKE_SOURCE_DIR}/include" ${LIBLOADORDER_INCLUDE_DIRS} ${LIBGIT2_INCLUDE_DIRS} - ${CEF_INCLUDE_DIRS} ${LIBESPM_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${YAML_CPP_INCLUDE_DIRS} @@ -399,7 +282,6 @@ IF (CMAKE_COMPILER_IS_GNUCXX) z crypto rt) - set (LOOT_GUI_LIBS X11) ENDIF () IF (MSVC) @@ -424,8 +306,6 @@ IF (MSVC) winhttp crypt32 Rpcrt4) - set (LOOT_GUI_LIBS comctl32 - Psapi) ENDIF () @@ -448,30 +328,10 @@ add_executable (loot_api_tests ${LOOT_API_TESTS_SRC} ${LOOT_API_TESTS_HEAD add_dependencies (loot_api_tests loot_api GTest testing-metadata testing-plugins) target_link_libraries(loot_api_tests loot_api ${GTEST_LIBRARIES}) -# Build application. -add_executable (LOOT ${LOOT_GUI_SRC} ${LOOT_GUI_HEADERS}) -add_dependencies (LOOT cef loot_api) -target_link_libraries(LOOT ${CEF_LIBRARIES} loot_api ${LOOT_GUI_LIBS}) - -# Build application tests. -add_executable (loot_gui_tests ${LOOT_GUI_TESTS_SRC} ${LOOT_GUI_TESTS_HEADERS}) -add_dependencies (loot_gui_tests loot_api GTest testing-metadata testing-plugins) -target_link_libraries(loot_gui_tests loot_api ${GTEST_LIBRARIES}) - ############################## # Set Target-Specific Flags ############################## -IF (MSVC) - set (LOOT_LINK_FLAGS "/SUBSYSTEM:WINDOWS /LARGEADDRESSAWARE") - get_target_property (EXISTING_LINK_FLAGS LOOT LINK_FLAGS) - IF (EXISTING_LINK_FLAGS) - set (LOOT_LINK_FLAGS "${EXISTING_LINK_FLAGS} ${LOOT_LINK_FLAGS}") - ENDIF () - set_target_properties (LOOT PROPERTIES LINK_FLAGS ${LOOT_LINK_FLAGS}) -ENDIF () - - IF (CMAKE_SYSTEM_NAME MATCHES "Windows") set_target_properties (loot_api_internals_tests PROPERTIES COMPILE_DEFINITIONS "${COMPILE_DEFINITIONS} LOOT_STATIC") IF (BUILD_SHARED_LIBS) @@ -486,42 +346,6 @@ ENDIF () # Post-Build Steps ############################## -IF (CMAKE_SYSTEM_NAME MATCHES "Windows") - add_custom_command( - TARGET LOOT - POST_BUILD - COMMAND "mt.exe" -manifest \"${CMAKE_SOURCE_DIR}/src/gui/LOOT.exe.manifest\" -inputresource:"$(TargetDir)$(TargetFileName)"\;\#1 -outputresource:"$(TargetDir)$(TargetFileName)"\;\#1 - COMMENT "Adding manifest..." - ) -ENDIF () - -# Copy CEF binaries. -FOREACH(cef_dll ${CEF_PRECOMPILED_BINARIES}) - add_custom_command(TARGET LOOT POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "${CEF_PRECOMPILED_BINARIES_DIR}/${cef_dll}" - $/${cef_dll}) -ENDFOREACH() - -# Copy CEF resources. -FOREACH(cef_resource ${CEF_RESOURCES}) - add_custom_command(TARGET LOOT POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "${CEF_RESOURCES_DIR}/${cef_resource}" - $/${cef_resource}) -ENDFOREACH() - -# Copy CEF en-US locale resource. -add_custom_command(TARGET LOOT POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "${CEF_LOCALES_DIR}/${CEF_LOCALE_FILE}" - $/resources/l10n/${CEF_LOCALE_FILE}) - -# Build the UI HTML. -add_custom_command(TARGET LOOT POST_BUILD - COMMAND "node" "${CMAKE_SOURCE_DIR}/scripts/build_ui.js" - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) - # Copy testing metadata ExternalProject_Get_Property(testing-metadata SOURCE_DIR) add_custom_command(TARGET loot_api_internals_tests POST_BUILD @@ -543,3 +367,46 @@ add_custom_command(TARGET loot_api_tests POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${SOURCE_DIR} $) + +######################################## +# Install +######################################## + +install(TARGETS loot_api + DESTINATION ".") + +install(DIRECTORY "${CMAKE_SOURCE_DIR}/include" + DESTINATION ".") + +install(DIRECTORY "${CMAKE_BINARY_DIR}/docs/html/" + DESTINATION "docs") + +######################################## +# CPack +######################################## + +IF (GIT_FOUND) + execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --long --always --abbrev=7 + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_DESCRIBE_STRING + OUTPUT_STRIP_TRAILING_WHITESPACE) + + IF (DEFINED ENV{APPVEYOR_REPO_BRANCH}) + set(GIT_DESCRIBE_STRING "${GIT_DESCRIBE_STRING}_$ENV{APPVEYOR_REPO_BRANCH}") + ELSEIF (DEFINED ENV{TRAVIS_BRANCH}) + set(GIT_DESCRIBE_STRING "${GIT_DESCRIBE_STRING}_$ENV{TRAVIS_BRANCH}") + ENDIF() +ELSE() + SET (GIT_DESCRIBE_STRING "unknown-version") +ENDIF () + +if (CMAKE_SYSTEM_NAME MATCHES "Windows") + set(CPACK_GENERATOR "7Z") +else() + set(CPACK_GENERATOR "TXZ") +endif() + +set(CPACK_PACKAGE_VERSION ${GIT_DESCRIBE_STRING}) +set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}/package") + +include(CPack) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7155cb9e..c4c1d820 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,59 +19,6 @@ Surprise pull requests aren't recommended because everything you touched may hav When you do make a pull request, please do so from a branch which doesn't have the same name as they branch you're requesting your changes to be merged into. It's a lot easier to keep track of what pull request branches do when they're named something like `you:specific-cool-feature` rather than `you:master`. -## Translating LOOT - -### General Information - -LOOT supports translation into other languages, with the following limitations: - -* Debug log messages and error messages generated by the libraries LOOT uses cannot be translated. -* Masterlist messages can be translated, but translations must be submitted to the masterlist maintainers for addition. Translating masterlist messages won't be covered here. -* The languages LOOT supports is hardcoded, so LOOT must be updated to include new translations. - -To translate everything but masterlist messages, first fork this repository. All file paths given below are relative to its base folder. - -### Translating the Installer - -First check that an [Inno Setup translation](http://www.jrsoftware.org/files/istrans/) exists for your language. Unofficial translations are acceptable, but require a bit of extra handling. If there isn't an official or unofficial translation for Inno Setup, you're better off making a translation and getting it listed on the linked page before continuing. - -1. Open the installer script at `scripts/installer.iss` in a text editor of your choice. -2. If your language only has an unofficial translation, add a `#define Exists` block for it near the top of the script, like it has been done for Korean and Simplified Chinese. -3. Add your language to the `[Languages]` section. The `Name` must be the POSIX locale code for your language. The `MessagesFile` filename is the filename of the Inno Setup translation that you checked exists. If your language only has an unofficial translation, wrap its line in `#ifdef` and `#endif` lines, again like it has been done for Korean and Simplified Chinese. -4. Translate the string(s) in the `[CustomMessages]` into your language, following the example of the existing translations. Again, if your language only has an unofficial translation, wrap its line(s) in `#ifdef` and `#endif` lines. -5. Save your changes. - -### Translating the LOOT application - -1. Download and install the latest version of [Poedit](https://poedit.net/). -2. If you are starting a new translation, select `File->New catalogue from POT file...` and choose the template file at `resources/l10n/template.pot`. In the `Catalog properties` dialog, just click `OK` without changing anything. -3. If you are updating a previous translation, open in Poedit the `loot.po` translation file in the relevant subdirectory of `resources/l10n`, then select `Catalogue->Update from POT file...` and choose the template file you downloaded. Click `OK` in the `Update summary` dialog. -4. Edit the translation file to add or update translations of the programs' text. Strings that were added since the last translation are displayed in bold and dark blue, and strings you have edited the translations of are marked with a star to the left of their source text in the main list. -5. Save the translation file with the filename `loot.po` in `resources/l10n//LC_MESSAGES/`, where `` is your language's POSIX locale code. - -Some languages may use different words or phrases for different contexts where only one word or phrase may be used for all contexts in English. While no contextual information is supplied to translators by default, it can be added on request. To request the addition of contextual information to a text string, create an issue for your request in LOOT's [source code issue tracker](https://github.com/loot/loot/issues), quoting the string for which you are requesting contextual information. - -Some strings to be translated may contain special characters. Different types of special character that may be encountered are: - -* Backslashes (`\`). These are used to escape backslashes and double-quotation marks (`"`) in the C++ translation strings. Don't add new backslashes into translations, and make sure all backslashes in the original string are retained in the translation. -* Formatting placeholders are used so that LOOT can substitute text or numbers that are generated at runtime into pre-made strings. They appear in a few different formats: - 1. A number surrounded by percentage signs, eg. `%1%`. - 2. A named placeholder, eg. `%(icon)s` (the name in parentheses must not be changed). - 3. A simple placeholder `%s`. - - If formatting placeholders are used in the untranslated string, they **must all** be present in the translated string, or LOOT will encounter an error when it tries to display the translated string. Placeholders can be moved around so that the sentence makes grammatical sense in the target language. -* A small number of strings also include HTML `` elements that wrap translatable text. While the text inside the elements should be translated, the element tags and their attributes should not be. - -### Adding A New Translation - -If you're adding a new translation, LOOT's source code must be updated to recognise it. You can do this yourself and include the changes in your translation's pull request if you wish. The files and functions which must be updated are given below. - -* In [language_code.h](include/loot/enum/language_code.h), append a value for the language to the `LanguageCode` enum. -* In [language.cpp](src/api/helpers/language.cpp), define the value for the constant you added, and update `Language::Language(LanguageCode code)` and `Language::codes({...})` to include lines for your language. -* In [archive.js](scripts/archive.js), add the language folder to the list returned by `getLanguageFolders()`. -* In [installer.iss](scripts/installer.iss), add an entry for your language's translation file to the `[Files]` section. -* In [localised_content.rst](docs/metadata/data_structures/localised_content.rst), add a row for your language to the Language Codes table. - ## Code Style LOOT's JavaScript uses a slightly tweaked version of the Airbnb style, and can be automatically linted by ESLint, so isn't covered here. diff --git a/README.md b/README.md index 068525b7..d3159442 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # LOOT -[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/loot/loot?branch=dev&svg=true)](https://ci.appveyor.com/project/WrinklyNinja/loot) -[![Travis Build Status](https://travis-ci.org/loot/loot.svg?branch=dev)](https://travis-ci.org/loot/loot) -[![Documentation Status](https://readthedocs.org/projects/loot/badge/?version=latest)](http://loot.readthedocs.io/en/latest/?badge=latest) +[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/loot/loot-api?branch=dev&svg=true)](https://ci.appveyor.com/project/WrinklyNinja/loot-api) +[![Travis Build Status](https://travis-ci.org/loot/loot-api.svg?branch=dev)](https://travis-ci.org/loot/loot-api) +[![Documentation Status](https://readthedocs.org/projects/loot-api/badge/?version=latest)](http://loot-api.readthedocs.io/en/latest/?badge=latest) ## Introduction @@ -10,34 +10,26 @@ LOOT is a plugin load order optimisation tool for TES IV: Oblivion, TES V: Skyri LOOT also provides some load order error checking, including checks for requirements, incompatibilities and cyclic dependencies. In addition, it provides a large number of plugin-specific usage notes, bug warnings and Bash Tag suggestions. -Although LOOT is able to calculate the correct load order positions for the vast majority of mods without any user input, some plugins are designed to load at certain positions in a load order, and LOOT may be unable to determine this from the plugins themselves. As such, LOOT provides a mechanism for supplying additional plugin metadata so that it may sort them correctly. - -LOOT is intended to make using mods easier, and mod users should still possess a working knowledge of mod load ordering. See [Introduction To Load Orders](https://loot.github.io/docs/help/Introduction-To-Load-Orders) for an overview. +The LOOT API provides access to LOOT's metadata and sorting functionality, and the LOOT application is built using it. ## Downloads -Releases are hosted on [GitHub](https://github.com/loot/loot/releases), and snapshot builds are available on [Bintray](https://bintray.com/wrinklyninja/loot). The snapshot build archives are named like so: +Releases are hosted on [GitHub](https://github.com/loot/loot-api/releases), and snapshot builds are available on [Bintray](https://bintray.com/wrinklyninja/loot/loot-api). The snapshot build archives are named like so: ``` -loot_--g_.7z +loot_api---g_-.7z ``` -For example `LOOT v0.7.0-alpha-2-10-gf6d7e80_dev.7z` was built using the revision with shortened commit ID `f6d7e80`, which is `10` revisions after the revision tagged `v0.7.0-alpha-2`, and is on the `dev` branch. - -## Building LOOT +## Building The LOOT API ### Windows -Refer to `appveyor.yml` for the build process. The Appveyor configuration assumes that [CMake](https://cmake.org) and [Node.js](https://nodejs.org/) are already installed. +Refer to `appveyor.yml` for the build process. ### Linux Refer to `.travis.yml` for the build process. A [local Docker image](https://docs.travis-ci.com/user/common-build-problems/#Troubleshooting-Locally-in-a-Docker-Image) can be used to ensure the assumed build environment. -Not all LOOT's features have been implemented for Linux builds. Issues labelled -`linux` on LOOT's issue tracker cover such missing features where they can be -implemented. - ### CMake Variables LOOT uses the following CMake variables to set build parameters: @@ -49,10 +41,6 @@ Parameter | Values | Default |Description You may also need to set `BOOST_ROOT` if CMake cannot find Boost. -### Rebuilding the HTML UI - -The GUI's HTML file is automatically built when building the LOOT GUI binary, but it can also be built by running `node scripts/build_ui.js` from the repository root. - ## Building The Documentation The documentation is built using [Doxygen](http://www.stack.nl/~dimitri/doxygen/), [Breathe](https://breathe.readthedocs.io/en/latest/) and [Sphinx](http://www.sphinx-doc.org/en/stable/). Install Doxygen and Python (2 or 3) and make sure they're accessible from your `PATH`, then run: @@ -61,11 +49,3 @@ The documentation is built using [Doxygen](http://www.stack.nl/~dimitri/doxygen/ pip install -r docs/api/requirements.txt sphinx-build -b html docs build/docs/html ``` - -## Packaging Releases - -Packaging scripts are provided for creating an installer on Windows and compressed archives on Windows and Linux. - -Run the `scripts/installer.iss` [Inno Setup](http://www.jrsoftware.org/isinfo.php) script to build an installer executable in the `build` folder. The script requires the [Inno Download Plugin](https://bitbucket.org/mitrich_k/inno-download-plugin) to be installed. If the unofficial Korean and Simplified Chinese Inno Setup translation files are installed alongside the official translation files, then the installer script will also offer those language options. If they are not found, the installer will be built without them. - -The archive packaging script requires [Git](https://git-scm.com/), and on Windows it also requires [7-Zip](http://7-zip.org), while on Linux it requires `tar` and `xz`. It can be run using `node scripts/archive.js`, and creates archives for LOOT and its API in the `build` folder. The archives are named as described in the Downloads section above. diff --git a/appveyor.yml b/appveyor.yml index 63d2673b..2c1f8fe0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,15 +5,13 @@ version: "{build}-{branch}" configuration: Release platform: - - x64 - Win32 + - x64 matrix: fast_finish: true cache: - - node_modules - - bower_components - C:\projects\boost_1_61_0\boost - C:\projects\boost_1_61_0\stage\32\lib - C:\projects\boost_1_61_0\stage\64\lib @@ -25,10 +23,8 @@ environment: secure: fBQJmUDK/EgEUWjjbo6bWcitczeFTJZT4OZ3ZZ4FoUT6soBsTWPQJnr8YEVMFhGP install: - - choco install -y doxygen.portable InnoSetup imagemagick.tool + - choco install -y doxygen.portable - python -m pip install sphinx breathe sphinx_rtd_theme - - npm install - - .\node_modules\.bin\bower install - ps: (New-Object Net.WebClient).DownloadFile('https://raw.githubusercontent.com/WrinklyNinja/ci-scripts/1.1.0/install_boost.py', "$env:APPVEYOR_BUILD_FOLDER\install_boost.py") - ps: (New-Object Net.WebClient).DownloadFile('https://raw.githubusercontent.com/WrinklyNinja/ci-scripts/1.2.0/delete_old_bintray_versions.py', "$env:APPVEYOR_BUILD_FOLDER\delete_old_bintray_versions.py") - ps: if ($env:PLATFORM -eq "Win32") { $env:ADDRESS_MODEL = '32' } else { $env:ADDRESS_MODEL = '64' } @@ -37,72 +33,35 @@ install: before_build: - cd %APPVEYOR_BUILD_FOLDER% - ps: mkdir build - - set PATH=C:\ProgramData\chocolatey\lib\imagemagick.tool\tools;%PATH%;C:\Program Files\Inkscape - - node scripts\create_ico.js - cd build - ps: | - if ($env:PLATFORM -eq 'Win32') { cmake .. -G "Visual Studio 14 2015" -DBOOST_ROOT="C:\projects\boost_1_61_0" -DBOOST_LIBRARYDIR="C:\projects\boost_1_61_0\stage\32\lib" } else { cmake .. -G "Visual Studio 14 2015 Win64" -DBOOST_ROOT="C:\projects\boost_1_61_0" -DBOOST_LIBRARYDIR="C:\projects\boost_1_61_0\stage\64\lib" } -build_script: - - ps: | - if ($env:PLATFORM -eq 'Win32') { - msbuild "c:\projects\loot\build\LOOT.sln" /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - } else { - msbuild "c:\projects\loot\build\loot_api_internals_tests.vcxproj" /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - msbuild "c:\projects\loot\build\loot_api_tests.vcxproj" /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - } +build: + verbosity: minimal + project: '$(APPVEYOR_BUILD_FOLDER)\build\loot_api.sln' test_script: - - ps: | - if ($env:PLATFORM -eq 'Win32') { - cd $env:APPVEYOR_BUILD_FOLDER - npm test - } - cd %APPVEYOR_BUILD_FOLDER%\build\%CONFIGURATION% - loot_api_internals_tests.exe --gtest_output=xml:loot_api_internals_tests.xml - loot_api_tests.exe --gtest_output=xml:loot_api_tests.xml - - ps: | - if ($env:PLATFORM -eq 'Win32') { - ./loot_gui_tests.exe --gtest_output=xml:loot_gui_tests.xml - } after_test: - cd %APPVEYOR_BUILD_FOLDER% - C:\Python27\Scripts\sphinx-build -b html docs build\docs\html - - ps: | - $env:GIT_DESCRIBE = ((git describe --tags --long --abbrev=7) | Out-String) -replace "`n|`r", "" - if ($env:PLATFORM -eq 'Win32') { - $env:PATH = "$env:PATH;C:\cygwin\bin\" - node scripts\potomo.js - scripts\appveyor\build_installer.ps1 - } - - node scripts\archive.js + - ps: $env:GIT_DESCRIBE = ((git describe --tags --long --always --abbrev=7) | Out-String) -replace "`n|`r", "" + - cd build + - cpack artifacts: - - path: build\loot_$(GIT_DESCRIBE)_$(APPVEYOR_REPO_BRANCH)_$(PLATFORM).7z - name: LOOT - - path: build\loot-api_$(GIT_DESCRIBE)_$(APPVEYOR_REPO_BRANCH)_$(PLATFORM).7z + - path: build\package\loot_api-$(GIT_DESCRIBE)_$(APPVEYOR_REPO_BRANCH)-win$(ADDRESS_MODEL).7z name: API - - path: build\LOOT Installer.exe - name: installer deploy: - - provider: BinTray - username: wrinklyninja - api_key: - secure: fBQJmUDK/EgEUWjjbo6bWcitczeFTJZT4OZ3ZZ4FoUT6soBsTWPQJnr8YEVMFhGP - subject: wrinklyninja - repo: loot - package: loot - version: $(GIT_DESCRIBE)_$(APPVEYOR_REPO_BRANCH) - publish: true - artifact: LOOT - - provider: BinTray username: wrinklyninja api_key: @@ -116,57 +75,26 @@ deploy: - provider: GitHub tag: $(APPVEYOR_REPO_TAG_NAME) - release: LOOT v$(APPVEYOR_REPO_TAG_NAME) + release: LOOT API v$(APPVEYOR_REPO_TAG_NAME) description: | Requires Windows 7 or later and the [MSVC 2015 x86 redistributable](https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x86.exe), and [7-Zip](http://www.7-zip.org/) to extract the archives. ## Change Logs - - [Application](https://loot.readthedocs.io/en/$(APPVEYOR_REPO_TAG_NAME)/app/changelog.html) - - [API](https://loot.readthedocs.io/en/$(APPVEYOR_REPO_TAG_NAME)/api/changelog.html) - - [Metadata Syntax](https://loot.readthedocs.io/en/$(APPVEYOR_REPO_TAG_NAME)/metadata/changelog.html) + - [API](https://loot-api.readthedocs.io/en/$(APPVEYOR_REPO_TAG_NAME)/api/changelog.html) + - [Metadata Syntax](https://loot-api.readthedocs.io/en/$(APPVEYOR_REPO_TAG_NAME)/metadata/changelog.html) *Note: The files below with `tar.xz` extensions contain Linux binaries. They won't work on Windows computers.* auth_token: secure: V1GojGQfrAiQtUWtNNXfm3samiH+1yNF5UYhkn8B8mbif20IGTGWNlBS9E4S0SUC artifact: API draft: false - on: - appveyor_repo_tag: true - platform: x64 - - - provider: GitHub - tag: $(APPVEYOR_REPO_TAG_NAME) - release: LOOT v$(APPVEYOR_REPO_TAG_NAME) - description: | - Requires Windows 7 or later and the [MSVC 2015 x86 redistributable](https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x86.exe), and [7-Zip](http://www.7-zip.org/) to extract the archives. - - ## Change Logs - - [Application](https://loot.readthedocs.io/en/$(APPVEYOR_REPO_TAG_NAME)/app/changelog.html) - - [API](https://loot.readthedocs.io/en/$(APPVEYOR_REPO_TAG_NAME)/api/changelog.html) - - [Metadata Syntax](https://loot.readthedocs.io/en/$(APPVEYOR_REPO_TAG_NAME)/metadata/changelog.html) - - *Note: The files below with `tar.xz` extensions contain Linux binaries. They won't work on Windows computers.* - auth_token: - secure: V1GojGQfrAiQtUWtNNXfm3samiH+1yNF5UYhkn8B8mbif20IGTGWNlBS9E4S0SUC - artifact: LOOT,API,installer - draft: false force_update: true on: appveyor_repo_tag: true - platform: Win32 on_success: - - ps: | - if ($env:bintray_auth_token) { - python "$env:APPVEYOR_BUILD_FOLDER\delete_old_bintray_versions.py" -o loot -g loot -u wrinklyninja -b loot -p loot -t $env:bintray_auth_token -a $env:github_auth_token -n 30 - python "$env:APPVEYOR_BUILD_FOLDER\delete_old_bintray_versions.py" -o loot -g loot -u wrinklyninja -b loot -p loot-api -t $env:bintray_auth_token -a $env:github_auth_token -n 30 - } - - ps: scripts\appveyor\update_masterlist_branches.ps1 + - ps: python "$env:APPVEYOR_BUILD_FOLDER\delete_old_bintray_versions.py" -o loot -g loot-api -u wrinklyninja -b loot -p loot-api -t $env:bintray_auth_token -a $env:github_auth_token -n 30 on_finish: - ps: (New-Object System.Net.WebClient).UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)", "$($env:APPVEYOR_BUILD_FOLDER)\build\$($env:CONFIGURATION)\loot_api_internals_tests.xml") - ps: (New-Object System.Net.WebClient).UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)", "$($env:APPVEYOR_BUILD_FOLDER)\build\$($env:CONFIGURATION)\loot_api_tests.xml") - - ps: | - if ($env:PLATFORM -eq 'Win32') { - (New-Object System.Net.WebClient).UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)", "$($env:APPVEYOR_BUILD_FOLDER)\build\$($env:CONFIGURATION)\loot_gui_tests.xml") - } diff --git a/bower.json b/bower.json deleted file mode 100644 index 3459f3b9..00000000 --- a/bower.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "LOOT", - "private": true, - "ignore": [ - "**/.*", - "node_modules", - "bower_components" - ], - "dependencies": { - "polymer": "Polymer/polymer#1.7.0", - "iron-icons": "PolymerElements/iron-icons#1.2.0", - "iron-list": "loot/iron-list#patched-for-loot", - "iron-pages": "PolymerElements/iron-pages#1.0.8", - "neon-animation": "PolymerElements/neon-animation#1.2.4", - "paper-autocomplete": "ellipticaljs/paper-autocomplete#v1.1.0", - "paper-button": "PolymerElements/paper-button#1.0.14", - "paper-checkbox": "PolymerElements/paper-checkbox#1.4.1", - "paper-dialog": "PolymerElements/paper-dialog#1.1.0", - "paper-dialog-scrollable": "PolymerElements/paper-dialog-scrollable#1.1.5", - "paper-drawer-panel": "PolymerElements/paper-drawer-panel#1.0.10", - "paper-dropdown-menu": "PolymerElements/paper-dropdown-menu#1.4.2", - "paper-icon-button": "PolymerElements/paper-icon-button#1.1.4", - "paper-input": "PolymerElements/paper-input#1.1.22", - "paper-item": "PolymerElements/paper-item#1.2.1", - "paper-listbox": "PolymerElements/paper-listbox#1.1.2", - "paper-menu": "PolymerElements/paper-menu#1.2.2", - "paper-menu-button": "PolymerElements/paper-menu-button#1.5.2", - "paper-progress": "PolymerElements/paper-progress#1.0.11", - "paper-tabs": "PolymerElements/paper-tabs#1.7.0", - "paper-toast": "PolymerElements/paper-toast#1.3.0", - "paper-toggle-button": "PolymerElements/paper-toggle-button#1.2.1", - "paper-toolbar": "PolymerElements/paper-toolbar#1.1.7", - "paper-tooltip": "PolymerElements/paper-tooltip#1.1.3", - "Jed": "SlexAxton/Jed#1.1.1", - "jed-gettext-parser": "1.0.0", - "marked": "0.3.6", - "lodash": "4.17.2", - "octokat": "0.4.18" - } -} diff --git a/docs/app/changelog.rst b/docs/app/changelog.rst deleted file mode 100644 index 41034e57..00000000 --- a/docs/app/changelog.rst +++ /dev/null @@ -1,483 +0,0 @@ -*************** -Version History -*************** - -Only application history is recorded here. A full history of masterlist changes may be viewed by browsing the GitHub repositories. - -0.10.3 - 2017-01-08 -=================== - -Added ------ - -- LOOT now creates a backup of the existing load order when applying a sorted load order. The backup is stored in LOOT's folder for the current game, and up to the three most recent backups are retained. - -Changed -------- - -- If no game is detected when LOOT is launched and a valid game path or Registry key pointing to a game path is added in the Settings dialog, LOOT will select that game and refresh its content when the new settings are applied. -- Most exception-derived errors now display a generic error message, as exception messages are no longer translatable. Only metadata syntax exceptions still have their message displayed in the UI. -- Improved robustness of error handling when calculating file CRCs. -- Improved consistency of error logging. -- Errors and warnings are now always logged, even when debug logging is disabled. -- The First Time Tips and About dialogs are now fully translatable, with the exception of the legal text in the About dialog. -- Updated Russian translation. - -Fixed ------ - -- A crash on startup if none of the supported games were detected. -- A crash when applying settings when none of the supported games are detected. -- Buttons and menu items for performing game-specific operations are now disabled while none of the supported games are detected. -- Initialisation error messages were formatted incorrectly. -- An error message reading ``Cannot read property 'textContent' of undefined`` could be displayed on startup due to UI elements initialising later than expected. -- The texts of the first plugin card and sidebar item were not being translated. -- LOOT now logs being unable to find a game's registry entry as ``[info]``, not ``[error]``. -- If an error was encountered while loading a userlist, constructing the error message produced a ``boost::too_many_args`` error that obscured the original error. -- The installer now checks for v14.0.24215 of the MSVC Redistributable, it was previously checking for v14.0.24212, which some users found insufficient. - - -0.10.2 - 2016-12-03 -=================== - -Added ------ - -- Support for specifying the path to use for LOOT's local data storage, via the ``--loot-data-path`` parameter. - -Changed -------- - -- The metadata editor now displays an error message when the user inputs invalid priority values, in addition to the input's existing red underline styling for invalid values, and instead of validating the values when trying to save the metadata. -- LOOT's icon now scales better for high-DPI displays. -- LOOT's UI is now built as many loose files instead of one large HTML file, to aid debugging and development. -- Updated Chinese translation. -- Updated Chromium Embedded Framework to 3.2840.1517.gd7afec5. -- Updated libgit2 to 0.24.3. -- Updated Polymer to 1.7.0, and also updated various Polymer elements. - -Fixed ------ - -- A crash could occur if some plugins that are hardcoded to always load were missing. Fixed by updating to libloadorder v9.5.4. -- Plugin cleaning metadata with no ``info`` value generated a warning message with no text. -- The LOOT update checker will no longer display an empty error dialog if the update check is unable to connect to the GitHub API (eg. if offline). -- Redate Plugins was accidentally disabled for Skyrim SE in v0.10.1, and had no effect for Skyrim SE in v0.10.0. -- Having more than ~ 100 plugins installed could make the sidebar's plugin list appear on top of dialogs. -- More UI text has been made available for translation. -- Tweak some text formatting to include more context for translators. -- Dirty plugin warning messages now distinguish between singular and plural forms for their ITM, deleted reference and deleted navmesh counts, to allow the construction of more grammatically-correct messages in English and other languages. -- The UI text for the metadata editor was always displayed in English even when LOOT was set to use another language, despite translations being available. -- It was possible to open the metadata editor during sorting by double-clicking a plugin in the sidebar. -- Removed a duplicate section in the documentation for editing metadata. - -0.10.1 - 2016-11-12 -=================== - -Changed -------- - -- When saving a load order for Fallout 4 or Skyrim SE, the official plugins (including DLC plugins) are no longer written to ``plugins.txt`` to match game behaviour and improve interoperability with other modding utilities. -- LOOT now uses ``Skyrim Special Edition`` as the folder name for storing its Skyrim SE data, to mirror the game's own folder naming and improve interoperability with other modding utilities, and automatically renames any ``SkyrimSE`` folder created by LOOT v0.10.0. -- Updated Russian translation. -- Updated Chinese translation. - -Fixed ------ - -- When saving a load order for Fallout 4 or Skyrim SE, the positions of official plugins (including DLC plugins) in ``plugins.txt`` are now ignored if they are present and a hardcoded order used instead. Note that there is a bug in Skyrim SE v1.2.39 that causes the DLC plugins to be loaded in timestamp order: this behaviour is ignored. -- If the LOOT installer installed the MSVC redistributable, the latter would silently force a restart, leading to possible data loss. -- It was possible to open the metadata editor between sorting and applying/cancelling a sorted load order, which would then cause an error when trying to close the editor. The editor is now correctly disabled during the sort process. - - -0.10.0 - 2016-11-06 -=================== - -Added ------ - -- Support for TES V: Skyrim Special Edition. -- Swedish translation by Mikael Hiort af Ornäs (Lakrits). -- More robust update checker, so now LOOT will notify users of an update without needing a masterlist to be present or for it to be updated for the new release, and will also detect when the user is using a non-release build with the same version number. - -Changed -------- - -- LOOT now supports v0.10 of the metadata syntax. This breaks compatibility with existing syntax, which may cause existing user metadata to fail to load. See :doc:`the syntax version history <../metadata/changelog>` for the details. -- The Global Priority toggle button in the metadata editor has been replaced with an input field to reflect the change in syntax for global priorities. -- Added a "Clean Plugin Info" tab to the metadata editor, for editing metadata that identifies a plugin as being clean. -- Added a "Verified clean" icon to plugin cards that is displayed for plugins that are identified as clean. -- All operations triggered from the UI are now processed asynchronously, which may have a minor positive effect on perceived performance. -- Error messages displayed in dialog boxes no longer include an error code. -- Rewrote the documentation, which is now hosted online at `Read The Docs`_. -- Updated Simplified Chinese translation. -- Updated Russian translation. -- Updated German translation. -- Updated Danish translation. -- Updated CEF to 3.2840.1511.gb345083 and libgit2 to 0.24.2. - -.. _Read The Docs: https://loot.readthedocs.io/ - -Fixed ------ - -- Cached plugin CRCs causing checksum conditions to always evaluate to false. -- Data being loaded twice when launching LOOT. -- Updating the masterlist when the user's ``TEMP`` and ``TMP`` environmental variables point to a different drive than the one LOOT is installed on. -- Incorrect error message display when there was an issue during initialisation. -- Sidebar plugin load order indices not updating when sorting changed plugin positions. -- The "Has User Metadata" icon not displaying when priority metadata was changed. - -0.9.2 - 2016-08-03 -================== - -Added ------ - -- Theming support and the dark theme have been reimplemented and reintroduced. -- Plugin filename and Bash Tag name fields will now autocomplete in the metadata editor. -- The in-game load order indices of active plugins are now displayed in the sidebar. - -Changed -------- - -- Most URLs now use HTTPS. -- The Danish and French translations have been updated. -- The CEF (3.2743.1442.ge29124d), libespm (2.5.5), Polymer (1.6.0) and Pseudosem (1.1.0) dependencies have been updated to the versions given in brackets. - -Fixed ------ - -- Error when applying filters on startup. -- Hidden plugin and message counters not updating correctly after sorting. -- An error occurring when the user's temporary files directory didn't exist and updating the masterlist tried to create a directory there. -- The installer failing if LOOT was previously installed on a drive that no longer exists. The installer now always gives the option to change the default install path it selects. -- Startup errors being reported incorrectly and causing additional errors that prevented the user from being informed of the original issue. -- The metadata editor's CRC input field being too short to fully display its validation error message. -- Errors when reading some Oblivion plugins during sorting, including the official DLC. -- Some cases where LOOT would fail to start. -- The conflict filter not including the Unofficial Skyrim Legendary Edition Patch's plugin (and any other plugin that overrides a very large number of records) in results. -- The "not sorted" message reappearing if the load order was sorted twice in one session and cancelled the second time. -- Version numbers where a digit was immediately followed by a letter not being detected. - -0.9.1 - 2016-06-23 -================== - -Added ------ - -- Support for Fallout 4's Contraptions Workshop DLC, and the upcoming Vault-Tec Workshop and Nuka-World DLC. Support for the latter two is based on their probable but unconfirmed plugin names, which may be subject to change. - -Changed -------- - -- The content refresh menu item is now disabled during sorting. -- The conflicts filter toggle buttons have been removed from the plugin card menus, and the filter re-implemented as a dropdown menu of plugin names in the Filters sidebar tab. -- Enabling the conflicts filter now scrolls to the target plugin, which is no longer highlighted with a blue border. -- The layout of the Filters sidebar tab has been improved. -- The CEF (3.2704.1427.g95055fe), and libloadorder (9.4.0) dependencies have been updated to the versions given in brackets. -- Some code has been refactored to improve its quality. - -Removed -------- - -- Support for Windows Vista. - -Fixed ------ - -- User dirty metadata being read-only in the metadata editor. -- LOOT incorrectly reading a tag with no name from plugin descriptions containing ``{{BASH:}}``. - -0.9.0 - 2016-05-21 -================== - -Added ------ - -- Support for Fallout 4. -- A warning message is displayed in the General Information card if the user has not sorted their load order in the current LOOT session. -- An error message is displayed in the General Information card when a cyclic interaction sorting error is encountered, and remains there until sorting is next attempted. - -Changed -------- - -- Improve sorting performance by only reading the header when loading game's main master file. -- References to "BSAs" have been replaced with the more generic "Archives" as Fallout 4's BSA equivalents use a different file extension. -- The sorting process now recognises when the sorted load order is identical to the existing load order and informs the user, avoiding unnecessary filesystem interaction. -- The metadata editor has been reimplemented as a single resizeable panel displayed below the plugin card list instead of a separate editor for each plugin card. -- Editable table styling has been improved to more closely align to the Material Design guidelines. -- Minor UI changes have been made to scrollbar and focus outline styling to improve accessibility. -- UI interaction performance has been improved, especially when scrolling the plugin card list. -- The PayPal donation link now points to the PayPal.Me service, which has a more polished UX and lower fees. -- LOOT's settings file handling has been reimplemented, fixing crashes due to invalid settings values and allowing missing settings to use their default values. -- Plugin version string extraction has been reimplemented, improving its accuracy and maintainability. -- Plugin CRC, file and version condition evaluation has been optimised to use cached data where it exists, avoiding unnecessary filesystem interaction. -- The French and Danish translations have been updated. -- The installer now only creates one shortcut for LOOT in the Start menu, following Microsoft guidelines. -- A lot of code has been refactored and improved to increase its quality. -- The Boost (1.60), CEF (3.2623.1401.gb90a3be), libespm (2.5.2), libgit2 (0.24.1), libloadorder (9.3.0) and Polymer (1.4) dependencies have been updated to the versions given in brackets. - -Removed -------- - -- The Flattr donation link. -- The experimental theming support, as its implementation was incompatible with Polymer 1.2's styling mechanisms. - -Fixed ------ - -- Redate Plugins attempted to redate plugins that were missing, causing an error. -- LOOT would not launch when run by a user with a non-ASCII local application data path. -- Sorting processed priority value inheritance throughout the load order incorrectly, leading to some plugins being positioned incorrectly. -- The conflict filter displayed only the target plugin when enabled for the first time in a session. -- The behaviour of the search functionality was inconsistent. -- Duplicate messages could be displayed under certain circumstances. -- Opening the metadata editor for one plugin displayed the metadata for another plugin under certain circumstances. -- Changing the current game quickly could leave the UI unresponsive. -- Applying a filter then scrolling the plugin card list would display some cards with no content. -- Plugin cards would disappearing when jumping to a plugin card near the bottom of the load order using the sidebar. -- Clicking on a disabled element in a dropdown menu would cause the menu to close. -- The UI font size was too large, due to a misunderstanding of the Material Design guidelines. -- Attempting to build native Linux and 64-bit executables produced errors. Such builds are unsupported and no official builds are planned. - -0.8.1 - 2015-09-27 -================== - -Added ------ - -- Checks for safe file paths when parsing conditions. - -Changed -------- - -- Updated Chinese translation. -- Updated Boost (1.59.0), libgit2 (0.23.2) and CEF (branch 2454) dependencies. - -Fixed ------ - -- Crash when loading plugins due to lack of thread safety. -- The masterlist updater and validator not checking for valid condition and regex syntax. -- The masterlist updater not working correctly for Windows Vista users. - -0.8.0 - 2015-07-22 -================== - -Added ------ - -- Support for loading custom user interface themes, and added a dark theme. - -Changed -------- - -- Improved detail of metadata syntax error messages. -- Improved plugin loading performance for computers with weaker multithreading capabilities (eg. non-hyperthreaded dual-core or single-core CPUs). -- LOOT no longer displays validity warnings for inactive plugins. -- LOOT now displays a more user-friendly error when a syntax error is encountered in an updated masterlist. -- Metadata syntax support changes, see the metadata syntax document for details. -- LOOT's installer now uses Inno Setup instead of NSIS. -- LOOT's installer now uninstalls previous versions of LOOT silently, preserving user data, instead of displaying the uninstaller UI. -- Updated German and Russian translations. -- Updated libgit2 to v0.23.0. - -Fixed ------ - -- "Cannot read property 'push' of undefined" errors when sorting. -- Many miscellaneous bugs, including initialisation crashes and incorrect metadata input/output handling. -- Metadata editors not clearing unsaved edits when editing is cancelled. -- LOOT silently discarding some non-unique metadata: an error message will now be displayed when loading or attempting to apply such metadata. -- Userlist parsing errors being saved as general messages in the userlist. -- LOOT's version comparison behaviour for a wide variety of version string formats. This involved removing LOOT's usage of the Alphanum code library. - -0.7.1 - 2015-06-22 -================== - -Added ------ - -- Content search, accessible from an icon button in the header bar, and using the Ctrl-F keyboard shortcut. -- "Copy Load Order" feature to main menu. - -Changed -------- - -- LOOT now uses versioned masterlists, so that new features can be used without breaking LOOT for users who haven't yet updated. -- Moved content filter into Filters sidebar tab. The Ctrl-F keyboard shortcut no longer focusses the content filter. -- Checkbox-toggled filters now have their last state restored on launch. -- Darkened background behind cards to increase contrast. -- Updated French translation. - -Fixed ------ - -- LOOT UI opening in default browser on launch. -- "No existing load order position" errors when sorting. -- Message filters being ignored by plugin cards after navigating the list. -- Output of Bash Tag removal suggestions in userlists. -- Display of masterlist revisions where they were wrongly interpreted as numbers. - -0.7.0 - 2015-05-20 -================== - -Added ------ - -- Danish and Korean translations. -- If LOOT can't detect any installed games, it now launches to the settings dialog, where the game settings can be edited to allow a game to be detected. -- A "Copy Content" item in the main menu, to copy the plugin list and all information it contains to the clipboard as YAML-formatted text. -- A "Refresh Content" item in the main menu, which re-scans plugin headers and updates LOOT's content. -- LOOT is now built with High DPI display support. -- Masterlist updates can now be performed independently of sorting. -- A "First-Time Tips" dialog will be displayed on the first run of any particular version of LOOT. -- Attempting to close LOOT with an unapplied sorted load order or an open plugin editor will trigger a confirmation dialog. -- Support for GitHub Flavored Markdown in messages, minus features specific to the GitHub site, such as @mentions and emoji. -- Support for message content substitution metadata syntax in the masterlist. -- Display of LOOT's build revision has been added to the "About" dialog. -- Plugin location metadata can now be added through the user interface. -- A content filter, which hides plugins that don't have the filter text present in their filenames, versions, CRCs, Bash Tags or messages. - -Changed -------- - -- New single-window HTML5-based interface and a new icon, based on Google's Material Design. - - - LOOT now parses the masterlist and plugin headers on startup, and the resulting content is displayed with the plugins in their current load order. - - Each plugin now has its own editor, and multiple editors can be opened at once. - - Drag 'n' drop of plugins from the sidebar into metadata editor tables no longer requires the conflicts filter to be enabled. - - CRCs are calculated during conflict filtering or sorting, so are notdisplayed until either process has been performed. - - The "View Debug Log" menu item has been replaced with a "Open Debug Log Location" menu item to make it easier to share the file itself. - - Debug logging control has been simplified to enable/disable, replacing the "Debug Verbosity" setting with an "Enable Debug Logging" toggle. - - Changes to game settings now take immediate effect. - - Masterlist updating now exits earlier if the masterlist is already up-to-date. - - Masterlist revisions are now displayed using the shortest unique substring that is at least 7 characters long. - - Making edits to plugin metadata before applying a calculated load order no longer causes LOOT to recalculate the load order. Instead, the displayed load order is applied, and the metadata edits will be applied the next time sorting is performed. - - All references to "UDRs" have been replaced by the more technically-correct "Deleted References" term. - - The "Hide inactive plugin messages" filter has been replaced by a "Hide inactive plugins" filter. - - Copied metadata is now wrapped in BBCode ``[spoiler][code]...[/code][/spoiler]`` tags for easier pasting into forum posts. - - The Summary and General Messages cards have been combined into a General Information card. - -- Sorting performance improvements. -- Updated Boost (1.58.0), libgit2 (0.22.2) and libloadorder dependencies. - -Removed -------- - -- Messages with multiple language strings can no longer be created through the user interface. User-added multiple-language messages will be converted to single-language strings if their plugin's editor is opened then closed using the "OK" button. -- The "Copy Name" menu item has been removed, as plugin names can now be selected and copied using ``Ctrl-C``. -- As LOOT no longer generates reports, it doesn't save them either. - -Fixed ------ - -- The ``settings.yaml`` included with the installer was very old. -- Inactive incompatibilities were displayed as error messages. They are now displayed as warnings. -- Masterlist entries that matched the same plugin were not being merged. Now one exact match and any number of regex matches will be merged. -- Masterlist updating failed when a fast-forward merge was not possible (eg. when remote has been rebased, or a different repository is used). Such cases are now handled by deleting the local repository and re-cloning the remote. -- Masterlist updating failed when the path to LOOT's folder included a junction link. -- Masterlists would not 'update' to older revisions. This can be useful for testing, so now they can do so. -- Crashes when trying to read corrupt plugins and after masterlist update completion. -- LOOT would crash when trying to detect a game installed to a location in which the user does not have read permissions, now such games are treated as not being installed. -- Plugins with non-ASCII description text would cause ``codecvt to wstring`` errors. -- LOOT would accept any file with a ``.esp`` or ``.esm`` extension as a plugin. It now checks more thoroughly, by attempting to parse such files' headers. -- LOOT would only detect Skyrim plugins as loading BSAs. Plugins for the other games that also load BSAs are now correctly detected as such. -- Depending on the plugins involved, sorting could produce a different load order every time it was run. Sorting now produces unchanging load orders, using existing load order position where there is no reason to move a plugin. - -0.6.1 - 2014-12-22 -================== - -Added ------ -- German translation. -- The Large Address Aware flag to the LOOT executable. - -Changed -------- -- Updated Boost (1.57.0), wxWidgets (3.0.2) and libloadorder (6.0.3) dependencies. -- The game menu is now updated when the settings window is exited with the "OK" button. -- Updated Russian translation. -- Updated Brazilian Portuguese translation. - -Fixed ------ - -- Default Nehrim registry entry path. -- Messages in the wrong language being selected. -- LOOT windows opening off-screen if the screen area had been changed since last run. -- Read-only ``.git`` folders preventing repository deletion. -- Unnecessary plugins in cyclic dependency error messages. -- Bash Tag suggestions displaying incorrectly. -- The current game can no longer be deleted from the settings window. -- Plugin metadata being lost when the settings window was exited with the "OK" button, leading to possible condition evaluation issues. -- A blank report bug when running on systems which don't have Internet Explorer 11 installed. -- Reports appearing empty of all content when no global messages are to be displayed. - -Security --------- - -- Updated libgit2 to 0.21.3, which includes a fix for a critical security vulnerability. - - -0.6.0 - 2014-07-05 -================== - -Added ---------- - -- Display of masterlist revision date in reports. -- Report filter for inactive plugin messages. -- The number of dirty plugins, active plugins and plugins in total to the report summary. -- A find dialog to the report viewer, initiated using the ``Ctrl-F`` keyboard shortcut. -- LOOT's windows now remember their last position and size. -- Command line parameter for selecting the game LOOT should run for. -- Finnish translation. - -Changed -------- - -- Unified and improved the metadata editors launched during and outside of sorting. - - - The metadata editor now resizes more appropriately. - - The mid-sorting instance hides the requirement, incompatibility, Bash Tags, dirty info and message lists. - - Both instances now have a conflict filter, priority display in their plugin list and drag 'n' drop from the plugin list into whatever metadata lists are visible. - - The mid-sorting instance also hides the load after entry edit button, and the button to add new entries (so drag 'n' drop is the only available method of adding entries). - - The metadata editor now displays plugins with user edits using a tick beside their name, rather than bolding their name text. - - Plugins that have been edited in the current instance have their list entry text bolded. - - Checkboxes have been added to set whether or not a priority value is "global". The UI also now displays the priority value used in comparisons (ie. with the millions and higher digits omitted). - - A right-click menu command for clearing all user-added metadata for all plugins has been added to the metadata editor. - -- Missing master/requirement and incompatibility errors are downgraded to warnings if the plugin in question is inactive. -- Masterlist update errors have been made more user-friendly. -- If an error is encountered during masterlist update, LOOT will now silently delete the repository folder and attempt the update again. If it fails again, it will then report an error. -- Masterlist update now handles repository interaction a lot more like Git itself does, so should be less error-prone. -- Cyclic dependency error messages now detail the full cycle. -- LOOT's report now uses a static HTML file and generates a javascript file that is dynamically loaded to contain the report data. This removes the PugiXML build dependency. -- Debug log message priorities adjusted so that medium verbosity includes more useful data. -- Updated dependencies: libgit2 (v0.21.0), wxWidgets (v3.0.1), libloadorder (latest), libespm (latest). - -Removed --------- - -- Support for Windows XP. -- Support for loading BOSS masterlists using the API. This was a leftover from when LOOT was BOSSv3 and backwards compatibility was an issue. -- The ability to open reports in an external browser. This was necessitated by the changes to report generation. -- The MSVC 2013 redistributable requirement. -- The "None Specified" language option is no longer available: English is the new default. - -Fixed ------ - -- The uninstaller not removing the Git repositories used to update the masterlists. -- Miscellaneous crashes due to uncaught exceptions. -- Plugin priorities are now temporarily "inherited" during sorting so that a plugin with a low priority that is made via metadata to load after a plugin with a high priority doesn't cause other plugins with lower priorities to be positioned incorrectly. -- The default language is now correctly set to English. -- Defaults for the online masterlist repository used for Nehrim. -- Endless sorting loop that occurred if some user metadata was disabled. - -0.5.0 - 2014-03-31 -================== - -- Initial release. diff --git a/docs/app/contributing.rst b/docs/app/contributing.rst deleted file mode 100644 index 9a611c10..00000000 --- a/docs/app/contributing.rst +++ /dev/null @@ -1,17 +0,0 @@ -********************** -Contributing & Support -********************** - -LOOT is very much a community project, and contributions from its users are very welcome, whether they be metadata, translations, code or anything else. The best way to contribute is to `make changes yourself`_ at GitHub! It's the fastest way to get changes you want applied, and you'll get your name automatically immortalised in our `credits`_. - -If you encounter an issue with LOOT, check the `Frequently Asked Questions`_ page in case a solution is available there. -Otherwise, general discussion and support takes place in LOOT's official forum thread, which is linked to on `LOOT's homepage`_. - -If you want to submit metadata, the easiest way to do so is to add the metadata to your own LOOT install, then use the Copy Metadata feature to easily get it in a form that you can then edit into a masterlist on GitHub or post in the official forum threads. - -Information on dirty plugins is very welcome, but for such information to be useful we require at least the filename and the CRC of the dirty plugin. The CRC may be calculated using Wrye Bash or 7-Zip, with other sources being unverified as correct. In the case of 7-Zip, the "CRC checksum for data" is the one required. Any other information, such as the ITM record and deleted reference counts, is very welcome. - -.. _make changes yourself: https://loot.github.io/docs/contributing/How-To-Contribute -.. _credits: https://loot.github.io/credits/ -.. _Frequently Asked Questions: https://loot.github.io/docs/help/LOOT-FAQs -.. _LOOT's homepage: https://loot.github.io/ diff --git a/docs/app/credits.rst b/docs/app/credits.rst deleted file mode 100644 index 20c8556c..00000000 --- a/docs/app/credits.rst +++ /dev/null @@ -1,43 +0,0 @@ -******* -Credits -******* - -LOOT is developed on `GitHub`_, and a full list of GitHub contributors may be found `here`_. - -LOOT's masterlists were largely converted from `BOSS`_'s masterlists, and so credit is due to the very large number of sources and people who have contributed to them. - -In addition, the following are credited with application-related support: - -* Original icon: jonwd7 -* Translations: - - * Brazilian Portuguese: Kassane - * Chinese: bluesky404 - * Danish: Freso - * Finnish: 3ventic - * French: Kaos - * German: lpradel - * Korean: SteamB23 - * Polish: Łukasz Niemczyk - * Russian: Tokc.D.K. - * Spanish: Sharlikran - * Swedish: Mikael Hiort af Ornäs - -* Beta testing: Too many to list, thank you all! - -LOOT is written in C/C++, HTML5, CSS3 and JavaScript, and uses the `Boost`_, `Jed`_, `Jed Gettext Parser`_, `libespm`_, `libgit2`_, `libloadorder`_, `Marked`_, `pseudosem`_, `Polymer`_ and `yaml-cpp`_ libraries, and the `Chromium Embedded Framework`_. - -.. _GitHub: https://github.com/loot/ -.. _here: https://loot.github.io/credits/ -.. _BOSS: https://boss-developers.github.io/ -.. _Boost: http://www.boost.org/ -.. _Jed: https://github.com/SlexAxton/Jed -.. _Jed Gettext Parser: https://github.com/WrinklyNinja/jed-gettext-parser -.. _libespm: https://github.com/WrinklyNinja/libespm -.. _libgit2: https://github.com/libgit2/libgit2 -.. _libloadorder: https://github.com/WrinklyNinja/libloadorder -.. _Marked: https://github.com/chjj/marked -.. _pseudosem: https://github.com/WrinklyNinja/pseudosem -.. _Polymer: https://www.polymer-project.org/ -.. _yaml-cpp: https://github.com/loot/yaml-cpp -.. _Chromium Embedded Framework: https://bitbucket.org/chromiumembedded/cef diff --git a/docs/app/installation.rst b/docs/app/installation.rst deleted file mode 100644 index 0b08d1d6..00000000 --- a/docs/app/installation.rst +++ /dev/null @@ -1,14 +0,0 @@ -***************************** -Installation & Uninstallation -***************************** - -**LOOT requires Windows 7 or later.** - -LOOT can be installed either using its automated installer or manually. If you are using the installer, just run it and follow the wizard steps. If installing manually, extract the downloaded archive to a location of your choice, then download and install the `MSVC 2015 x86 redistributable`_ if you don't already have it installed. - -If LOOT was installed using the installer, then use the uninstaller linked to in the Start Menu to uninstall LOOT. If LOOT was installed manually: - -1. Delete the files you extracted from the location you chose. -2. Delete the ``LOOT`` folder in your local application data folder, which can be accessed by entering ``%LOCALAPPDATA%`` into Windows' File Explorer. - -.. _MSVC 2015 x86 redistributable: https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x86.exe diff --git a/docs/app/introduction.rst b/docs/app/introduction.rst deleted file mode 100644 index 1b146a68..00000000 --- a/docs/app/introduction.rst +++ /dev/null @@ -1,13 +0,0 @@ -************ -Introduction -************ - -LOOT is a plugin load order optimiser for TES IV: Oblivion, TES V: Skyrim, TES V: Skyrim Special Edition, Fallout 3, Fallout: New Vegas and Fallout 4. It is designed to assist mod users in avoiding detrimental conflicts, by automatically calculating a load order that satisfies all plugin dependencies and maximises each plugin's impact on the user's game. - -LOOT also provides some load order error checking, including checks for requirements, incompatibilities and cyclic dependencies. In addition, it provides a large number of plugin-specific usage notes, bug warnings and Bash Tag suggestions for Wrye Bash. - -While LOOT is able to calculate correct load order positions for the vast majority of plugins using only their content, it cannot do so for all plugins. As such, LOOT provides a mechanism for supplying additional plugin metadata so that it may sort them correctly. An online *masterlist* is provided to supply metadata for many plugins that need it, while users can make their own metadata additions, which are saved in their *userlist*. - -LOOT is intended to make using mods easier, and mod users should still possess a working knowledge of mod load ordering. See `Introduction To Load Orders`_ for an overview. - -.. _Introduction To Load Orders: https://loot.github.io/docs/help/Introduction-To-Load-Orders diff --git a/docs/app/theme.rst b/docs/app/theme.rst deleted file mode 100644 index 16c0c9c3..00000000 --- a/docs/app/theme.rst +++ /dev/null @@ -1,5 +0,0 @@ -****** -Themes -****** - -LOOT's user interface has CSS theming support. A dark theme is provided with LOOT: to use it, rename ``dark-theme.css`` in the ``resources/ui/css`` folder to ``theme.css``. A working knowledge of CSS is required to create new themes, though the provided dark theme CSS file is commented to provide some assistance. diff --git a/docs/app/usage/editor.rst b/docs/app/usage/editor.rst deleted file mode 100644 index 8ccd5afb..00000000 --- a/docs/app/usage/editor.rst +++ /dev/null @@ -1,80 +0,0 @@ -*********************** -Editing Plugin Metadata -*********************** - -LOOT uses metadata to supply plugins with messages and Bash Tag suggestions, and to help it sort plugins that it can't otherwise sort correctly. Users can add to their plugins' metadata through the metadata editor panel, and plugins with user metadata are indicated with a "Has User Metadata" icon. - -The editor panel is accessed by clicking the "Edit Metadata" item in a plugin's menu, or by double-clicking a plugin name in the sidebar. Only one plugin's metadata can be edited at a time. While the editor panel is open, the plugin sidebar also displays any non-zero plugin priorities, to aid setting new priority values. The editor can be resized by grabbing the top of the editor's header and dragging it up or down. - -The editor's header displays the name of the plugin being edited, "Save Metadata" and "Cancel" buttons, and a row of tabs. The MAIN tab's page contains the following inputs: - -- The "Enable Edits" toggle must be on for LOOT to use any user-added metadata during sorting, otherwise it will be ignored. -- The "Global Priority" input sets the plugin's global priority value, which is used to modify plugin position relative to all other plugins. Plugins with higher priority values load after plugins with lower priority values. Plugins have a default global priority of 0. -- The "Priority Value" input sets the plugin's local priority value, which is used to modify plugin position relative to other plugins that conflict, load archives or are empty. Plugins with higher priority values load after plugins with lower priority values. Plugins have a default local priority of 0. - -The other tab pages contain metadata tables, which are detailed below. New rows can be added, and existing user-added rows can be removed, though rows containing metadata from the masterlist cannot. The LOAD AFTER, REQUIREMENTS and INCOMPATIBILITIES tables can have rows added by dragging and dropping plugins from the sidebar into the table area. - -LOAD AFTER - This is a list of plugins which, if present, the current plugin must load after, but which are not required. This metadata can be used for resolving specific compatibility issues. Each entry has three fields: - - - The filename is the path, relative to the game's Data folder, of the file to be checked for. This field is required. It gives the filenames of installed plugins as autocomplete suggestions. - - The display name is optional, and if specified will be used instead of the filename in any error messages that are displayed if a problem is encountered relating to the file. - - The condition is the optional condition string that is used to determine if the file should be checked for. If left blank, the file will always be checked for. Condition strings are a relatively advanced part of LOOT's functionality, and their syntax is covered in the Metadata Syntax documentation. - -REQUIREMENTS - This is a list of files that are required by the current plugin for it to function correctly. The current plugin will be loaded after any plugins listed. LOOT will also display an error message if any of the listed files are missing. Any file, not just plugins, can be listed here, and each entry has the same three fields as for the load after table. - - Note that listing a plugin's masters as requirements is unnecessary, as LOOT already checks them. - -INCOMPATIBILITIES - This is a list of files that are incompatible with the plugin. LOOT will display an error message if any of the listed files are found. Any file, not just plugins, can be listed here, and each entry has the same three fields as for the load after table. - -MESSAGES - A list of messages that are to be displayed for the plugin in LOOT's report. These have no bearing on a plugin's position in the load order. Each message has four fields: - - - The type is fairly self-explanatory, and is used to provide messages of varying severity with appropriate emphasis in LOOT's report. - - The content is the actual message text. - - The condition is, like for the corresponding file field, used to determine if the message should be displayed. If left blank, the message is displayed. - - The language is the language LOOT runs in that the message will be displayed for. This field has no effect for user-added messages, as they cannot contain multiple localisations, and LOOT will always display messages that have only one localisation, even if it doesn't match the current language. - - If a message's condition determines that it should not be displayed, then it will not be displayed, no matter the language. However, if a message's condition determines that it should be displayed, but the language is specified and doesn't match the language LOOT is running in, the message will not be displayed. - -BASH TAGS - A list of Bash Tags. These are used by Wrye Bash when generating a Bashed Patch, and are detailed in `Wrye Bash's readme`_. LOOT's metadata includes Bash Tag addition and removal suggestions, and any Bash Tags that came with the plugin are also displayed. - - As LOOT can suggest Bash Tags be added or removed, it is possible for the same Tag to appear twice, being suggested for addition and removal. In such cases, removal overrides addition. - - Each Bash Tag has three fields: - - - The state determines whether the Tag is to be suggested for addition or removal. - - The name is the actual Bash Tag name. The field gives autocomplete suggestions for Bash Tags supported by the current game. - - The condition decides if the Tag is to be suggested or not. It functions as for files and messages. - - If a plugin's masters are missing, an error message will be displayed for it. Filter patches are special mods designed for use with a Bashed Patch that do not require all their masters to be present, and so any plugin with the Filter tag applied and missing masters will not cause any errors to be displayed. - -DIRTY PLUGIN INFO - A list of dirty plugin CRCs and related information. Each row has five fields: - - - The CRC of the dirty plugin. - - The ITM Count for the dirty plugin. - - The number of Deleted References that the dirty plugin contains. - - The number of Deleted Navmeshes that the dirty plugin contains. - - The name of the Cleaning Utility to use to clean the dirty plugin. - - LOOT uses the information supplied to construct a warning message for the plugin if it matches any of the given CRCs. - -CLEAN PLUGIN INFO - A list of clean plugin CRCs and the utility they were verified clean by. Each row has two fields: - - - The CRC of the clean plugin. - - The name of the Cleaning Utility to use to verify that the plugin is clean. - - LOOT uses the information supplied to display an icon on the plugin's card if it matches any of the given CRCs. - -LOCATIONS - A list of URLs that the mod to which the plugin belongs can be found at. This metadata is not currently used by LOOT, but it may be useful to record it. Each location has two fields: - - - The URL at which the plugin's parent mod can be found. - - The Name you wish to give the URL. - -.. _Wrye Bash's readme: https://wrye-bash.github.io/docs/Wrye%20Bash%20Advanced%20Readme.html#patch-tags diff --git a/docs/app/usage/initialisation.rst b/docs/app/usage/initialisation.rst deleted file mode 100644 index 47dffd53..00000000 --- a/docs/app/usage/initialisation.rst +++ /dev/null @@ -1,19 +0,0 @@ -************** -Initialisation -************** - -When LOOT is run, it will attempt to detect which of the supported games are installed. If a :ref:`default game ` has been set, LOOT will run for it, otherwise it will run for the same game as it last ran for. If the relevant game cannot be detected, or if there is no record of the last game LOOT ran for, it will run for the first detected game. - -LOOT's initialisation can be customised using command line parameters: - -``--game=``: - Set the game to run for. If the supplied game folder name is valid, the default and last game values are ignored. The default folder names are ``Oblivion``, ``Skyrim``, ``Fallout3``, ``FalloutNV`` and ``Fallout4``. - -``--loot-data-path=``: - Set the path to use for LOOT's application data storage. If this is an empty string or not specified, defaults to ``%LOCALAPPDATA%\LOOT`` on Windows and (in order of decreasing preference) ``$XDG_CONFIG_HOME/LOOT``, ``$HOME/.config/LOOT`` or the current path on Linux. - -If LOOT cannot detect any supported game installs, it will immediately open the :doc:`Settings dialog `. There you can edit LOOT’s settings to provide a path to a supported game, after which you can select it from the game menu. - -Once a game has been set, LOOT will scan its plugins and load the game’s masterlist, if one is present. The plugins and any metadata they have are then listed in their current load order. - -If LOOT detects that it is the first time you have run that version of LOOT, it will display a "First-Time Tips" dialog, which provides some information about the user interface that may not be immediately obvious. diff --git a/docs/app/usage/main.rst b/docs/app/usage/main.rst deleted file mode 100644 index bf7a80d0..00000000 --- a/docs/app/usage/main.rst +++ /dev/null @@ -1,107 +0,0 @@ -****************** -The Main Interface -****************** - -.. image:: ../../images/main.png - -The Header Bar -============== - -The header bar provides access to LOOT's main features. Most of these features get disabled while the metadata editor is open, so if you're trying to use an option that is faded out, first close the editor. - -Game Menu ---------- - -LOOT's active game can be changed by clicking on it in the header bar, and selecting another game from the menu that is displayed. Games that have no install detected have their menu items disabled. - -Masterlist Update & Sorting ---------------------------- - -The masterlist update process updates the active game's masterlist to the latest revision at the location given by the game's masterlist repository settings. If the latest revision contains errors, LOOT will roll back to the latest revision that works. - -By :ref:`default `, sorting first updates the masterlist. LOOT then calculates a load order for your plugins, using their internal data and any metadata they may have. If a cyclic interaction is detected (eg. A depends on B depends on A), then sorting will fail. - -Once LOOT has calculated a load order, it is compared with the current load order. If the current and calculated load orders are identical, LOOT will inform the user that no changes were made via a pop-up 'toast' notification. If the calculated load order contains changes, the plugin cards are sorted into that order and the masterlist update and sorting buttons are replaced with APPLY and CANCEL buttons, which apply and discard the calculated load order respectively. Changing games is disabled until the calculated load order is applied or discarded. - -LOOT is able to sort plugins ghosted by Wrye Bash, and can extract Bash Tags and version numbers from plugin descriptions. Provided that they have the ``Filter`` Bash Tag present in their description, LOOT can recognise filter patches and so avoid displaying unnecessary error messages for any of their masters that may be missing. - -Any errors encountered during sorting or masterlist update will be displayed on the "General Information" card. - -Load Order Backups -^^^^^^^^^^^^^^^^^^ - -Before a sorted load order is applied, LOOT saves a backup of the current load order as a ``loadorder.bak.0`` text file in LOOT's data folder for the current game. Up to three load order backups are retained: ``loadorder.bak.0`` is the backup from the most recent load order change, ``loadorder.bak.1`` is the second-most recent backup, and ``loadorder.bak.2`` is the third-most recent backup. - -Search ------- - -The search toolbar is displayed by clicking the search icon in the header bar, or using the :kbd:`Ctrl-F` keyboard shortcut. It may be closed using the close button at the right of the toolbar. - -Searching is performed as-you-type, or when the Enter key is pressed. All content visible on the front of plugin cards is searched, so the results may be affected by any filters you have active. - -The plugin card list will be scrolled to the first card that contains a match. Matches may be scrolled between using the up and down chevron buttons, and the current match and the number of matches are displayed between them and the search input. - -Main Menu ---------- - -A few items in the main menu are not self-explanatory: - -- "Redate Plugins" is provided so that Skyrim and Skyrim Special Edition modders may set the load order for the Creation Kit. It is only available for Skyrim, and changes the timestamps of the plugins in its Data folder to match their current load order. A side effect of changing the timestamps is that any Steam Workshop mods installed will be re-downloaded. -- "Copy Load Order" copies the displayed list of plugins and the decimal and hexadecimal indices of active plugins. -- "Copy Content" copies the data displayed in LOOT's cards as YAML-formatted text. -- "Refresh Content" re-scans the installed plugins' headers and regenerates the content LOOT displays. This can be useful if you have made changes to your installed plugins while LOOT was open. Refreshing content will also discard any CRCs that were previously calculated, as they may have changed. - -Plugin Cards & Sidebar Items -============================ - -Each plugin is displayed on its own "card", which displays all the information LOOT has for that plugin, and provides access to plugin-specific functionality, including editing its metadata. Each plugin also has an item in the sidebar's PLUGINS tab. The sidebar item contains the plugin's name and icons for plugins that load archives or have user metadata. It also displays the plugin's in-game load order index if the plugin is active. Clicking on a plugin's sidebar item will jump to its card, while double-clicking will jump to its card and open it in the metadata editor. - -The plugin card's header holds the following information, some of which is only displayed if applicable: - -- The "Active Plugin" icon. -- The plugin name. -- The plugin's version number, extracted from its description field. -- The plugin's :abbr:`CRC (Cyclic Redundancy Checksum)`, which can be used to uniquely identify it. CRCs are only displayed after they have been calculated during conflict filtering or sorting, except the the CRC of the game's main master file, which is never displayed. -- The "Master File" icon. -- The "Empty Plugin" icon. -- The "Loads Archive" icon. -- The "Verified clean" icon. -- The "Has User Metadata" icon. -- The plugin menu button, which provides access to metadata-related features for the plugin. These are explained in later sections. - -Bash Tag suggestions and messages are displayed below the plugin card's header. - -If LOOT suggests any Bash Tags to be added, they will be displayed in green text, while any Bash Tags to be removed will be displayed in red text. For completeness, the list of Bash Tags to add will include any Bash Tags that are already specified in the plugin's description field. Users generally don't need to do anything with this information, as if they're using Wrye Bash it will automatically apply LOOT's suggestions, and if they're not using Wrye Bash then this information doesn't apply. - -LOOT's plugin messages are a valuable resource, acting as a means of providing users with information that they might otherwise not obtain. It is important for a stable, healthy game that you act on any messages that require action. If you think a message suggests an unnecessary action, report it to an official LOOT thread. If you encounter a message that is non-conditional, ie. it suggests an action but is still displayed on subsequent runs of LOOT after the action has been carried out, also report it to an official LOOT thread, so that it can be made conditional. - -Filters -======= - -Clicking the FILTERS tab in the sidebar will replace the sidebar's plugin list with a list of filter toggles that can be applied to hide various combinations of plugins and other content. The available filter toggles are: - -Hide version numbers - Hides the version numbers displayed in blue next to those plugins that provide them. - -Hide CRCs - Hides the CRCs displayed in orange next to those plugins that provide them. -Hide Bash Tags - Hides all Bash Tag suggestions. -Hide notes - Hides all plugin messages that have the Note: prefix, or the equivalent text for the language selected in LOOT's settings. -Hide 'Do not clean' messages - Hides all messages that contain the text Do not clean, or the equivalent text for the language selected in LOOT's settings. -Hide all plugin messages - Hides all plugin messages. -Hide inactive plugins - Hides all plugins that are inactive. -Hide messageless plugins - Hides all plugins that have no visible messages. - -The filter toggles have their states saved on quitting LOOT, and they are restored when LOOT is next launched. There are also two other filters in the sidebar tab: - -Show only conflicting plugins for… - This hides any plugins that don't have the filter input value present in any of the text on their cards. - -Show only plugins with cards that contain… - This filters the plugin cards displayed so that only plugins which conflict with this plugin will be visible. If this plugin loads an archive, other plugins that load archives which may contain conflicting resources are also displayed. Sorting with the conflict filter active will first deactivate it. diff --git a/docs/app/usage/settings.rst b/docs/app/usage/settings.rst deleted file mode 100644 index 21b68d59..00000000 --- a/docs/app/usage/settings.rst +++ /dev/null @@ -1,65 +0,0 @@ -**************** -Editing Settings -**************** - -.. image:: ../../images/settings.png - -LOOT's settings may be accessed through the main menu. - -General Settings -================ - -.. _default-game: - -Default Game - If set to something other than Autodetect, this overrides game autodetection. If the game specified is not detected, LOOT falls back to autodetection. - -Language - Controls the language LOOT uses. Any plugin messages that do not have translations in the selected language will be displayed in English, if available, or in their available language otherwise. - -Enable Debug Logging - If enabled, writes debug output to ``%LOCALAPPDATA%\LOOT\LOOTDebugLog.txt``. Debug logging can have a noticeable impact on performance, so it is off by default. - -.. _update-masterlist: - -Update masterlist before sorting - If checked, LOOT will update its masterlist, should an update be available, before sorting plugins. - -Game Settings -============= - -LOOT's game-specific settings can be customised in the games table. New game profiles can be added, making it easy to use LOOT across multiple copies of a game, including total conversion mods. LOOT ships with settings for the "Nehrim - At Fate's Edge" total conversion mod as an example. Game profiles can also be deleted, though the active game cannot have its profile deleted, and LOOT will recreate the profiles for the base games it supports (Oblivion, Skyrim, Fallout 3, Fallout: New Vegas, Fallout 4) when it is next run. - -Name - The name of the game, or another identifying text, that is displayed in menus and the LOOT's title bar. - -Base Game Type - Every game LOOT runs for must use the plugin file format and load order system of one of the following games: - - - TES IV: Oblivion - - TES V: Skyrim - - Fallout 3 - - Fallout: New Vegas - - Fallout 4 - -LOOT Folder Name - The sub-folder which LOOT uses to store the game's files in. Each game must be given a unique sub-folder. - -Master File - The game's main master file. This is checked for when detecting if the game is installed. - -Masterlist Repository URL - The URL of the repository that LOOT uses to update its local copy of the masterlist. If left empty, masterlist updating will be skipped. - - Masterlist repositories are `Git`_ repositories that are configured to allow unauthenticated read access and contain a masterlist file named ``masterlist.yaml`` in their root directory. The LOOT team maintains a set of official repositories for the games that LOOT supports by default. - -Masterlist Repository Branch - The branch of the masterlist repository that LOOT should get masterlist updates from. - -Install Path - The path to the game's folder, in which the Data folder lies. Either this or a registry key must be supplied. - -Install Path Registry Key - The registry key, in ``HKEY_LOCAL_MACHINE``, that contains the install path of the game. This is used to obtain the install path if LOOT has no previous record of the game's install path, or LOOT's stored install path is invalid. Either this or an install path must be supplied. - -.. _Git: https://git-scm.com/ diff --git a/docs/conf.py b/docs/conf.py index fd1d47bd..23f90195 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -59,7 +59,7 @@ source_suffix = '.rst' master_doc = 'index' # General information about the project. -project = u'LOOT' +project = u'LOOT API' copyright = u'2016, WrinklyNinja' author = u'WrinklyNinja' @@ -270,7 +270,7 @@ latex_elements = { # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'LOOT.tex', u'LOOT Documentation', + (master_doc, 'loot_api.tex', u'LOOT API Documentation', u'WrinklyNinja', 'manual'), ] @@ -312,7 +312,7 @@ latex_documents = [ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'loot', u'LOOT Documentation', + (master_doc, 'loot_api', u'LOOT API Documentation', [author], 1) ] @@ -327,8 +327,8 @@ man_pages = [ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'LOOT', u'LOOT Documentation', - author, 'LOOT', 'One line description of project.', + (master_doc, 'loot_api', u'LOOT API Documentation', + author, 'loot_api', 'One line description of project.', 'Miscellaneous'), ] diff --git a/docs/images/main.png b/docs/images/main.png deleted file mode 100644 index 0665687a..00000000 Binary files a/docs/images/main.png and /dev/null differ diff --git a/docs/images/settings.png b/docs/images/settings.png deleted file mode 100644 index 38b00f16..00000000 Binary files a/docs/images/settings.png and /dev/null differ diff --git a/docs/index.rst b/docs/index.rst index 1fded7dd..18478f90 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,21 +1,6 @@ -#### -LOOT -#### - -.. toctree:: - :maxdepth: 2 - :caption: Application Documentation - - app/introduction - app/installation - app/usage/initialisation - app/usage/main - app/usage/editor - app/usage/settings - app/theme - app/contributing - app/credits - app/changelog +######## +LOOT API +######## .. toctree:: :maxdepth: 2 diff --git a/docs/licenses/BSD License (Chromium Embedded Framework).txt b/docs/licenses/BSD License (Chromium Embedded Framework).txt deleted file mode 100644 index a5d84ada..00000000 --- a/docs/licenses/BSD License (Chromium Embedded Framework).txt +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2008-2013 Marshall A. Greenblatt. Portions Copyright (c) -// 2006-2009 Google Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/docs/licenses/BSD License (Polymer).txt b/docs/licenses/BSD License (Polymer).txt deleted file mode 100644 index 95987bac..00000000 --- a/docs/licenses/BSD License (Polymer).txt +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2014 The Polymer Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/docs/licenses/MIT License (Jed Gettext Parser).txt b/docs/licenses/MIT License (Jed Gettext Parser).txt deleted file mode 100644 index 42626999..00000000 --- a/docs/licenses/MIT License (Jed Gettext Parser).txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Oliver Hamlet - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/docs/licenses/MIT License (Jed).txt b/docs/licenses/MIT License (Jed).txt deleted file mode 100644 index 284f09cd..00000000 --- a/docs/licenses/MIT License (Jed).txt +++ /dev/null @@ -1,19 +0,0 @@ -Copyright jQuery Foundation and other contributors, https://jquery.org/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/docs/licenses/MIT License (Marked).txt b/docs/licenses/MIT License (Marked).txt deleted file mode 100644 index a7b812ed..00000000 --- a/docs/licenses/MIT License (Marked).txt +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011-2014, Christopher Jeffrey (https://github.com/chjj/) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/docs/licenses/texts.rst b/docs/licenses/texts.rst index 6b5a509d..5f2c507c 100644 --- a/docs/licenses/texts.rst +++ b/docs/licenses/texts.rst @@ -12,30 +12,6 @@ Copyright License Texts .. include:: Boost Software License v1.0.txt :literal: -`Chromium Embedded Framework`_ -============================== - -.. _Chromium Embedded Framework: https://bitbucket.org/chromiumembedded/cef - -.. include:: BSD License (Chromium Embedded Framework).txt - :literal: - -`Jed`_ -====== - -.. _Jed: https://github.com/SlexAxton/Jed - -.. include:: MIT License (Jed).txt - :literal: - -`Jed Gettext Parser`_ -===================== - -.. _Jed Gettext Parser: https://github.com/WrinklyNinja/jed-gettext-parser - -.. include:: MIT License (Jed Gettext Parser).txt - :literal: - `libgit2`_ ========== @@ -44,8 +20,8 @@ Copyright License Texts .. include:: GNU GPL v2 (libgit2).txt :literal: -LOOT, `Libespm`_ & `Libloadorder`_ -================================== +LOOT API, `Libespm`_ & `Libloadorder`_ +====================================== .. _libespm: https://github.com/WrinklyNinja/libespm .. _libloadorder: https://github.com/WrinklyNinja/libloadorder @@ -53,28 +29,12 @@ LOOT, `Libespm`_ & `Libloadorder`_ .. include:: GNU GPL v3.txt :literal: -LOOT Documentation -================== +LOOT API Documentation +====================== .. include:: GNU FDL v1.3.txt :literal: -`Marked`_ -========= - -.. _Marked: https://github.com/chjj/marked - -.. include:: MIT License (Marked).txt - :literal: - -`Polymer`_ -========== - -.. _Polymer: https://www.polymer-project.org/ - -.. include:: BSD License (Polymer).txt - :literal: - `Pseudosem`_ ============ diff --git a/karma.conf.js b/karma.conf.js deleted file mode 100644 index 06e302f7..00000000 --- a/karma.conf.js +++ /dev/null @@ -1,35 +0,0 @@ -const helpers = require('./scripts/helpers'); -const path = require('path'); - -process.env.CHROME_BIN = path.join(helpers.getAppReleasePaths('.')[0].path, 'LOOT'); -console.log(`Running tests using browser executable at ${process.env.CHROME_BIN}`); - -module.exports = (config) => { - config.set({ - basePath: '', - frameworks: ['mocha', 'chai'], - files: [ - 'bower_components/Jed/jed.js', - 'bower_components/jed-gettext-parser/jedGettextParser.js', - 'bower_components/lodash/dist/lodash.core.min.js', - 'src/tests/gui/html/js/mock_*.js', - 'src/gui/html/js/filters.js', - 'src/gui/html/js/plugin.js', - 'src/gui/html/js/game.js', - 'src/gui/html/js/query.js', - 'src/gui/html/js/state.js', - 'src/gui/html/js/translator.js', - 'src/gui/html/js/updateExists.js', - 'src/tests/gui/html/js/*.js', - ], - exclude: [], - preprocessors: {}, - reporters: ['progress'], - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: false, - browsers: ['Chrome'], - singleRun: true, - }); -}; diff --git a/package.json b/package.json deleted file mode 100644 index b4f76db9..00000000 --- a/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "loot", - "author": "Oliver Hamlet ", - "version": "0.9.1", - "license": "GPL-3.0", - "repository": { - "type": "git", - "url": "https://github.com/loot/loot.git" - }, - "bugs": { - "url": "https://github.com/loot/loot/issues" - }, - "homepage": "https://github.com/loot/loot", - "private": true, - "dependencies": { - "decompress": "^4.0.0", - "decompress-unzip": "^4.0.1", - "fs-extra": "^0.30.0", - "hydrolysis": "^1.24.1", - "replace": "^0.3.0", - "request": "^2.79.0" - }, - "devDependencies": { - "bower": "^1.7.1", - "chai": "^3.5.0", - "eslint": "^3.5.0", - "eslint-config-airbnb-base": "^7.1.0", - "eslint-plugin-html": "^1.5.0", - "eslint-plugin-import": "^1.15.0", - "karma": "^1.3.0", - "karma-chai": "^0.1.0", - "karma-chrome-launcher": "^2.0.0", - "karma-mocha": "^1.3.0", - "mkdirp": "^0.5.1", - "mocha": "^3.0.1" - }, - "scripts": { - "test": "karma start" - } -} diff --git a/resources/icon.svg b/resources/icon.svg deleted file mode 100644 index 36036a9c..00000000 --- a/resources/icon.svg +++ /dev/null @@ -1,565 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/l10n/da/LC_MESSAGES/loot.po b/resources/l10n/da/LC_MESSAGES/loot.po deleted file mode 100644 index 8f81e0b9..00000000 --- a/resources/l10n/da/LC_MESSAGES/loot.po +++ /dev/null @@ -1,1105 +0,0 @@ -# Danish translation of LOOT -# Copyright (C) 2014-2016 Freso & WrinklyNinja -# This file is distributed under the same license as the LOOT package. -# Frederik “Freso” S. Olesen, 2014-2016 -# -msgid "" -msgstr "" -"Project-Id-Version: LOOT 0.9.2\n" -"Report-Msgid-Bugs-To: https://github.com/loot/loot/issues\n" -"POT-Creation-Date: 2016-11-05 12:40+0100\n" -"PO-Revision-Date: 2016-11-05 12:50+0100\n" -"Last-Translator: Frederik “Freso” S. Olesen \n" -"Language-Team: Danish\n" -"Language: da\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.11\n" -"X-Poedit-KeywordsList: translate:1,1t;translate:1c,2,t\n" -"X-Poedit-Basepath: ../../../../src\n" -"X-Poedit-SourceCharset: UTF-8\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Poedit-SearchPath-0: backend\n" -"X-Poedit-SearchPath-1: gui\n" - -#: src/gui/html/js/events.js:18 -msgid "Identifying conflicting plugins..." -msgstr "Identificerer modstridende plugins…" - -#: src/gui/html/js/events.js:100 -msgid "No masterlist update was necessary." -msgstr "Masterlisteopdatering var ikke nødvendig." - -#: src/gui/html/js/events.js:150 -msgid "Sorting made no changes to the load order." -msgstr "Sortering ændrede ikke i indlæsningsrækkefølgen." - -#: src/gui/html/js/events.js:182 -msgid "Redate Plugins?" -msgstr "Omdatér plugins?" - -#: src/gui/html/js/events.js:182 -msgid "" -"This feature is provided so that modders using the Creation Kit may set the " -"load order it uses. A side-effect is that any subscribed Steam Workshop mods " -"will be re-downloaded by Steam. Do you wish to continue?" -msgstr "" -"Denne funktion er til for at moddere der bruger Creation Kit’et kan styre " -"hvilken indlæsningsrækkefølge det bruger. En bieffekt er at alle Steam " -"Workshop mod‐abonnementer vil blive genhentet af Steam. Vil du fortsætte?" - -#: src/gui/html/js/events.js:182 -msgid "Redate" -msgstr "Omdatér" - -#: src/gui/html/js/events.js:191 -msgid "" -"Are you sure you want to clear all existing user-added metadata from all " -"plugins?" -msgstr "" -"Er du sikker på du vil rydde al eksisterende brugertilføjet metadata fra " -"alle plugins?" - -#: src/gui/html/js/events.js:191 src/gui/html/js/events.js:401 -msgid "Clear" -msgstr "Ryd" - -#: src/gui/html/js/events.js:202 -msgid "All user-added metadata has been cleared." -msgstr "Al brugertilføjet metadata blev ryddet." - -#: src/gui/html/js/events.js:225 -msgid "LOOT's content has been copied to the clipboard." -msgstr "LOOTs indhold blev kopieret til udklipsholderen." - -#: src/gui/html/js/events.js:236 -msgid "The load order has been copied to the clipboard." -msgstr "Indlæsningsrækkefølgen blev kopieret til udklipsholderen." - -#: src/gui/html/js/events.js:267 src/gui/html/js/translateStaticText.js:195 -msgid "Quit" -msgstr "Afslut" - -#: src/gui/html/js/events.js:279 -msgid "sorted load order" -msgstr "sorteret indlæsningsrækkefølge" - -#: src/gui/html/js/events.js:281 -msgid "metadata edits" -msgstr "" - -#: src/gui/html/js/filters.js:28 -msgid "Do not clean" -msgstr "Rengør ikke" - -#: src/gui/html/js/game.js:22 -msgid "N/A" -msgstr "N/A" - -#: src/gui/html/js/handlePromiseError.js:15 -#: src/gui/html/js/translateStaticText.js:115 -msgid "Error" -msgstr "Fejl" - -#: src/gui/html/js/translateStaticText.js:17 -msgid "Active Plugin" -msgstr "Aktivt plugin" - -#: src/gui/html/js/translateStaticText.js:18 -#: src/gui/html/js/translateStaticText.js:264 -msgid "Master File" -msgstr "Masterfil" - -#: src/gui/html/js/translateStaticText.js:19 -msgid "Empty Plugin" -msgstr "Tomt plugin" - -#: src/gui/html/js/translateStaticText.js:20 -msgid "Loads Archive" -msgstr "Indæser arkiv" - -#: src/gui/html/js/translateStaticText.js:21 -#: src/gui/html/js/translateStaticText.js:89 -msgid "Has User Metadata" -msgstr "Har brugermetadata" - -#: src/gui/html/js/translateStaticText.js:23 -msgid "Edit Metadata" -msgstr "Redigér metadata" - -#: src/gui/html/js/translateStaticText.js:24 -msgid "Copy Metadata" -msgstr "Kopiér metadata" - -#: src/gui/html/js/translateStaticText.js:25 -msgid "Clear User Metadata" -msgstr "Ryd brugermetadata" - -#: src/gui/html/js/translateStaticText.js:32 -msgid "Enable Edits" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:33 -#: src/gui/html/js/translateStaticText.js:88 -msgid "Priority" -msgstr "Prioritet" - -#: src/gui/html/js/translateStaticText.js:34 -#: src/gui/html/js/translateStaticText.js:87 -msgid "Global Priority" -msgstr "Global prioritet" - -#: src/gui/html/js/translateStaticText.js:36 -msgid "Main" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:37 -msgid "Load After" -msgstr "Indlæs efter" - -#: src/gui/html/js/translateStaticText.js:38 -msgid "Requirements" -msgstr "Krav" - -#: src/gui/html/js/translateStaticText.js:39 -msgid "Incompatibilities" -msgstr "Uforligeligheder" - -#: src/gui/html/js/translateStaticText.js:40 -msgid "Messages" -msgstr "Beskeder" - -#: src/gui/html/js/translateStaticText.js:41 -msgid "Bash Tags" -msgstr "Bash‐tags" - -#: src/gui/html/js/translateStaticText.js:42 -#, fuzzy -msgid "Dirty Plugin Info" -msgstr "Beskidte plugins" - -#: src/gui/html/js/translateStaticText.js:43 -msgid "Clean Plugin Info" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:44 -msgid "Locations" -msgstr "Placeringer" - -#: src/gui/html/js/translateStaticText.js:46 -#: src/gui/html/js/translateStaticText.js:50 -#: src/gui/html/js/translateStaticText.js:54 -msgid "Filename" -msgstr "Filnavn" - -#: src/gui/html/js/translateStaticText.js:47 -#: src/gui/html/js/translateStaticText.js:51 -#: src/gui/html/js/translateStaticText.js:55 -msgid "Display Name" -msgstr "Visningsnavn" - -#: src/gui/html/js/translateStaticText.js:48 -#: src/gui/html/js/translateStaticText.js:52 -#: src/gui/html/js/translateStaticText.js:56 -#: src/gui/html/js/translateStaticText.js:60 -#: src/gui/html/js/translateStaticText.js:65 -msgid "Condition" -msgstr "Betingelse" - -#: src/gui/html/js/translateStaticText.js:58 -msgid "Type" -msgstr "Type" - -#: src/gui/html/js/translateStaticText.js:59 -msgid "Content" -msgstr "Indhold" - -#: src/gui/html/js/translateStaticText.js:61 -#: src/gui/html/js/translateStaticText.js:252 -msgid "Language" -msgstr "Sprog" - -#: src/gui/html/js/translateStaticText.js:63 -msgid "Add/Remove" -msgstr "Tilføj/fjern" - -#: src/gui/html/js/translateStaticText.js:64 -msgid "Bash Tag" -msgstr "Bash‐tag" - -#: src/gui/html/js/translateStaticText.js:67 -#: src/gui/html/js/translateStaticText.js:73 -msgid "CRC" -msgstr "CRC" - -#: src/gui/html/js/translateStaticText.js:68 -msgid "ITM Count" -msgstr "ITM‐antal" - -#: src/gui/html/js/translateStaticText.js:69 -msgid "Deleted References" -msgstr "Slettede referencer" - -#: src/gui/html/js/translateStaticText.js:70 -msgid "Deleted Navmeshes" -msgstr "Slettede navmesh’er" - -#: src/gui/html/js/translateStaticText.js:71 -#: src/gui/html/js/translateStaticText.js:74 -msgid "Cleaning Utility" -msgstr "Renseværktøj" - -#: src/gui/html/js/translateStaticText.js:76 -msgid "URL" -msgstr "URL" - -#: src/gui/html/js/translateStaticText.js:77 -#: src/gui/html/js/translateStaticText.js:261 -msgid "Name" -msgstr "Navn" - -#: src/gui/html/js/translateStaticText.js:79 -msgid "Save Metadata" -msgstr "Gem metadata" - -#: src/gui/html/js/translateStaticText.js:80 -#: src/gui/html/js/translateStaticText.js:98 -#: src/gui/html/js/translateStaticText.js:182 -#: src/gui/html/js/translateStaticText.js:275 -msgid "Cancel" -msgstr "Annullér" - -#: src/gui/html/js/translateStaticText.js:90 -msgid "Editor Is Open" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:97 -#: src/gui/html/js/translateStaticText.js:289 -msgid "OK" -msgstr "OK" - -#: src/gui/html/js/translateStaticText.js:105 -msgid "A filename is required." -msgstr "Et filnavn er krævet." - -#: src/gui/html/js/translateStaticText.js:106 -#: src/gui/html/js/translateStaticText.js:117 -#: src/gui/html/js/translateStaticText.js:127 -#: src/gui/html/js/translateStaticText.js:139 -#: src/gui/html/js/translateStaticText.js:148 -#: src/gui/html/js/translateStaticText.js:156 -#: src/gui/html/js/translateStaticText.js:165 -msgid "Delete Row" -msgstr "Slet række" - -#: src/gui/html/js/translateStaticText.js:113 -msgid "Note" -msgstr "Notits" - -#: src/gui/html/js/translateStaticText.js:114 -msgid "Warning" -msgstr "Advarsel" - -#: src/gui/html/js/translateStaticText.js:116 -msgid "A content string is required." -msgstr "En indholdstekststreng er krævet." - -#: src/gui/html/js/translateStaticText.js:124 -msgid "Add" -msgstr "Tilføj" - -#: src/gui/html/js/translateStaticText.js:125 -msgid "Remove" -msgstr "Fjern" - -#: src/gui/html/js/translateStaticText.js:126 -#: src/gui/html/js/translateStaticText.js:163 -msgid "A name is required." -msgstr "Et navn er krævet." - -#: src/gui/html/js/translateStaticText.js:134 -#: src/gui/html/js/translateStaticText.js:146 -msgid "A CRC is required." -msgstr "En CRC er krævet." - -#: src/gui/html/js/translateStaticText.js:135 -#: src/gui/html/js/translateStaticText.js:136 -#: src/gui/html/js/translateStaticText.js:137 -msgid "Values must be integers." -msgstr "Værdier skal være tal." - -#: src/gui/html/js/translateStaticText.js:138 -#: src/gui/html/js/translateStaticText.js:147 -msgid "A utility name is required." -msgstr "Et værktøjsnavn er krævet." - -#: src/gui/html/js/translateStaticText.js:155 -msgid "A link is required." -msgstr "Et link er krævet." - -#: src/gui/html/js/translateStaticText.js:164 -msgid "A folder is required." -msgstr "En mappe er krævet." - -#: src/gui/html/js/translateStaticText.js:172 -#: src/gui/html/js/translateStaticText.js:272 -msgid "Add New Row" -msgstr "Tilføj ny række" - -#: src/gui/html/js/translateStaticText.js:178 -msgid "Jump To General Information" -msgstr "Spring til generel information" - -#: src/gui/html/js/translateStaticText.js:179 -msgid "Sort Plugins" -msgstr "Sortér plugins" - -#: src/gui/html/js/translateStaticText.js:180 -msgid "Update Masterlist" -msgstr "Opdatér masterliste" - -#: src/gui/html/js/translateStaticText.js:181 -#: src/gui/html/js/translateStaticText.js:274 -msgid "Apply" -msgstr "Anvend" - -#: src/gui/html/js/translateStaticText.js:183 -msgid "Search Cards" -msgstr "Søg kort" - -#: src/gui/html/js/translateStaticText.js:186 -msgid "Redate Plugins" -msgstr "Omdatér plugins" - -#: src/gui/html/js/translateStaticText.js:187 -msgid "Open Debug Log Location" -msgstr "Åben sted for fejlsøgningslog" - -#: src/gui/html/js/translateStaticText.js:188 -msgid "Clear All User Metadata" -msgstr "Ryd al brugermetadata" - -#: src/gui/html/js/translateStaticText.js:189 -msgid "Copy Load Order" -msgstr "Kopiér indlæsningsrækkefølge" - -#: src/gui/html/js/translateStaticText.js:190 -msgid "Copy Content" -msgstr "Kopiér indhold" - -#: src/gui/html/js/translateStaticText.js:191 -msgid "Refresh Content" -msgstr "Genindlæs indhold" - -#: src/gui/html/js/translateStaticText.js:192 -msgid "View Documentation" -msgstr "Vis dokumentation" - -#: src/gui/html/js/translateStaticText.js:193 -msgid "About" -msgstr "Om" - -#: src/gui/html/js/translateStaticText.js:194 -#: src/gui/html/js/translateStaticText.js:244 -msgid "Settings" -msgstr "Indstillinger" - -#: src/gui/html/js/translateStaticText.js:198 -msgid "Search cards" -msgstr "Søg kort" - -#: src/gui/html/js/translateStaticText.js:203 -msgid "Plugins" -msgstr "Plugins" - -#: src/gui/html/js/translateStaticText.js:204 -msgid "Filters" -msgstr "Filtre" - -#: src/gui/html/js/translateStaticText.js:205 -msgid "Press Enter or click outside the input to set the filter." -msgstr "Tryk Enter eller klik udenfor inputtet for at sætte filteret." - -#: src/gui/html/js/translateStaticText.js:206 -msgid "Show only plugins with cards that contain" -msgstr "Vis kun plugins med kort der indeholder" - -#: src/gui/html/js/translateStaticText.js:207 -msgid "No text specified" -msgstr "Ingen tekst angivet" - -#: src/gui/html/js/translateStaticText.js:210 -msgid "Hide version numbers" -msgstr "Skjul versionsnumre" - -#: src/gui/html/js/translateStaticText.js:211 -msgid "Hide CRCs" -msgstr "Skjul CRC’er" - -#: src/gui/html/js/translateStaticText.js:212 -msgid "Hide Bash Tags" -msgstr "Skjul Bash‐tags" - -#: src/gui/html/js/translateStaticText.js:213 -msgid "Hide notes" -msgstr "Skjul noter" - -#: src/gui/html/js/translateStaticText.js:214 -msgid "Hide 'Do not clean' messages" -msgstr "Skjul “Rengør ikke”‐beskeder" - -#: src/gui/html/js/translateStaticText.js:215 -msgid "Hide all plugin messages" -msgstr "Skjul alle plugin‐beskeder" - -#: src/gui/html/js/translateStaticText.js:216 -msgid "Hide inactive plugins" -msgstr "Skjul inaktive plugins" - -#: src/gui/html/js/translateStaticText.js:217 -msgid "Hide messageless plugins" -msgstr "Skjul plugins uden beskeder" - -#: src/gui/html/js/translateStaticText.js:220 -msgid "Show only conflicting plugins for" -msgstr "Vis kun modstridende plugins for" - -#: src/gui/html/js/translateStaticText.js:221 -msgid "No plugin selected" -msgstr "Intet plugin valgt" - -#: src/gui/html/js/translateStaticText.js:225 -msgid "Hidden plugins:" -msgstr "Skjulte plugins:" - -#: src/gui/html/js/translateStaticText.js:226 -msgid "Hidden messages:" -msgstr "Skjulte beskeder:" - -#: src/gui/html/js/translateStaticText.js:231 -msgid "General Information" -msgstr "Generel information" - -#: src/gui/html/js/translateStaticText.js:232 -msgid "Masterlist Revision" -msgstr "Masterliste‐udgave" - -#: src/gui/html/js/translateStaticText.js:233 -msgid "Masterlist Date" -msgstr "Masterliste‐dato" - -#: src/gui/html/js/translateStaticText.js:234 -msgid "Warnings" -msgstr "Advarsler" - -#: src/gui/html/js/translateStaticText.js:235 -msgid "Errors" -msgstr "Fejl" - -#: src/gui/html/js/translateStaticText.js:236 -msgid "Total Messages" -msgstr "Samlet antal beskeder" - -#: src/gui/html/js/translateStaticText.js:237 -msgid "Active Plugins" -msgstr "Aktive plugins" - -#: src/gui/html/js/translateStaticText.js:238 -msgid "Dirty Plugins" -msgstr "Beskidte plugins" - -#: src/gui/html/js/translateStaticText.js:239 -msgid "Total Plugins" -msgstr "Samlet antal plugins" - -#: src/gui/html/js/translateStaticText.js:247 -msgid "Default Game" -msgstr "Standardspil" - -#: src/gui/html/js/translateStaticText.js:248 -msgid "Autodetect" -msgstr "Genkend automatisk" - -#: src/gui/html/js/translateStaticText.js:253 -msgid "Language changes will be applied after LOOT is restarted." -msgstr "Sprogændringer vil blive taget i brug efter LOOT er blevet genstartet." - -#: src/gui/html/js/translateStaticText.js:255 -msgid "Enable debug logging" -msgstr "Slå fejlsøgningslogning til" - -#: src/gui/html/js/translateStaticText.js:256 -msgid "The output is logged to the LOOTDebugLog.txt file." -msgstr "Outputtet bliver logget til filen “LOOTDebugLog.txt”." - -#: src/gui/html/js/translateStaticText.js:258 -msgid "Update masterlist before sorting" -msgstr "Opdater masterliste før sortering" - -#: src/gui/html/js/translateStaticText.js:262 -msgid "Base Game" -msgstr "Grundspil" - -#: src/gui/html/js/translateStaticText.js:263 -msgid "LOOT Folder" -msgstr "LOOT‐mappe" - -#: src/gui/html/js/translateStaticText.js:265 -msgid "Masterlist Repository URL" -msgstr "Masterlistelager‐URL" - -#: src/gui/html/js/translateStaticText.js:266 -msgid "Masterlist Repository Branch" -msgstr "Masterlistelager‐gren" - -#: src/gui/html/js/translateStaticText.js:267 -msgid "Install Path" -msgstr "Installationssti" - -#: src/gui/html/js/translateStaticText.js:268 -msgid "Install Path Registry Key" -msgstr "Installationsstisregistreringsnøgle" - -#: src/gui/html/js/translateStaticText.js:281 -msgid "First-Time Tips" -msgstr "Førstegangstips" - -#: src/gui/html/js/translateStaticText.js:283 -msgid "" -"CRCs are only displayed after plugins have been loaded, either by conflict " -"filtering, or by sorting." -msgstr "" -"CRC’er bliver kun vist efter plugins er blevet indlæst, enten ved " -"konfliktfilrering eller ved sortering." - -#: src/gui/html/js/translateStaticText.js:284 -msgid "" -"Double-click a plugin in the sidebar to quickly open it in the metadata " -"editor." -msgstr "" -"Dobbeltklik på et plugin i sidebjælken for nemt at åbne det i " -"metadatabehandleren." - -#: src/gui/html/js/translateStaticText.js:285 -msgid "" -"Plugins can be drag and dropped from the sidebar into the metadata editor's " -"\"load after\", \"requirements\" and \"incompatibility\" tables." -msgstr "" -"Plugins kan trækkes og slippes fra sidebjælken ind i metadatabehandlerens " -"“indlæs efter”‐, “krav”‐ og “uforligeligheder”‐tabeller." - -#: src/gui/html/js/translateStaticText.js:286 -msgid "" -"Some features are disabled while the metadata editor is open, or while there " -"is a sorted load order that has not been applied or discarded." -msgstr "" -"Nogle funktioner er slået fra mens metadatabehandleren er åbent, eller når " -"en indlæsningsrækkefølge er blevet sorteret men ikke anvendt eller kasseret." - -#: src/gui/html/js/translateStaticText.js:287 -msgid "" -"Many interface elements have tooltips. If you don't know what something is, " -"try hovering your mouse over it to find out. Otherwise, LOOT's documentation " -"can be accessed through the main menu." -msgstr "" -"Mange elementer i brugerfladen har værktøjstips. Hvis du ikke ved hvad noget " -"er eller gør, så prøv at holde musen over elementet og find ud af det. " -"Derudover kan LOOTs dokumentation findes gennem hovedmenuen." - -#: src/gui/query/get_game_data_query.h:44 -msgid "Parsing, merging and evaluating metadata..." -msgstr "Læser, sammenfletter og evaluerer metadata…" - -#: src/gui/query/get_game_data_query.h:79 -msgid "" -"An error occurred while parsing the masterlist: %1%. This probably happened " -"because an update to LOOT changed its metadata syntax support. Try updating " -"your masterlist to resolve the error." -msgstr "" -"Kunne ikke analysere masterlisten: %1%. Dette skete formodentlig fordi en " -"LOOT‐opdatering ændrede dets understøttede metadatasyntaks. Prøv at opdatere " -"masterlisten for at løse fejlen." - -#: src/gui/query/get_game_data_query.h:93 -msgid "" -"An error occurred while parsing the userlist: %1%. This probably happened " -"because an update to LOOT changed its metadata syntax support. Your user " -"metadata will have to be updated manually.\n" -"\n" -"To do so, use the 'Open Debug Log Location' in LOOT's main menu to open its " -"data folder, then open your 'userlist.yaml' file in the relevant game " -"folder. You can then edit the metadata it contains with reference to the " -"documentation, which is accessible through LOOT's main menu.\n" -"\n" -"You can also seek support on LOOT's forum thread, which is linked to on " -"[LOOT's website](https://loot.github.io/)." -msgstr "" -"Kunne ikke analysere brugerlisten: %1%. Dette skete formentlig fordi en LOOT‐" -"opdatering ændrede dets understøttede metadatasyntaks. Dine bruger‐metadata " -"skal opdateres manuelt.\n" -"\n" -"For at gøre dette skal du bruge ‘Åben sted for fejlsøgningslog’ i LOOTs " -"hovedmenu til at åbne dets datamappe, og herefter åbne din ‘userlist.yaml’‐" -"fil i den relevante spilmappe. Du kan nu redigere metadataen i filen med " -"reference til syntaksdokumentationen.\n" -"\n" -"Du kan også søge hjælp i LOOTs forumtråd, som er linket til på [LOOTs " -"hjemmeside](https://loot.github.io/)." - -#: src/gui/query/metadata_query.h:79 src/gui/query/metadata_query.h:80 -#, fuzzy -msgid "(edited)" -msgstr "(ændret/redigeret)" - -#: src/gui/query/metadata_query.h:101 -msgid "" -"A global message contains a condition that could not be evaluated. Details: " -"%1%" -msgstr "" -"En global besked indeholder en betingelse der ikke kunne evalueres. " -"Detaljer: %1%" - -#: src/gui/query/metadata_query.h:127 src/backend/plugin/plugin_sorter.cpp:219 -msgid "\"%1%\" contains a condition that could not be evaluated. Details: %2%" -msgstr "“%1%” indeholder en betingelse der ikke kunne løses. Detaljer: %2%" - -#: src/gui/query/sort_plugins_query.h:48 -msgid "Loading plugin contents..." -msgstr "Indlæser plugin‐indhold…" - -#: src/gui/query/sort_plugins_query.h:70 -msgid "Sorting load order..." -msgstr "sorteret indlæsningsrækkefølge…" - -#: src/backend/app/loot_paths.cpp:84 -msgid "Failed to get %LOCALAPPDATA% path." -msgstr "Kunne ikke hente %LOCALAPPDATA%‐sti." - -#: src/backend/app/loot_state.cpp:124 -msgid "Error: Could not create LOOT settings file. %1%" -msgstr "Fejl: Kunne ikke oprette LOOT‐indstillingsfil. %1%" - -#: src/backend/app/loot_state.cpp:131 -msgid "Error: Settings parsing failed. %1%" -msgstr "Fejl: Kunne ikke læse indstillinger. %1%" - -#: src/backend/app/loot_state.cpp:193 -msgid "Error: Game-specific settings could not be initialised. %1%" -msgstr "Fejl: Spilspecifikke indstillinger kunne ikke initialiseres. %1%" - -#: src/backend/app/loot_state.cpp:272 -msgid "None of the supported games were detected." -msgstr "Ingen af de understøttede spil blev fundet." - -#: src/backend/game/game.cpp:64 -msgid "Game path could not be detected." -msgstr "Kunne ikke finde spilsti." - -#: src/backend/game/game.cpp:74 -msgid "Could not create LOOT folder for game. Details:" -msgstr "Kunne ikke oprette LOOT‐mappe til spillet. Detaljer:" - -#: src/backend/game/game_cache.cpp:119 -msgid "You have not sorted your load order this session." -msgstr "" - -#: src/backend/game/load_order_handler.cpp:46 -msgid "Game path is not initialised." -msgstr "Spilsti er ikke initialiseret." - -#: src/backend/game/load_order_handler.cpp:82 -#, fuzzy -msgid "" -"libloadorder failed to create a game handle. Details could not be fetched." -msgstr "" -"libloadorder kunne ikke oprette “game handle”. Kunne ikke hente detaljer." - -#: src/backend/game/load_order_handler.cpp:85 -#, fuzzy -msgid "libloadorder failed to create a game handle. Details:" -msgstr "libloadorder kunne ikke oprette “game handle”. Detaljer:" - -#: src/backend/game/load_order_handler.cpp:103 -msgid "" -"libloadorder failed to check if a plugin is active. Details could not be " -"fetched." -msgstr "" -"libloadorder kunne ikke tjekke om et plugin er aktivt. Kunne ikke hente " -"detaljer." - -#: src/backend/game/load_order_handler.cpp:106 -msgid "libloadorder failed to check if a plugin is active. Details:" -msgstr "libloadorder kunne ikke tjekke om et plugin er aktivt. Detaljer:" - -#: src/backend/game/load_order_handler.cpp:128 -msgid "" -"libloadorder failed to get the load order. Details could not be fetched." -msgstr "" -"libloadorder kunne ikke hente indlæsningsrækkefølgen. Detaljer kunne ikke " -"hentes." - -#: src/backend/game/load_order_handler.cpp:131 -msgid "libloadorder failed to get the load order. Details:" -msgstr "libloadorder kunne ikke hente indlæsningsrækkefølgen. Detaljer:" - -#: src/backend/game/load_order_handler.cpp:154 -msgid "" -"libloadorder failed to set the load order. Details could not be fetched." -msgstr "" -"libloadorder kunne ikke sætte indlæsningsrækkefølgen. Detaljer kunne ikke " -"hentes." - -#: src/backend/game/load_order_handler.cpp:157 -msgid "libloadorder failed to set the load order. Details:" -msgstr "libloadorder kunne ikke sætte indlæsningsrækkefølgen. Detaljer:" - -#: src/backend/helpers/git_helper.cpp:105 -msgid "Git operation failed. Error: %1%" -msgstr "Git‐handling fejlede. Fejl: %1%" - -#: src/backend/helpers/git_helper.cpp:146 -msgid "" -"An error occurred while trying to clone the remote masterlist repository." -msgstr "" -"Der opstod en fejl under forsøg på at klone det eksterne masterliste‐lager." - -#: src/backend/helpers/git_helper.cpp:195 -msgid "" -"An error occurred while trying to update the masterlist. This could be due " -"to a server-side error. Try again in a few minutes." -msgstr "" -"Der opstod en fejl i forsøg på at opdatere masterlisten. Dette kan være på " -"grund af en serverfejl. Prøv igen om et par minutter." - -#: src/backend/helpers/helpers.cpp:81 -msgid "Unable to open \"%1%\" for CRC calculation." -msgstr "Kan ikke åbne “%1%” til beregning af CRC." - -#: src/backend/helpers/helpers.cpp:103 src/backend/helpers/helpers.cpp:106 -msgid "Failed to open file in its default application." -msgstr "Kunne ikke åbne filen i dets standardprogram." - -#: src/backend/metadata/condition_evaluator.cpp:170 -msgid "Invalid file path:" -msgstr "Ugyldig filsti:" - -#: src/backend/metadata/condition_evaluator.cpp:180 -#: src/backend/metadata/condition_evaluator.cpp:220 -msgid "Invalid regex string \"%1%\": %2%" -msgstr "Ugyldigt regulært udtryk “%1”: %2%" - -#: src/backend/metadata/condition_grammar.h:203 -msgid "Failed to parse condition \"%1%\": expected \"%2%\" at \"%3%\"." -msgstr "Kunne ikke analysere betingelsen “%1%”: forventedede “%2%” ved “%3%”." - -#: src/backend/metadata/conditional_metadata.cpp:91 -msgid "" -"Failed to parse condition \"%1%\": only partially matched expected syntax." -msgstr "" -"Kunne ikke analysere betingelsen “%1%”: passede kun delvist på den " -"forventede syntaks." - -#: src/backend/metadata/plugin_cleaning_data.cpp:88 -msgid "" -"%1% found %2% ITM records, %3% deleted references and %4% deleted navmeshes." -msgstr "" -"%1% fandt %2% ITM‐poster, %3% slettede referencer og %4% slettede navmesh’er." - -#: src/backend/metadata/plugin_cleaning_data.cpp:90 -msgid "%1% found dirty edits." -msgstr "" - -#: src/backend/metadata/plugin_cleaning_data.cpp:93 -msgid "%1% found %2% deleted references and %3% deleted navmeshes." -msgstr "%1% fandt %2% slettede referencer og %3% slettede navmesh’er." - -#: src/backend/metadata/plugin_cleaning_data.cpp:95 -msgid "%1% found %2% deleted navmeshes." -msgstr "%1% fandt %2% slettede navmesh’er." - -#: src/backend/metadata/plugin_cleaning_data.cpp:97 -msgid "%1% found %2% deleted references." -msgstr "%1% fandt %2% slettede referencer." - -#: src/backend/metadata/plugin_cleaning_data.cpp:100 -msgid "%1% found %2% ITM records and %3% deleted navmeshes." -msgstr "%1% fandt %2% ITM‐poster og %3% slettede navmesh’er." - -#: src/backend/metadata/plugin_cleaning_data.cpp:102 -msgid "%1% found %2% ITM records." -msgstr "%1% fandt %2% ITM-poster." - -#: src/backend/metadata/plugin_cleaning_data.cpp:105 -msgid "%1% found %2% ITM records and %3% deleted references." -msgstr "%1% fandt %2% ITM‐poster og %3% slettede referencer." - -#: src/backend/plugin/plugin.cpp:115 -msgid "Cannot read \"%1%\". Details: %2%" -msgstr "Kan ikke læse “%1%”. Detaljer: %2%" - -#: src/backend/plugin/plugin.cpp:221 src/backend/plugin/plugin.cpp:232 -msgid "This plugin requires \"%1%\" to be installed, but it is missing." -msgstr "Pluginet kræver at “%1%” er installeret, men det mangler." - -#: src/backend/plugin/plugin.cpp:224 -msgid "This plugin requires \"%1%\" to be active, but it is inactive." -msgstr "Pluginet kræver at “%1%” er aktivt, men det er inaktivt." - -#: src/backend/plugin/plugin.cpp:238 -msgid "This plugin is incompatible with \"%1%\", but both are present." -msgstr "Pluginet er uforeneligt med “%1%”, men begge er til stede." - -#: src/backend/plugin/plugin_sorter.cpp:84 -#, fuzzy -msgid "" -"Cyclic interaction detected between plugins \"%1%\" and \"%2%\". Back cycle: " -"%3%" -msgstr "" -"Opdaget cyklisk interaktion mellem plugin “%1%” og “%2%”. Back cycle: %3%" - -#: src/backend/masterlist.cpp:44 -msgid "" -"An error occurred while trying to read the local masterlist's version. If " -"this error happens again, try deleting the \".git\" folder in %1%." -msgstr "" -"Der opstod en fejl i forsøg på at læse versionen af den lokale masterliste. " -"Prøv at slette “.git”‐mappen i %1% hvis fejlen opstår igen." - -#: src/backend/masterlist.cpp:48 -msgid "N/A: No masterlist present" -msgstr "N/A: Der er ingen masterliste" - -#: src/backend/masterlist.cpp:51 -msgid "Unknown: Git repository missing" -msgstr "Ukendt: Git‐lager mangler" - -#: src/backend/masterlist.cpp:116 src/backend/masterlist.cpp:130 -msgid "" -"An error occurred while trying to access the local masterlist repository. If " -"this error happens again, try deleting the \".git\" folder in %1%." -msgstr "" -"Der opstod en fejl i forsøg på at tilgå det lokale masterliste‐lager. Prøv " -"at slette “.git”‐mappen i %1% hvis fejlen opstår igen." - -#: src/backend/masterlist.cpp:237 -msgid "" -"An error occurred while trying to read information on the updated " -"masterlist. If this error happens again, try deleting the \".git\" folder in " -"%1%." -msgstr "" -"Der opstod en fejl i forsøg på at læse information om den opdaterede " -"masterliste. Prøv at slette “.git”‐mappen i %1% hvis fejlen opstår igen." - -#: src/backend/masterlist.cpp:251 -msgid "Masterlist revision" -msgstr "Masterliste‐udgave" - -#: src/backend/masterlist.cpp:255 -msgid "" -"The latest masterlist revision contains a syntax error, LOOT is using the " -"most recent valid revision instead. Syntax errors are usually minor and " -"fixed within hours." -msgstr "" -"Den seneste udgave af masterlisten indeholder en syntaksfejl; LOOT bruger " -"den seneste gyldige udgave i stedet. Syntaksfejl er oftest ubetydelige og " -"rettet indenfor nogle timer." - -#~ msgid "" -#~ "Global priorities are compared against all other plugins. Normal " -#~ "priorities are compared against only conflicting plugins." -#~ msgstr "" -#~ "Globale prioriteter bliver sammenlignet med alle andre plugins. Normale " -#~ "prioriteter bliver kun sammenlignet med modstridende plugins." - -#~ msgid "Failed to change game. Details: %1%" -#~ msgstr "Kunne ikke ændre spil. Detaljer: %1%" - -#~ msgid "Failed to copy plugin metadata. Details: %1%" -#~ msgstr "Kunne ikke kopiere plugin‐metadata: Detaljer: %1%" - -#~ msgid "Failed to apply plugin metadata. Details: %1%" -#~ msgstr "Kunne ikke anvende plugin‐metadata. Detaljer: %1%" - -#~ msgid "Failed to get game data. Details: %1%" -#~ msgstr "Kunne ikke hente spildata. Detaljer: %1%" - -#~ msgid "Failed to update the masterlist. Details: %1%" -#~ msgstr "Kunne ikke opdatere masterlisten. Detaljer: %1%" - -#~ msgid "Failed to sort plugins. Details: %1%" -#~ msgstr "Kunne ikke sortere plugins. Detaljer: %1%" - -#~ msgid "Invalid game ID supplied." -#~ msgstr "Ugyldigt spil‐id angivet." - -#~ msgid "Unsupported game ID supplied." -#~ msgstr "Ikke‐understøttet spil‐id angivet." - -#~ msgid "Invalid folder path:" -#~ msgstr "Ugyldig mappesti:" - -#~ msgid "Expected \"%1%\" at \"%2%\"." -#~ msgstr "Forventede “%1%” ved “%2%”." - -#~ msgid "Clean with %1%." -#~ msgstr "Rengør med %1%." - -#~ msgid "Contains %1% deleted navmeshes. Clean with %2%." -#~ msgstr "Indeholder %1% slettede navmesh’er. Rengør med %2%." - -#~ msgid "Contains %1% deleted references. Clean with %2%." -#~ msgstr "Indeholder %1% slettede referencer. Rengør med %2%." - -#~ msgid "Contains %1% ITM records. Clean with %2%." -#~ msgstr "Indeholder %1% ITM‐poster. Rengør med %2%." - -#~ msgid "Building plugin graph..." -#~ msgstr "Bygger plugin‐graf…" - -#~ msgid "Adding edges to plugin graph and performing topological sort..." -#~ msgstr "Tilføjer kanter til plugin‐graf og udfører topologisk sortering…" - -#~ msgid "Loading plugin headers..." -#~ msgstr "Indlæser plugin‐hoveder…" - -#~ msgid "Parsing masterlist..." -#~ msgstr "Analyserer masterliste…" - -#~ msgid "Parsing userlist..." -#~ msgstr "Analyserer brugerliste…" - -#~ msgid "Loading general messages..." -#~ msgstr "Indlæser generelle beskeder…" - -#~ msgid "Updating and parsing masterlist..." -#~ msgstr "Opdaterer og analyserer masterliste…" - -#~ msgid "Regenerating displayed content..." -#~ msgstr "Regenerér vist indhold…" - -#~ msgid "Loading game data..." -#~ msgstr "Indlæser spildata…" - -#~ msgid "Updating masterlist..." -#~ msgstr "Opdaterer masterliste…" - -#~ msgid "Sorting plugins..." -#~ msgstr "Sorterer plugins…" - -#~ msgid "Refreshing data..." -#~ msgstr "Genindlæser data…" - -#~ msgid "Checking if plugins have been loaded..." -#~ msgstr "Tjekker om plugins er blevet indlæst…" - -#~ msgid "Show Only Conflicts" -#~ msgstr "Vis kun konflikter" - -#~ msgid "Filter content" -#~ msgstr "Filtrér indhold" - -#~ msgid "An exception occurred while loading this plugin. Details:" -#~ msgstr "" -#~ "Der opstod en undtagelse under indlæsningen af dette plugin. Detaljer:" - -#~ msgid "Error: Games' settings parsing failed. %1%" -#~ msgstr "Fejl: Kunne ikke analysere spillenes indstillinger. %1%" - -#~ msgid "Masterlist updated to revision %s." -#~ msgstr "Masterliste opdateret til udgave %s." - -#~ msgid "The metadata for \"%s\" has been copied to the clipboard." -#~ msgstr "Metadata for “%s” blev kopieret til udklipsholderen." - -#~ msgid "" -#~ "Are you sure you want to clear all existing user-added metadata from \"%s" -#~ "\"?" -#~ msgstr "" -#~ "Er du sikker på du vil rydde al eksisterende brugertilføjet metadata fra " -#~ "“%s”?" - -#~ msgid "The user-added metadata for \"%s\" has been cleared." -#~ msgstr "Det brugertilføjede metadata for “%s” blev ryddet." - -#~ msgid "" -#~ "You have not yet applied or cancelled your %s. Are you sure you want to " -#~ "quit?" -#~ msgstr "" -#~ "Du har ikke anvendt eller annulleret din %s. Er du sikker på du vil " -#~ "afslutte?" - -#~ msgid "unknown" -#~ msgstr "ukendt" - -#~ msgid "Contains %1% UDR records. Clean with %2%." -#~ msgstr "Indeholder %1% UDR-poster. Rengør med %2%." - -#~ msgid "Contains %1% ITM records and %2% UDR records. Clean with %3%." -#~ msgstr "Indeholder %1% ITM-poster og %2% UDR-poster. Rengør med %3%." - -#~ msgid "Yes" -#~ msgstr "Ja" - -#~ msgid "UDR Count" -#~ msgstr "UDR-antal" - -#~ msgid "Priority Is Global" -#~ msgstr "Prioritet er global" - -#~ msgid "File" -#~ msgstr "Fil" - -#~ msgid "Game" -#~ msgstr "Spil" - -#~ msgid "Help" -#~ msgstr "Hjælp" - -#~ msgid "Sort" -#~ msgstr "Sortér" - -#~ msgid "Add File" -#~ msgstr "Tilføj fil" - -#~ msgid "Edit File" -#~ msgstr "Redigér fil" - -#~ msgid "Remove File" -#~ msgstr "Fjern fil" - -#~ msgid "Save Changes" -#~ msgstr "Gem ændringer" - -#~ msgid "Copy Name" -#~ msgstr "Kopiér navn" - -#~ msgid "Edit Message" -#~ msgstr "Redigér besked" - -#~ msgid "Remove Message" -#~ msgstr "Fjern besked" - -#~ msgid "Add Bash Tag" -#~ msgstr "Tilføj bash-tag" - -#~ msgid "Edit Bash Tag" -#~ msgstr "Redigér bash-tag" - -#~ msgid "Remove Bash Tag" -#~ msgstr "Fjern bash-tag" - -#~ msgid "LOOT: Add File/Plugin" -#~ msgstr "LOOT: Tilføj fil/plugin" - -#~ msgid "LOOT: Add Message" -#~ msgstr "LOOT: Tilføj besked" - -#~ msgid "LOOT: Add Tag" -#~ msgstr "LOOT: Tilføj tag" - -#~ msgid "LOOT: Edit File/Plugin" -#~ msgstr "LOOT: Redigér fil/plugin" - -#~ msgid "LOOT: Edit Message" -#~ msgstr "LOOT: Redigér besked" diff --git a/resources/l10n/de/LC_MESSAGES/loot.po b/resources/l10n/de/LC_MESSAGES/loot.po deleted file mode 100644 index b5df7283..00000000 --- a/resources/l10n/de/LC_MESSAGES/loot.po +++ /dev/null @@ -1,1788 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: BOSS v3.0.0\n" -"Report-Msgid-Bugs-To: https://github.com/loot/loot/issues\n" -"POT-Creation-Date: 2016-10-20 17:26+0200\n" -"PO-Revision-Date: 2016-10-20 17:26+0200\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: de_DE\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.11\n" -"X-Poedit-KeywordsList: translate:1,1t;translate:1c,2,t\n" -"X-Poedit-Basepath: ../../src\n" -"X-Poedit-SourceCharset: UTF-8\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Poedit-SearchPath-0: backend\n" -"X-Poedit-SearchPath-1: gui\n" - -#: src/gui/html/js/events.js:18 -msgid "Identifying conflicting plugins..." -msgstr "Ermittle inkompatible Plugins..." - -#: src/gui/html/js/events.js:100 -msgid "No masterlist update was necessary." -msgstr "Keine Aktualisierung der Masterlist war nötig." - -#: src/gui/html/js/events.js:150 -msgid "Sorting made no changes to the load order." -msgstr "Das Sortieren hat keine Änderungen der Ladereihenfolge bewirkt." - -#: src/gui/html/js/events.js:182 -msgid "Redate Plugins?" -msgstr "Plugins neu datieren?" - -#: src/gui/html/js/events.js:182 -msgid "" -"This feature is provided so that modders using the Creation Kit may set the " -"load order it uses. A side-effect is that any subscribed Steam Workshop mods " -"will be re-downloaded by Steam. Do you wish to continue?" -msgstr "" -"Dieses Feature wird zur Verfügung gestellt, damit Modder, die das Creation " -"Kit benutzen, die Ladereihenfolge setzen können, die dieses benutzt. Ein " -"Seiteneffekt davon ist, dass jegliche abonnierten Mods aus dem Steam " -"Workshop von Steam erneut heruntergeladen werden. Wollen Sie fortfahren?" - -#: src/gui/html/js/events.js:182 -msgid "Redate" -msgstr "Neu datieren" - -#: src/gui/html/js/events.js:191 -msgid "" -"Are you sure you want to clear all existing user-added metadata from all " -"plugins?" -msgstr "" -"Sind Sie sicher, dass Sie alle bestehenden vom Benutzer hinzugefügten " -"Metadaten von allen Plugins entfernen wollen?" - -#: src/gui/html/js/events.js:191 src/gui/html/js/events.js:401 -msgid "Clear" -msgstr "Entfernen" - -#: src/gui/html/js/events.js:202 -msgid "All user-added metadata has been cleared." -msgstr "Alle vom Benutzer hinzugefügten Metadaten wurden entfernt." - -#: src/gui/html/js/events.js:225 -msgid "LOOT's content has been copied to the clipboard." -msgstr "Der Inhalt von LOOT wurde in die Zwischenablage kopiert." - -#: src/gui/html/js/events.js:236 -msgid "The load order has been copied to the clipboard." -msgstr "Die Ladereihenfolge wurde in die Zwischenablage kopiert." - -#: src/gui/html/js/events.js:267 src/gui/html/js/translateStaticText.js:195 -msgid "Quit" -msgstr "Beenden" - -#: src/gui/html/js/events.js:279 -msgid "sorted load order" -msgstr "sortierte Ladereihenfolge" - -#: src/gui/html/js/events.js:281 -msgid "metadata edits" -msgstr "Metadaten Änderungen" - -#: src/gui/html/js/filters.js:28 -msgid "Do not clean" -msgstr "Nicht säubern" - -#: src/gui/html/js/game.js:22 -msgid "N/A" -msgstr "N/A" - -#: src/gui/html/js/handlePromiseError.js:15 -#: src/gui/html/js/translateStaticText.js:115 -msgid "Error" -msgstr "Fehler" - -#: src/gui/html/js/translateStaticText.js:17 -msgid "Active Plugin" -msgstr "Aktives Plugin" - -#: src/gui/html/js/translateStaticText.js:18 -#: src/gui/html/js/translateStaticText.js:264 -msgid "Master File" -msgstr "Master-Datei" - -#: src/gui/html/js/translateStaticText.js:19 -msgid "Empty Plugin" -msgstr "Leeres Plugin" - -#: src/gui/html/js/translateStaticText.js:20 -msgid "Loads Archive" -msgstr "Lädt Archiv" - -#: src/gui/html/js/translateStaticText.js:21 -#: src/gui/html/js/translateStaticText.js:89 -msgid "Has User Metadata" -msgstr "Hat Benutzer-Metadaten" - -#: src/gui/html/js/translateStaticText.js:23 -msgid "Edit Metadata" -msgstr "Metadaten bearbeiten" - -#: src/gui/html/js/translateStaticText.js:24 -msgid "Copy Metadata" -msgstr "Kopiere Metadaten" - -#: src/gui/html/js/translateStaticText.js:25 -msgid "Clear User Metadata" -msgstr "Entferne Benutzer-Metadaten" - -#: src/gui/html/js/translateStaticText.js:32 -msgid "Enable Edits" -msgstr "Aktiviere Änderungen" - -#: src/gui/html/js/translateStaticText.js:33 -#: src/gui/html/js/translateStaticText.js:88 -msgid "Priority" -msgstr "Priorität" - -#: src/gui/html/js/translateStaticText.js:34 -#: src/gui/html/js/translateStaticText.js:87 -msgid "Global Priority" -msgstr "Globale Priorität" - -#: src/gui/html/js/translateStaticText.js:36 -msgid "Main" -msgstr "Allgemein" - -#: src/gui/html/js/translateStaticText.js:37 -msgid "Load After" -msgstr "Lade Nach" - -#: src/gui/html/js/translateStaticText.js:38 -msgid "Requirements" -msgstr "Voraussetzungen" - -#: src/gui/html/js/translateStaticText.js:39 -msgid "Incompatibilities" -msgstr "Inkompatibilitäten" - -#: src/gui/html/js/translateStaticText.js:40 -msgid "Messages" -msgstr "Nachrichten" - -#: src/gui/html/js/translateStaticText.js:41 -msgid "Bash Tags" -msgstr "Bash Tags" - -#: src/gui/html/js/translateStaticText.js:42 -msgid "Dirty Plugin Info" -msgstr "Schmutzige Plugin Informationen" - -#: src/gui/html/js/translateStaticText.js:43 -msgid "Clean Plugin Info" -msgstr "Saubere Plugin Informationen" - -#: src/gui/html/js/translateStaticText.js:44 -msgid "Locations" -msgstr "Orte" - -#: src/gui/html/js/translateStaticText.js:46 -#: src/gui/html/js/translateStaticText.js:50 -#: src/gui/html/js/translateStaticText.js:54 -msgid "Filename" -msgstr "Dateiname" - -#: src/gui/html/js/translateStaticText.js:47 -#: src/gui/html/js/translateStaticText.js:51 -#: src/gui/html/js/translateStaticText.js:55 -msgid "Display Name" -msgstr "Anzeigename" - -#: src/gui/html/js/translateStaticText.js:48 -#: src/gui/html/js/translateStaticText.js:52 -#: src/gui/html/js/translateStaticText.js:56 -#: src/gui/html/js/translateStaticText.js:60 -#: src/gui/html/js/translateStaticText.js:65 -msgid "Condition" -msgstr "Bedingung" - -#: src/gui/html/js/translateStaticText.js:58 -msgid "Type" -msgstr "Typ" - -#: src/gui/html/js/translateStaticText.js:59 -msgid "Content" -msgstr "Inhalt" - -#: src/gui/html/js/translateStaticText.js:61 -#: src/gui/html/js/translateStaticText.js:252 -msgid "Language" -msgstr "Sprache" - -#: src/gui/html/js/translateStaticText.js:63 -msgid "Add/Remove" -msgstr "Hinzufügen/Entfernen" - -#: src/gui/html/js/translateStaticText.js:64 -msgid "Bash Tag" -msgstr "Bash Tag" - -#: src/gui/html/js/translateStaticText.js:67 -#: src/gui/html/js/translateStaticText.js:73 -msgid "CRC" -msgstr "CRC" - -#: src/gui/html/js/translateStaticText.js:68 -msgid "ITM Count" -msgstr "ITM Anzahl" - -#: src/gui/html/js/translateStaticText.js:69 -msgid "Deleted References" -msgstr "Gelöschte Referenzen" - -#: src/gui/html/js/translateStaticText.js:70 -msgid "Deleted Navmeshes" -msgstr "Gelöschte Navmeshes" - -#: src/gui/html/js/translateStaticText.js:71 -#: src/gui/html/js/translateStaticText.js:74 -msgid "Cleaning Utility" -msgstr "Bereinigungs-Tool" - -#: src/gui/html/js/translateStaticText.js:76 -msgid "URL" -msgstr "URL" - -#: src/gui/html/js/translateStaticText.js:77 -#: src/gui/html/js/translateStaticText.js:261 -msgid "Name" -msgstr "Name" - -#: src/gui/html/js/translateStaticText.js:79 -msgid "Save Metadata" -msgstr "Metadaten speichern" - -#: src/gui/html/js/translateStaticText.js:80 -#: src/gui/html/js/translateStaticText.js:98 -#: src/gui/html/js/translateStaticText.js:182 -#: src/gui/html/js/translateStaticText.js:275 -msgid "Cancel" -msgstr "Abbrechen" - -#: src/gui/html/js/translateStaticText.js:90 -msgid "Editor Is Open" -msgstr "Editor ist geöffnet" - -#: src/gui/html/js/translateStaticText.js:97 -#: src/gui/html/js/translateStaticText.js:289 -msgid "OK" -msgstr "OK" - -#: src/gui/html/js/translateStaticText.js:105 -msgid "A filename is required." -msgstr "Ein Dateiname ist erforderlich." - -#: src/gui/html/js/translateStaticText.js:106 -#: src/gui/html/js/translateStaticText.js:117 -#: src/gui/html/js/translateStaticText.js:127 -#: src/gui/html/js/translateStaticText.js:139 -#: src/gui/html/js/translateStaticText.js:148 -#: src/gui/html/js/translateStaticText.js:156 -#: src/gui/html/js/translateStaticText.js:165 -msgid "Delete Row" -msgstr "Reihe löschen" - -#: src/gui/html/js/translateStaticText.js:113 -msgid "Note" -msgstr "Notiz" - -#: src/gui/html/js/translateStaticText.js:114 -msgid "Warning" -msgstr "Warnung" - -#: src/gui/html/js/translateStaticText.js:116 -msgid "A content string is required." -msgstr "Ein Inhalts-String ist erforderlich." - -#: src/gui/html/js/translateStaticText.js:124 -msgid "Add" -msgstr "Hinzufügen" - -#: src/gui/html/js/translateStaticText.js:125 -msgid "Remove" -msgstr "Entfernen" - -#: src/gui/html/js/translateStaticText.js:126 -#: src/gui/html/js/translateStaticText.js:163 -msgid "A name is required." -msgstr "Ein Name ist erforderlich." - -#: src/gui/html/js/translateStaticText.js:134 -#: src/gui/html/js/translateStaticText.js:146 -msgid "A CRC is required." -msgstr "Eine CRC-Summe ist erforderlich." - -#: src/gui/html/js/translateStaticText.js:135 -#: src/gui/html/js/translateStaticText.js:136 -#: src/gui/html/js/translateStaticText.js:137 -msgid "Values must be integers." -msgstr "Werte müssen ganze Zahlen sein." - -#: src/gui/html/js/translateStaticText.js:138 -#: src/gui/html/js/translateStaticText.js:147 -msgid "A utility name is required." -msgstr "Ein Tool-Name ist erforderlich." - -#: src/gui/html/js/translateStaticText.js:155 -msgid "A link is required." -msgstr "Ein Link ist erforderlich." - -#: src/gui/html/js/translateStaticText.js:164 -msgid "A folder is required." -msgstr "Es wird ein Ordner benötigt." - -#: src/gui/html/js/translateStaticText.js:172 -#: src/gui/html/js/translateStaticText.js:272 -msgid "Add New Row" -msgstr "Neue Reihe hinzügen" - -#: src/gui/html/js/translateStaticText.js:178 -msgid "Jump To General Information" -msgstr "Springe zu allgemeinen Informationen" - -#: src/gui/html/js/translateStaticText.js:179 -msgid "Sort Plugins" -msgstr "Plugins sortieren" - -#: src/gui/html/js/translateStaticText.js:180 -msgid "Update Masterlist" -msgstr "Aktualisiere Masterlist" - -#: src/gui/html/js/translateStaticText.js:181 -#: src/gui/html/js/translateStaticText.js:274 -msgid "Apply" -msgstr "Anwenden" - -#: src/gui/html/js/translateStaticText.js:183 -msgid "Search Cards" -msgstr "Suche Karten" - -#: src/gui/html/js/translateStaticText.js:186 -msgid "Redate Plugins" -msgstr "Datiere Plugins neu" - -#: src/gui/html/js/translateStaticText.js:187 -msgid "Open Debug Log Location" -msgstr "Öffne Debug-Log Pfad" - -#: src/gui/html/js/translateStaticText.js:188 -msgid "Clear All User Metadata" -msgstr "Entferne alle Benutzer-Metadaten" - -#: src/gui/html/js/translateStaticText.js:189 -msgid "Copy Load Order" -msgstr "Kopiere Ladereihenfolge" - -#: src/gui/html/js/translateStaticText.js:190 -msgid "Copy Content" -msgstr "Kopiere Inhalt" - -#: src/gui/html/js/translateStaticText.js:191 -msgid "Refresh Content" -msgstr "Aktualisiere Inhalt" - -#: src/gui/html/js/translateStaticText.js:192 -msgid "View Documentation" -msgstr "Öffne Dokumentation" - -#: src/gui/html/js/translateStaticText.js:193 -msgid "About" -msgstr "Über" - -#: src/gui/html/js/translateStaticText.js:194 -#: src/gui/html/js/translateStaticText.js:244 -msgid "Settings" -msgstr "Einstellungen" - -#: src/gui/html/js/translateStaticText.js:198 -msgid "Search cards" -msgstr "Suche Karten" - -#: src/gui/html/js/translateStaticText.js:203 -msgid "Plugins" -msgstr "Plugins" - -#: src/gui/html/js/translateStaticText.js:204 -msgid "Filters" -msgstr "Filter" - -#: src/gui/html/js/translateStaticText.js:205 -msgid "Press Enter or click outside the input to set the filter." -msgstr "" -"Drücken Sie Enter oder klicken Sie außerhalb der Eingabe, um den Filter zu " -"setzen." - -#: src/gui/html/js/translateStaticText.js:206 -msgid "Show only plugins with cards that contain" -msgstr "Zeige nur Plugins mit Karten mit" - -#: src/gui/html/js/translateStaticText.js:207 -msgid "No text specified" -msgstr "Kein Text angegeben" - -#: src/gui/html/js/translateStaticText.js:210 -msgid "Hide version numbers" -msgstr "Versionsnummern ausblenden" - -#: src/gui/html/js/translateStaticText.js:211 -msgid "Hide CRCs" -msgstr "CRCs ausblenden" - -#: src/gui/html/js/translateStaticText.js:212 -msgid "Hide Bash Tags" -msgstr "Bash Tags ausblenden" - -#: src/gui/html/js/translateStaticText.js:213 -msgid "Hide notes" -msgstr "Notizen ausblenden" - -#: src/gui/html/js/translateStaticText.js:214 -msgid "Hide 'Do not clean' messages" -msgstr "'Nicht säubern'-Nachrichten ausblenden" - -#: src/gui/html/js/translateStaticText.js:215 -msgid "Hide all plugin messages" -msgstr "Alle aktiven Plugins ausblenden" - -#: src/gui/html/js/translateStaticText.js:216 -msgid "Hide inactive plugins" -msgstr "Inaktive Plugins ausblenden" - -#: src/gui/html/js/translateStaticText.js:217 -msgid "Hide messageless plugins" -msgstr "Nachrichtenlose Plugins ausblenden" - -#: src/gui/html/js/translateStaticText.js:220 -msgid "Show only conflicting plugins for" -msgstr "Zeige nur inkompatible Plugins für" - -#: src/gui/html/js/translateStaticText.js:221 -msgid "No plugin selected" -msgstr "Kein Plugin ausgewählt" - -#: src/gui/html/js/translateStaticText.js:225 -msgid "Hidden plugins:" -msgstr "Ausgeblendete Plugins:" - -#: src/gui/html/js/translateStaticText.js:226 -msgid "Hidden messages:" -msgstr "Ausgeblendete Nachrichten:" - -#: src/gui/html/js/translateStaticText.js:231 -msgid "General Information" -msgstr "Allgemeine Informationen" - -#: src/gui/html/js/translateStaticText.js:232 -msgid "Masterlist Revision" -msgstr "Masterlist Revision" - -#: src/gui/html/js/translateStaticText.js:233 -msgid "Masterlist Date" -msgstr "Masterlist Datum" - -#: src/gui/html/js/translateStaticText.js:234 -msgid "Warnings" -msgstr "Warnungen" - -#: src/gui/html/js/translateStaticText.js:235 -msgid "Errors" -msgstr "Fehler" - -#: src/gui/html/js/translateStaticText.js:236 -msgid "Total Messages" -msgstr "Nachrichten insgesamt" - -#: src/gui/html/js/translateStaticText.js:237 -msgid "Active Plugins" -msgstr "Aktive Plugins" - -#: src/gui/html/js/translateStaticText.js:238 -msgid "Dirty Plugins" -msgstr "Schmutzige Plugins" - -#: src/gui/html/js/translateStaticText.js:239 -msgid "Total Plugins" -msgstr "Plugins insgesamt" - -#: src/gui/html/js/translateStaticText.js:247 -msgid "Default Game" -msgstr "Standard-Spiel" - -#: src/gui/html/js/translateStaticText.js:248 -msgid "Autodetect" -msgstr "Automatisch erkennen" - -#: src/gui/html/js/translateStaticText.js:253 -msgid "Language changes will be applied after LOOT is restarted." -msgstr "Spracheinstellungen werden wirksam nachdem LOOT neugestartet wird." - -#: src/gui/html/js/translateStaticText.js:255 -msgid "Enable debug logging" -msgstr "Aktivere Debug-Logging" - -#: src/gui/html/js/translateStaticText.js:256 -msgid "The output is logged to the LOOTDebugLog.txt file." -msgstr "Die Ausgabe wird in die LOOTDebugLog.txt-Datei geloggt." - -#: src/gui/html/js/translateStaticText.js:258 -msgid "Update masterlist before sorting" -msgstr "Aktualisiere Masterlist vor dem Sortieren" - -#: src/gui/html/js/translateStaticText.js:262 -msgid "Base Game" -msgstr "Grund-Spiel" - -#: src/gui/html/js/translateStaticText.js:263 -msgid "LOOT Folder" -msgstr "LOOT Ordner" - -#: src/gui/html/js/translateStaticText.js:265 -msgid "Masterlist Repository URL" -msgstr "Masterlist Repository URL" - -#: src/gui/html/js/translateStaticText.js:266 -msgid "Masterlist Repository Branch" -msgstr "Masterlist Repository Branch" - -#: src/gui/html/js/translateStaticText.js:267 -msgid "Install Path" -msgstr "Installationspfad" - -#: src/gui/html/js/translateStaticText.js:268 -msgid "Install Path Registry Key" -msgstr "Installationspfad Registrierungsschlüssel" - -#: src/gui/html/js/translateStaticText.js:281 -msgid "First-Time Tips" -msgstr "Anfänger-Tips" - -#: src/gui/html/js/translateStaticText.js:283 -msgid "" -"CRCs are only displayed after plugins have been loaded, either by conflict " -"filtering, or by sorting." -msgstr "" -"CRCs werden erst angezeigt nachdem Plugins geladen wurden, entweder durch " -"Konflikt Filter oder durch Sortierung." - -#: src/gui/html/js/translateStaticText.js:284 -msgid "" -"Double-click a plugin in the sidebar to quickly open it in the metadata " -"editor." -msgstr "" -"Doppelklick auf ein Plugin in der Seitenleiste öffnet dieses direkt im " -"Metadaten-Editor." - -#: src/gui/html/js/translateStaticText.js:285 -msgid "" -"Plugins can be drag and dropped from the sidebar into the metadata editor's " -"\"load after\", \"requirements\" and \"incompatibility\" tables." -msgstr "" -"Plugins können per Drag-and-Drop von der Seitenleiste in die Tabellen \"Lade " -"Nach\", \"Voraussetzungen\" und \"Inkompatibilitäten\" des Metadaten-Editors " -"platziert werden." - -#: src/gui/html/js/translateStaticText.js:286 -msgid "" -"Some features are disabled while the metadata editor is open, or while there " -"is a sorted load order that has not been applied or discarded." -msgstr "" -"Einige Funktionen sind deaktiviert während der Metadaten-Editor geöffnet ist " -"oder während es eine sortierte Ladereihenfolge gibt, die nicht gespeichert " -"oder verworfen wurde." - -#: src/gui/html/js/translateStaticText.js:287 -msgid "" -"Many interface elements have tooltips. If you don't know what something is, " -"try hovering your mouse over it to find out. Otherwise, LOOT's documentation " -"can be accessed through the main menu." -msgstr "" -"Viele Oberflächenelemente haben Tooltips. Falls Sie nicht wissen, was etwas " -"ist, versuchen Sie, mit der Maus darüber zu fahren, um mehr zu erfahren. " -"Außerdem kann die LOOT-Dokumentation über das Hauptmenü geöffnet werden." - -#: src/gui/query/get_game_data_query.h:44 -msgid "Parsing, merging and evaluating metadata..." -msgstr "Parsen, Zusammenführen und Auswerten der Metadaten..." - -#: src/gui/query/get_game_data_query.h:79 -msgid "" -"An error occurred while parsing the masterlist: %1%. This probably happened " -"because an update to LOOT changed its metadata syntax support. Try updating " -"your masterlist to resolve the error." -msgstr "" -"Beim Parsen der Masterlist ist ein Fehler aufgetreten: %1%. Die Ursache " -"dafür ist wahrscheinlich, dass ein LOOT-Update die Unterstützung der " -"Metadaten-Syntax verändert hat. Versuchen Sie, die Masterlist zu " -"aktualisieren, um den Fehler zu beheben." - -#: src/gui/query/get_game_data_query.h:93 -msgid "" -"An error occurred while parsing the userlist: %1%. This probably happened " -"because an update to LOOT changed its metadata syntax support. Your user " -"metadata will have to be updated manually.\n" -"\n" -"To do so, use the 'Open Debug Log Location' in LOOT's main menu to open its " -"data folder, then open your 'userlist.yaml' file in the relevant game " -"folder. You can then edit the metadata it contains with reference to the " -"documentation, which is accessible through LOOT's main menu.\n" -"\n" -"You can also seek support on LOOT's forum thread, which is linked to on " -"[LOOT's website](https://loot.github.io/)." -msgstr "" -"Beim Parsen der Benutzerliste ist ein Fehler aufgetreten: %1%. Der Fehler " -"ist wahrscheinlich aufgetreten, weil ein LOOT-Update die Unterstützung von " -"Medaten-Syntax verändert hat. Ihre Benutzer-Metadaten müssen manuell " -"aktualisiert werden.\n" -"\n" -"Klicken Sie dazu auf 'Öffne Debug-Log Pfad' im Hauptmenü von LOOT, um den " -"Daten-Ordner zu öffnen, dann öffnen Sie die Datei 'userlist.yaml' im " -"betroffenen Spiele-Ordner. Nun können Sie die enthaltenen Metadaten " -"bearbeiten mit Hilfe der Dokumentation, die über das Hauptmenü von LOOT " -"geöffnet werden kann.\n" -"\n" -"Sie können auch Hilfe über den LOOT Forumsbeitrag bekommen, welcher auf der " -"[LOOT Webseite](https://loot.github.io/) verlinkt ist." - -#: src/gui/query/metadata_query.h:79 src/gui/query/metadata_query.h:80 -msgid "(edited)" -msgstr "(bearbeitet)" - -#: src/gui/query/metadata_query.h:101 -msgid "" -"A global message contains a condition that could not be evaluated. Details: " -"%1%" -msgstr "" -"Eine globale Nachricht enthält eine Bedingung, die nicht ausgewertet werden " -"konnte. Details: %1%" - -#: src/gui/query/metadata_query.h:127 src/backend/plugin/plugin_sorter.cpp:219 -msgid "\"%1%\" contains a condition that could not be evaluated. Details: %2%" -msgstr "" -"\"%1%\" enthält eine Bedingung, die nicht ausgewertet werden konnte. " -"Details: %2%" - -#: src/gui/query/sort_plugins_query.h:48 -msgid "Loading plugin contents..." -msgstr "Lade Plugin Inhalte..." - -#: src/gui/query/sort_plugins_query.h:68 -msgid "Sorting load order..." -msgstr "Sortiere Ladereihenfolge..." - -#: src/backend/app/loot_paths.cpp:84 -msgid "Failed to get %LOCALAPPDATA% path." -msgstr "Fehler beim Öffnen des Pfades %LOCALAPPDATA%." - -#: src/backend/app/loot_state.cpp:124 -msgid "Error: Could not create LOOT settings file. %1%" -msgstr "" -"Fehler: Die LOOT Konfigurations-Datei konnte nicht erstellt werden. %1%" - -#: src/backend/app/loot_state.cpp:131 -msgid "Error: Settings parsing failed. %1%" -msgstr "Fehler: Die Einstellungen konnten nicht gelesen werden. %1%" - -#: src/backend/app/loot_state.cpp:193 -msgid "Error: Game-specific settings could not be initialised. %1%" -msgstr "" -"Fehler: Spielspezifische Einstellungen konnten nicht initialisiert werden. " -"%1%" - -#: src/backend/app/loot_state.cpp:272 -msgid "None of the supported games were detected." -msgstr "Keines der unterstützten Spiele wurde erkannt." - -#: src/backend/game/game.cpp:61 -msgid "Invalid game ID supplied." -msgstr "Ungültige Spiel-ID übergeben." - -#: src/backend/game/game.cpp:68 -msgid "Game path could not be detected." -msgstr "Spielpfad konnte nicht ermittelt werden." - -#: src/backend/game/game.cpp:78 -msgid "Could not create LOOT folder for game. Details:" -msgstr "Konnte den LOOT-Ordner für das Spiel nicht erzeugen. Details:" - -#: src/backend/game/load_order_handler.cpp:49 -msgid "Unsupported game ID supplied." -msgstr "Nicht unterstützte Spiel-ID übergeben." - -#: src/backend/game/load_order_handler.cpp:54 -msgid "Game path is not initialised." -msgstr "Spielpfad ist nicht initialisiert." - -#: src/backend/game/load_order_handler.cpp:88 -msgid "" -"libloadorder failed to create a game handle. Details could not be fetched." -msgstr "" -"libloadorder konnte keine Spiel-Referenz anlegen. Es konnten keine Details " -"ermittelt werden." - -#: src/backend/game/load_order_handler.cpp:91 -msgid "libloadorder failed to create a game handle. Details:" -msgstr "libloadorder konnte keine Spiel-Referenz anlegen. Details:" - -#: src/backend/game/load_order_handler.cpp:109 -msgid "" -"libloadorder failed to check if a plugin is active. Details could not be " -"fetched." -msgstr "" -"libloadorder konnte nicht prüfen, ob ein Plugin aktiv ist. Es konnten keine " -"Details ermittelt werden." - -#: src/backend/game/load_order_handler.cpp:112 -msgid "libloadorder failed to check if a plugin is active. Details:" -msgstr "libloadorder konnte nicht prüfen, ob ein Plugin aktiv ist. Details:" - -#: src/backend/game/load_order_handler.cpp:134 -msgid "" -"libloadorder failed to get the load order. Details could not be fetched." -msgstr "" -"libloadorder konnte die Ladereihenfolge nicht ermitteln. Es konnten keine " -"Details ermittelt werden." - -#: src/backend/game/load_order_handler.cpp:137 -msgid "libloadorder failed to get the load order. Details:" -msgstr "libloadorder konnte die Ladereihenfolge nicht verändern. Details:" - -#: src/backend/game/load_order_handler.cpp:160 -msgid "" -"libloadorder failed to set the load order. Details could not be fetched." -msgstr "" -"libloadorder konnte die Ladereihenfolge nicht verändern. Es konnten keine " -"Details ermittelt werden." - -#: src/backend/game/load_order_handler.cpp:163 -msgid "libloadorder failed to set the load order. Details:" -msgstr "libloadorder konnte die Ladereihenfolge nicht verändern. Details:" - -#: src/backend/helpers/git_helper.cpp:105 -msgid "Git operation failed. Error: %1%" -msgstr "Git-Operation ist fehlgeschalgen. Fehler: %1%" - -#: src/backend/helpers/git_helper.cpp:146 -msgid "" -"An error occurred while trying to clone the remote masterlist repository." -msgstr "" -"Beim Klonen des Remote Masterlist Repository ist ein Fehler aufgetreten." - -#: src/backend/helpers/git_helper.cpp:195 -msgid "" -"An error occurred while trying to update the masterlist. This could be due " -"to a server-side error. Try again in a few minutes." -msgstr "" -"Beim Aktualisieren der Masterlist ist ein Fehler aufgetreten. Die Ursache " -"könnte ein Fehler auf Server-Seite sein. Versuchen Sie es in wenigen Minuten " -"erneut." - -#: src/backend/helpers/helpers.cpp:81 -msgid "Unable to open \"%1%\" for CRC calculation." -msgstr "Konnte \"%1%\" zur Berechnung der CRC-Prüfsumme nicht öffnen." - -#: src/backend/helpers/helpers.cpp:122 src/backend/helpers/helpers.cpp:125 -msgid "Failed to open file in its default application." -msgstr "Die Datei konnte nicht mit der Standard-Anwendung geöffnet werden." - -#: src/backend/metadata/condition_evaluator.cpp:170 -msgid "Invalid file path:" -msgstr "Ungültiger Dateipfad:" - -#: src/backend/metadata/condition_evaluator.cpp:180 -#: src/backend/metadata/condition_evaluator.cpp:220 -msgid "Invalid regex string \"%1%\": %2%" -msgstr "Ungültiger regulärer Ausdruck \"%1%\": %2%" - -#: src/backend/metadata/condition_grammar.h:203 -msgid "Failed to parse condition \"%1%\": expected \"%2%\" at \"%3%\"." -msgstr "" -"Fehler beim Parsen von Bedingung \"%1%\": erwartete \"%2%\" an \"%3%\"." - -#: src/backend/metadata/conditional_metadata.cpp:91 -msgid "" -"Failed to parse condition \"%1%\": only partially matched expected syntax." -msgstr "" -"Fehler beim Parsen von Bedingung \"%1%\": entspricht nur teilweise der " -"erwarteten Syntax." - -#: src/backend/metadata/plugin_cleaning_data.cpp:88 -msgid "" -"%1% found %2% ITM records, %3% deleted references and %4% deleted navmeshes." -msgstr "" -"%1% hat %2% ITM Einträge, %3% gelöschte Referenzen und %4% gelöschte " -"Navmeshes gefunden." - -#: src/backend/metadata/plugin_cleaning_data.cpp:90 -msgid "%1% found dirty edits." -msgstr "%1% hat schmutzige Änderungen gefunden." - -#: src/backend/metadata/plugin_cleaning_data.cpp:93 -msgid "%1% found %2% deleted references and %3% deleted navmeshes." -msgstr "%1% hat %2% gelöschte Referenzen und %3% gelöschte Navmeshes gefunden." - -#: src/backend/metadata/plugin_cleaning_data.cpp:95 -msgid "%1% found %2% deleted navmeshes." -msgstr "%1% hat %2% gelöschte Navmeshes gefunden." - -#: src/backend/metadata/plugin_cleaning_data.cpp:97 -msgid "%1% found %2% deleted references." -msgstr "%1% hat %2% gelöschte Referenzen gefunden." - -#: src/backend/metadata/plugin_cleaning_data.cpp:100 -msgid "%1% found %2% ITM records and %3% deleted navmeshes." -msgstr "%1% hat %2% ITM Einträge und %3% gelöscht Navmeshes gefunden." - -#: src/backend/metadata/plugin_cleaning_data.cpp:102 -msgid "%1% found %2% ITM records." -msgstr "%1% hat %2% ITM Einträge gefunden." - -#: src/backend/metadata/plugin_cleaning_data.cpp:105 -msgid "%1% found %2% ITM records and %3% deleted references." -msgstr "%1% hat %2% ITM Einträge und %3% gelöscht Referenzen gefunden." - -#: src/backend/plugin/plugin.cpp:115 -msgid "Cannot read \"%1%\". Details: %2%" -msgstr "Kann \"%1%\" nicht lesen. Details: %2%" - -#: src/backend/plugin/plugin.cpp:221 src/backend/plugin/plugin.cpp:232 -msgid "This plugin requires \"%1%\" to be installed, but it is missing." -msgstr "Für dieses Plugin muss \"%1%\" installiert sein, dieses fehlt aber." - -#: src/backend/plugin/plugin.cpp:224 -msgid "This plugin requires \"%1%\" to be active, but it is inactive." -msgstr "Für dieses Plugin muss \"%1%\" aktiv sein, dieses ist aber inaktiv." - -#: src/backend/plugin/plugin.cpp:238 -msgid "This plugin is incompatible with \"%1%\", but both are present." -msgstr "" -"Dieses Plugin ist inkompatibel mit \"%1%\", es sind jedoch beide vorhanden." - -#: src/backend/plugin/plugin_sorter.cpp:84 -msgid "" -"Cyclic interaction detected between plugins \"%1%\" and \"%2%\". Back cycle: " -"%3%" -msgstr "" -"Zyklische Interaktion festgestellt zwischen Plugins \"%1%\" und \"%2%\". " -"Rückwärts-Zyklus: %3%" - -#: src/backend/masterlist.cpp:44 -msgid "" -"An error occurred while trying to read the local masterlist's version. If " -"this error happens again, try deleting the \".git\" folder in %1%." -msgstr "" -"Beim Lesen der lokalen Masterlist-Version ist ein Fehler aufgetreten. Falls " -"dieser Fehler erneut auftritt, kann es helfen, den \".git\" Ordner zu " -"löschen in %1%." - -#: src/backend/masterlist.cpp:48 -msgid "N/A: No masterlist present" -msgstr "N/A: Keine Masterlist vorhanden" - -#: src/backend/masterlist.cpp:51 -msgid "Unknown: Git repository missing" -msgstr "Unbekannt: Git Repository fehlt" - -#: src/backend/masterlist.cpp:116 src/backend/masterlist.cpp:130 -msgid "" -"An error occurred while trying to access the local masterlist repository. If " -"this error happens again, try deleting the \".git\" folder in %1%." -msgstr "" -"Beim Zugriff auf das lokale Masterlist Repository ist ein Fehler " -"aufgetreten. Falls dieser Fehler erneut auftritt, kann es helfen, den \".git" -"\" Ordner zu löschen in %1%." - -#: src/backend/masterlist.cpp:237 -msgid "" -"An error occurred while trying to read information on the updated " -"masterlist. If this error happens again, try deleting the \".git\" folder in " -"%1%." -msgstr "" -"Beim Lesen der Informationen über die aktualisierte Masterlist ist ein " -"Fehler aufgetreten. Falls dieser Fehler erneut auftritt, kann es helfen, den " -"\".git\" Ordner zu löschen in %1%." - -#: src/backend/masterlist.cpp:251 -msgid "Masterlist revision" -msgstr "Revision der Masterlist" - -#: src/backend/masterlist.cpp:255 -msgid "" -"The latest masterlist revision contains a syntax error, LOOT is using the " -"most recent valid revision instead. Syntax errors are usually minor and " -"fixed within hours." -msgstr "" -"Die neueste Masterlist Revision enthält Syntax-Fehler, LOOT benutzt " -"stattdessen die letzte fehlerfreie Revision. Syntax-Fehler sind " -"normalerweise minderschwer und werden zumeist innerhalb weniger Stunden " -"behoben." - -#~ msgid "" -#~ "libloadorder failed to initialise game master file support. Details could " -#~ "not be fetched." -#~ msgstr "" -#~ "libloadorder konnte die Unterstützung für die Spiel-Stammdatei nicht " -#~ "initialisieren. Es konnten keine Details ermittelt werden." - -#~ msgid "libloadorder failed to initialise game master file support. Details:" -#~ msgstr "" -#~ "libloadorder konnte die Unterstützung für die Spiel-Stammdatei nicht " -#~ "initialisieren. Details:" - -#~ msgid "" -#~ "libloadorder failed to get the active plugins list. Details could not be " -#~ "fetched." -#~ msgstr "" -#~ "libloadorder konnte die Liste der aktiven Plugins nicht laden. Es konnten " -#~ "keine Details ermittelt werden." - -#~ msgid "libloadorder failed to get the active plugins list. Details:" -#~ msgstr "" -#~ "libloadorder konnte die Liste der aktiven Plugins nicht laden. Details: " - -#~ msgid "An exception occurred while loading this plugin. Details: " -#~ msgstr "Beim Laden des Plugins ist ein Fehler aufgetreten. Details: " - -#~ msgid "An exception occurred while loading this plugin. Details:" -#~ msgstr "Beim Laden des Plugins ist ein Fehler aufgetreten. Details: " - -#~ msgid "Building plugin graph..." -#~ msgstr "Konstruiere Plugin-Graphen..." - -#~ msgid "Adding edges to plugin graph and performing topological sort..." -#~ msgstr "" -#~ "Füge Kanten zum Plugin-Graphen hinzu und führe topologische Sortierung " -#~ "aus..." - -#~ msgid "Object memory already allocated!" -#~ msgstr "Objekt-Speicher bereits alloziert!" - -#~ msgid "Tree memory already allocated!" -#~ msgstr "Baum-Speicher bereits alloziert!" - -#~ msgid "Diff memory already allocated!" -#~ msgstr "Diff-Speicher bereits alloziert!" - -#~ msgid "Repository handle not open!" -#~ msgstr "Repository-Handle nicht geöffnet!" - -#~ msgid "Rolled back to the previous revision." -#~ msgstr "Auf die vorherige Revision zurückgerollt." - -#~ msgid "Failed to parse condition \"%1%\": %2%" -#~ msgstr "Fehler beim Parsen der Bedingung \"%1%\": %2%" - -#~ msgid "Failed to parse condition \"%1%\"." -#~ msgstr "Fehler beim Parsen der Bedingung \"%1%\"." - -#~ msgid "" -#~ "Contains %1% ITM records, %2% deleted references and %3% deleted " -#~ "navmeshes. Clean with %4%." -#~ msgstr "" -#~ "Enthält %1% ITM Einträge, %2% gelöschte Referenzen und %3% gelöschte " -#~ "Navmeshes. Säubern mit %4%." - -#~ msgid "Clean with %1%." -#~ msgstr "Säubern mit %1%." - -#~ msgid "" -#~ "Contains %1% deleted references and %2% deleted navmeshes. Clean with %3%." -#~ msgstr "" -#~ "Enthält %1% gelöschte Referenzen und %2% gelöschte Navmeshes. Säubern mit " -#~ "%3%." - -#~ msgid "Contains %1% deleted navmeshes. Clean with %2%." -#~ msgstr "Enthält %1% gelöschte Navmeshes. Säubern mit %2%." - -#~ msgid "Contains %1% deleted references. Clean with %2%." -#~ msgstr "Enthält %1% gelöschte Referenzen. Säubern mit %2%." - -#~ msgid "Contains %1% ITM records and %2% deleted navmeshes. Clean with %3%." -#~ msgstr "" -#~ "Enthält %1% ITM Einträge und %2% gelöschte Navmeshes. Säubern mit %3%." - -#~ msgid "Contains %1% ITM records. Clean with %2%." -#~ msgstr "Enthält %1% ITM Einträge. Säubern mit %2%." - -#~ msgid "Contains %1% ITM records and %2% deleted references. Clean with %3%." -#~ msgstr "" -#~ "Enthält %1% ITM Einträge und %2% gelöschte Referenzen. Säubern mit %3%." - -#~ msgid "Error: Games' settings parsing failed. %1%" -#~ msgstr "" -#~ "Fehler: Die Einstellungen des Spiels konnten nicht gelesen werden. %1%" - -#~ msgid "Failed to change game. Details: %1%" -#~ msgstr "Das Spiel konnte nicht gewechselt werden. Details: %1%" - -#~ msgid "Failed to copy plugin metadata. Details: %1%" -#~ msgstr "Die Plugin Metadaten konnten nicht kopiert werden. Details: %1%" - -#~ msgid "Checking for conflicting plugins..." -#~ msgstr "Prüfe auf inkompatible Plugins..." - -#~ msgid "Shell execute failed." -#~ msgstr "Shell-Ausführung fehlgeschlagen." - -#~ msgid "Loading plugin headers..." -#~ msgstr "Lade Plugin Header..." - -#~ msgid "Parsing masterlist..." -#~ msgstr "Parse Masterlist..." - -#~ msgid "An error occurred while parsing the masterlist: %1%" -#~ msgstr "Beim Parsen der Masterlist ist ein Fehler aufgetreten: %1%" - -#~ msgid "Parsing userlist..." -#~ msgstr "Parse Benutzerliste..." - -#~ msgid "An error occurred while parsing the userlist: %1%" -#~ msgstr "Beim Parsen der Benutzerliste ist ein Fehler aufgetreten: %1%" - -#~ msgid "Merging and evaluating plugin metadata..." -#~ msgstr "Die Plugin Metadaten werden zusammengeführt und evaluiert..." - -#~ msgid "Loading general messages..." -#~ msgstr "Lade allgemeine Nachrichten..." - -#~ msgid "Failed to get game data. Details: %1%" -#~ msgstr "Die Spieldaten konnten nicht geladen werden. Details: %1%" - -#~ msgid "Updating and parsing masterlist..." -#~ msgstr "Update und Parsen der Masterlist..." - -#~ msgid "Regenerating displayed content..." -#~ msgstr "Aktualisiere angezeigte Inhalte..." - -#~ msgid "Failed to update the masterlist. Details: %1%" -#~ msgstr "Die Masterlist konnte nicht aktualisiert werden. Details: %1%" - -#~ msgid "Failed to sort plugins. Details: %1%" -#~ msgstr "Die Plugins konnten nicht sortiert werden. Details: %1%" - -#~ msgid "Invalid folder path:" -#~ msgstr "Ungültiger Ordnerpfad:" - -#~ msgid "Invalid regex string:" -#~ msgstr "Ungültiger regulärer Ausdruck:" - -#~ msgid "Expected \"%1%\" at \"%2%\"." -#~ msgstr "Erwartete \"%1%\" an \"%2%\"." - -#~ msgid "Loading game data..." -#~ msgstr "Lade Spieldaten..." - -#~ msgid "Masterlist updated to revision %s." -#~ msgstr "Masterlist aktualisiert auf Revision %s." - -#~ msgid "Updating masterlist..." -#~ msgstr "Aktualisiere Masterlist..." - -#~ msgid "Sorting plugins..." -#~ msgstr "Sortiere Plugins..." - -#~ msgid "The metadata for \"%s\" has been copied to the clipboard." -#~ msgstr "Die Metadaten für \"%s\" wurden in die Zwischenablage kopiert." - -#~ msgid "" -#~ "Are you sure you want to clear all existing user-added metadata from \"%s" -#~ "\"?" -#~ msgstr "" -#~ "Sind Sie sicher, dass Sie alle bestehenden vom Benutzer hinzugefügten " -#~ "Metadaten von \"%s\" entfernen wollen?" - -#~ msgid "The user-added metadata for \"%s\" has been cleared." -#~ msgstr "" -#~ "Die vom Benutzer hinzugefügten Metadaten von \"%s\" wurden entfernt." - -#~ msgid "Refreshing data..." -#~ msgstr "Aktualisiere Daten..." - -#~ msgid "Checking if plugins have been loaded..." -#~ msgstr "Prüfe, ob Plugins geladen wurden..." - -#~ msgid "" -#~ "You have not yet applied or cancelled your %s. Are you sure you want to " -#~ "quit?" -#~ msgstr "" -#~ "Sie haben noch nicht ihre %s angewandt oder abgebrochen. Sind Sie sicher, " -#~ "dass Sie beenden wollen?" - -#~ msgid "unknown" -#~ msgstr "unbekannt" - -#~ msgid "Loads BSA" -#~ msgstr "Lädt BSA" - -#~ msgid "Show Only Conflicts" -#~ msgstr "Zeige nur Konflikte" - -#~ msgid "" -#~ "Global priorities are compared against all other plugins. Normal " -#~ "priorities are compared against only conflicting plugins." -#~ msgstr "" -#~ "Globale Prioritäten werden mit allen anderen Plugins verglichen. Normale " -#~ "Prioritäten werden nur mit inkompatiblen Plugins verglichen." - -#~ msgid "Priority Value" -#~ msgstr "Prioritäts-Wert" - -#~ msgid "Dirty Info" -#~ msgstr "Informationen über schmutzige Einträge" - -#~ msgid "Version" -#~ msgstr "Version" - -#~ msgid "Filter content..." -#~ msgstr "Filter Inhalt..." - -#~ msgid "" -#~ "Double-click a plugin in the sidebar to quickly open its metadata editor. " -#~ "Multiple metadata editors can be opened at once." -#~ msgstr "" -#~ "Durch Doppelklick auf ein Plugin in der Sidebar wird direkt der Metadaten-" -#~ "Editor geöffnet. Es können mehrere Metadaten-Editoren gleichzeitig " -#~ "geöffnet werden." - -#~ msgid "" -#~ "Plugins can be drag and dropped from the sidebar into editors' \"load " -#~ "after\", \"requirements\" and \"incompatibility\" tables." -#~ msgstr "" -#~ "Plugins können per Drag-and-Drop von der Sidebar in die Tabellen \"Lade " -#~ "nach\", \"Voraussetzungen\" und \"Inkompatibilitäten\" von Editoren " -#~ "geschoben werden." - -#~ msgid "" -#~ "Some features are disabled while there is an editor open, or while there " -#~ "is a sorted load order that has not been applied or discarded." -#~ msgstr "" -#~ "Einige Features sind deaktiviert während der Editor geöffnet ist oder " -#~ "während es eine sortierte Ladereihenfolge gibt, die nicht angewandt oder " -#~ "verworfen wurde." - -#~ msgid "Cyclic interaction detected between plugins \"%1%\" and \"%2%\"." -#~ msgstr "" -#~ "Zyklische Interaktion zwischen den Plugins \"%1%\" und \"%2%\" ermittelt." - -#~ msgid "None Specified" -#~ msgstr "Nichts spezifiziert." - -#~ msgid "Compare priority against all other plugins" -#~ msgstr "Priorität mit allen anderen Plugins vergleichen" - -#~ msgid "User Metadata Enabled" -#~ msgstr "Benutzer-Metadaten aktiviert" - -#~ msgid "Plugin Name" -#~ msgstr "Plugin Name" - -#~ msgid "" -#~ "Please submit any edits made for reasons other than personal preference " -#~ "to the LOOT team so that they may be included in the masterlist." -#~ msgstr "" -#~ "Bitte senden Sie alle Änderungen, die Sie nicht aus persönlicher Vorliebe " -#~ "vorgenommen haben, an das LOOT-Team, damit diese in der Masterlist " -#~ "übernommen werden können." - -#~ msgid "Show only conflicting plugins" -#~ msgstr "Zeige nur in Konflikt stehende Plugins an" - -#~ msgid "Remove Plugin" -#~ msgstr "Plugins entfernen" - -#~ msgid "Plugin" -#~ msgstr "Plugin" - -#~ msgid "Otherwise, priorities are only compared between conflicting plugins." -#~ msgstr "" -#~ "Anderenfalls werden Prioritäten nur zwischen Plugins verglichen, die " -#~ "miteinander in Konflikt stehen." - -#~ msgid "Select a plugin to edit its load order metadata." -#~ msgstr "" -#~ "Wählen Sie ein Plugin aus, um dessen Lade-Reihenfolge-Metadaten zu " -#~ "bearbeiten." - -#~ msgid "" -#~ "Drag and drop a plugin here to make the selected plugin load after it. " -#~ "The \"Show only conflicting plugins\" checkbox must be checked." -#~ msgstr "" -#~ "Ziehen Sie ein Plugin per Drag-and-drop an diese Stelle, um das " -#~ "ausgewählte Plugin danach zu laden. Die \"Zeige nur in Konflikt stehende " -#~ "Plugins an\"-Box muss aktiviert sein." - -#~ msgid "" -#~ "Plugins with higher priorities will load after plugins with smaller " -#~ "priorities that they conflict with, unless one must explicitly load after " -#~ "the other." -#~ msgstr "" -#~ "Plugins mit höherer Prioriät werden nach den Plugins mit geringerer " -#~ "Priorität geladen, mit denen Sie in Konflikt stehen, es sei denn, eines " -#~ "muss explizit nach dem anderen geladen werden." - -#~ msgid "" -#~ "Filters the plugin list to only display plugins which can be loaded after " -#~ "the currently selected plugin, and which either conflict with it, or, if " -#~ "it loads a BSA, also load BSAs. Also enables drag and drop of plugins " -#~ "into the Load After box." -#~ msgstr "" -#~ "Filtert die Plugin-Liste, sodass nur Plugins angezeigt werden, die nach " -#~ "dem momentan ausgewählten Plugin geladen werden können und die entweder " -#~ "mit diesem in Konflikt stehen oder, falls es ein BSA lädt, ebenfalls BSAs " -#~ "laden. Aktiviert außerdem die Möglichkeit, per Drag-and-drop Plugins in " -#~ "die Lade später-Box zu ziehen." - -#~ msgid "" -#~ "Only newly-added plugins may be removed here. Use the metadata editor to " -#~ "remove other user-added plugins." -#~ msgstr "" -#~ "Nur neu hinzugefügte Plugins dürfen hier entfernt werden. Verwenden Sie " -#~ "den Metadaten-Editor, um andere durch den Benutzer hinzugefügte Plugins " -#~ "zu entfernen." - -#~ msgid "Priority: " -#~ msgstr "Priorität:" - -#~ msgid "Enable User Changes" -#~ msgstr "Aktiviere Benutzer-Änderungen" - -#~ msgid "Add File" -#~ msgstr "Datei hinzufügen" - -#~ msgid "Edit File" -#~ msgstr "Datei bearbeiten" - -#~ msgid "Remove File" -#~ msgstr "Datei entfernen" - -#~ msgid "Save Changes" -#~ msgstr "Änderungen speichern" - -#~ msgid "UDR Count" -#~ msgstr "UDR Anzahl" - -#~ msgid "Deleted Navmesh Count" -#~ msgstr "Gelöschte Navmeshs Anzahl" - -#~ msgid "Copy Name" -#~ msgstr "Kopiere Namen" - -#~ msgid "Copy Metadata As Text" -#~ msgstr "Kopiere Metadaten als Text" - -#~ msgid "Remove All User-Added Metadata" -#~ msgstr "Entferne alle durch den Benutzer hinzugefügten Metadaten" - -#~ msgid "" -#~ "If unchecked, any user-added metadata will be ignored during sorting." -#~ msgstr "" -#~ "Falls deaktiviert, werden alle durch den Benutzer hinzugefügten Metadaten " -#~ "bei der Sortierung ignoriert." - -#~ msgid "Only user-added data may be removed." -#~ msgstr "" -#~ "Nur durch den Benutzer hinzugefügten Metadaten dürfen entfernt werden." - -#~ msgid "" -#~ "Are you sure you want to clear all existing user-added metadata from this " -#~ "plugin?" -#~ msgstr "" -#~ "Sind Sie sicher, dass sie alle durch den Benutzer hinzugefügten Metadaten " -#~ "von diesem Plugin entfernen wollen?" - -#~ msgid "LOOT: Warning" -#~ msgstr "LOOT: Warnung" - -#~ msgid "Add Plugin" -#~ msgstr "Plugin hinzufügen" - -#~ msgid "Edit Plugin" -#~ msgstr "Plugin bearbeiten" - -#~ msgid "Add Message" -#~ msgstr "Nachricht hinzufügen" - -#~ msgid "Edit Message" -#~ msgstr "Nachricht bearbeiten" - -#~ msgid "Remove Message" -#~ msgstr "Nachricht entfernen" - -#~ msgid "Add Bash Tag" -#~ msgstr "Bash Tag hinzufügen" - -#~ msgid "Edit Bash Tag" -#~ msgstr "Bash Tag bearbeiten" - -#~ msgid "Remove Bash Tag" -#~ msgstr "Bash Tag entfernen" - -#~ msgid "Add Dirty Info" -#~ msgstr "Informationen über unsaubere Einträge hinzufügen" - -#~ msgid "Edit Dirty Info" -#~ msgstr "Informationen über unsaubere Einträge bearbeiten" - -#~ msgid "Remove Dirty Info" -#~ msgstr "Informationen über unsaubere Einträge entfernen" - -#~ msgid "LOOT: Add File/Plugin" -#~ msgstr "LOOT: Datei/Plugin hinzufügen" - -#~ msgid "LOOT: Add Message" -#~ msgstr "LOOT: Nachricht hinzufügen" - -#~ msgid "Error: No content specified. Row will not be added." -#~ msgstr "Fehler: Kein Inhalt angegeben. Die Zeile wird nicht hinzugefügt." - -#~ msgid "LOOT: Error" -#~ msgstr "LOOT: Fehler" - -#~ msgid "LOOT: Add Tag" -#~ msgstr "LOOT: Tag hinzufügen" - -#~ msgid "LOOT: Add Dirty Info" -#~ msgstr "LOOT: Informationen über unsaubere Einträge hinzufügen" - -#~ msgid "LOOT: Edit File/Plugin" -#~ msgstr "LOOT: Datei/Plugin bearbeiten" - -#~ msgid "LOOT: Edit Message" -#~ msgstr "LOOT: Nachricht bearbeiten" - -#~ msgid "Error: No content specified. Row will not be edited." -#~ msgstr "Fehler: Kein Inhalt angegeben. Die Reihe wird nicht verändert." - -#~ msgid "LOOT: Edit Tag" -#~ msgstr "LOOT: Tag bearbeiten" - -#~ msgid "LOOT: Edit Dirty Info" -#~ msgstr "LOOT: Informationen über unsaubere Einträge bearbeiten" - -#~ msgid "" -#~ "If LOOT has gotten something wrong, please let the team know. See the " -#~ "Contributing To LOOT section of the readme for details." -#~ msgstr "" -#~ "Falls LOOT etwas falsch gemacht hat, lassen Sie es das Team bitte wissen. " -#~ "Für weitere Details sehen Sie sich bitte den Abschnitt 'Contributing To " -#~ "LOOT' der Readme an." - -#~ msgid "Masterlist update failed. Details: %1%" -#~ msgstr "Die Masterlist konnte nicht aktualisiert werden. Details: %1%" - -#~ msgid "Masterlist revision check failed. Details: %1%" -#~ msgstr "" -#~ "Die Überprüfung der Masterlist-Revision ist fehlgeschlagen. Details: %1%" - -#~ msgid "Masterlist parsing failed. Details: %1%" -#~ msgstr "Die Masterlist konnte nicht gelesen werden. Details: %1%" - -#~ msgid "Unknown" -#~ msgstr "Unbekannt" - -#~ msgid "No masterlist" -#~ msgstr "Keine Masterlist" - -#~ msgid "Error: LOOT is already running. This instance will now quit." -#~ msgstr "" -#~ "Fehler: LOOT wird bereits ausgeführt. Diese Instanz wird jetzt beendet." - -#~ msgid "Error: Could not create local app data LOOT folder." -#~ msgstr "" -#~ "Fehler: In den lokalen Anwendungsdaten konnte kein LOOT-Ordner angelegt " -#~ "werden." - -#~ msgid "Error: Could not apply translation." -#~ msgstr "Fehler: Es konnte keine Übersetzung angewandt werden." - -#~ msgid "Error: The selected language is not available on this system." -#~ msgstr "" -#~ "Fehler: Die ausgewählte Sprache steht auf diesem System nicht zur " -#~ "Verfügung." - -#~ msgid "Error: None of the supported games were detected." -#~ msgstr "Fehler: Keine der unterstützten Spiele wurden gefunden." - -#~ msgid "View Last Report" -#~ msgstr "Neuesten Bericht ansehen" - -#~ msgid "&View Last Report" -#~ msgstr "&Neuesten Bericht ansehen" - -#~ msgid "View &Debug Log" -#~ msgstr "Debug &Log ansehen" - -#~ msgid "&Sort Plugins" -#~ msgstr "Plugins &Umsortieren" - -#~ msgid "&Redate Plugins" -#~ msgstr "Plugin &Zeitstempel bearbeiten" - -#~ msgid "&File" -#~ msgstr "&Datei" - -#~ msgid "&Metadata..." -#~ msgstr "&Metadaten..." - -#~ msgid "&Settings..." -#~ msgstr "&Einstellungen..." - -#~ msgid "&Edit" -#~ msgstr "&Bearbeiten" - -#~ msgid "&Game" -#~ msgstr "&Spiel" - -#~ msgid "&Help" -#~ msgstr "&Hilfe" - -#~ msgid "" -#~ "Opens the Metadata Editor, where plugins' sorting metadata, messages, " -#~ "dirty info and Bash Tag suggestions can be edited." -#~ msgstr "" -#~ "Öffnet den Metadaten-Editor, mit dem die Sortier-Metadaten, Nachrichten, " -#~ "Informationen über unsaubere Einträge und Bash Tags von Plugins " -#~ "bearbeitet werden können." - -#~ msgid "Sorts your plugins, then displays a report of the results." -#~ msgstr "" -#~ "Sortiert die Plugins und zeigt einen Bericht über die Ergebnisse an." - -#~ msgid "Opens the last report generated for the current game." -#~ msgstr "Öffnet den zuletzt generierten Bericht für das aktuelle Spiel." - -#~ msgid "LOOT: Report Viewer" -#~ msgstr "LOOT: Bericht-Betrachter" - -#~ msgid "LOOT: Settings" -#~ msgstr "LOOT: Einstellungen" - -#~ msgid "Error: \"%1%\" cannot be found." -#~ msgstr "Fehler: \"%1%\" wurde nicht gefunden." - -#~ msgid "" -#~ "Load order optimisation for Oblivion, Skyrim, Fallout 3 and Fallout: New " -#~ "Vegas." -#~ msgstr "" -#~ "Optimierung der Ladereihenfolge für Oblivion, Skyrim, Fallout 3 und " -#~ "Fallout: New Vegas." - -#~ msgid "LOOT: Working..." -#~ msgstr "LOOT: Arbeite..." - -#~ msgid "LOOT working..." -#~ msgstr "LOOT arbeitet..." - -#~ msgid "Userlist parsing failed. Details: %1%" -#~ msgstr "Das Lesen der Benutzerliste ist fehlgeschlagen. Details: %1%" - -#~ msgid "LOOT: Calculated Load Order" -#~ msgstr "LOOT: Ladereihenfolge berechnet" - -#~ msgid "Recalculating load order..." -#~ msgstr "Berechne Ladereihenfolge neu..." - -#~ msgid "Failed to set the load order. Details: %1%" -#~ msgstr "Die Ladereihenfolge konnte nicht geändert werden. Details: %1%" - -#~ msgid "" -#~ "The load order displayed in the Details tab was not applied as sorting " -#~ "was canceled." -#~ msgstr "" -#~ "Die Ladereihenfolge, die im Details-Reiter angezeigt wird, wurde nicht " -#~ "angewandt, da die Sortierung abgebrochen wurde." - -#~ msgid "Failed to calculate the load order. Details: %1%" -#~ msgstr "Die Ladereihenfolge konnte nicht berechnet werden. Details: %1%" - -#~ msgid "Error: %1%" -#~ msgstr "Fehler: %1%" - -#~ msgid "Error: Masterlist parsing failed. %1%" -#~ msgstr "Fehler: Die Masterlist konnte nicht gelesen werden. %1%" - -#~ msgid "Error: Userlist parsing failed. %1%" -#~ msgstr "Fehler: Die Benutzerliste konnte nicht gelesen werden. %1%" - -#~ msgid "LOOT: Metadata Editor" -#~ msgstr "LOOT: Metadaten-Editor" - -#~ msgid "Error: Failed to get load order. %1%" -#~ msgstr "Fehler: Die Ladereihenfolge konnte nicht ermittelt werden. %1%" - -#~ msgid "Error: Failed to set plugin timestamps. %1%" -#~ msgstr "Fehler: Der Plugin-Zeitstempel konnte nicht gesetzt werden. %1%" - -#~ msgid "Plugins were successfully redated." -#~ msgstr "Die Zeitstempel der Plugins wurden erfolgreich bearbeitet." - -#~ msgid "LOOT: Plugin Redate" -#~ msgstr "LOOT: Plugin Zeitstempel bearbeiten" - -#~ msgid "Filename (required):" -#~ msgstr "Dateiname (erforderlich):" - -#~ msgid "Displayed Name:" -#~ msgstr "Anzeigename:" - -#~ msgid "Condition:" -#~ msgstr "Bedingung:" - -#~ msgid "Add Content" -#~ msgstr "Inhalt hinzufügen" - -#~ msgid "Edit Content" -#~ msgstr "Inhalt bearbeiten" - -#~ msgid "Remove Content" -#~ msgstr "Inhalt entfernen" - -#~ msgid "String" -#~ msgstr "Zeichenkette" - -#~ msgid "Type:" -#~ msgstr "Typ:" - -#~ msgid "Language:" -#~ msgstr "Sprache:" - -#~ msgid "Content:" -#~ msgstr "Inhalt:" - -#~ msgid "Error: No content row selected." -#~ msgstr "Fehler: Keine Inhalts-Zeile ausgewählt." - -#~ msgid "Add/Remove:" -#~ msgstr "Hinzufügen/Entfernen:" - -#~ msgid "Name (required):" -#~ msgstr "Name (erforderlich):" - -#~ msgid "CRC (required):" -#~ msgstr "CRC (erforderlich):" - -#~ msgid "ITM Count:" -#~ msgstr "ITM Anzahl:" - -#~ msgid "UDR Count:" -#~ msgstr "UDR Anzahl:" - -#~ msgid "Deleted Navmesh Count:" -#~ msgstr "Anzahl gelöschter Navmeshs:" - -#~ msgid "Cleaning Utility (required):" -#~ msgstr "Bereinigungs-Tool (erforderlich):" - -#~ msgid "None" -#~ msgstr "Keine" - -#~ msgid "Low" -#~ msgstr "Niedrig" - -#~ msgid "Medium" -#~ msgstr "Mittel" - -#~ msgid "High" -#~ msgstr "Hoch" - -#~ msgid "Add Game" -#~ msgstr "Spiel hinzufügen" - -#~ msgid "Edit Game" -#~ msgstr "Spiel bearbeiten" - -#~ msgid "Remove Game" -#~ msgstr "Spiel entfernen" - -#~ msgid "Update masterlist before sorting." -#~ msgstr "Masterlist vorm Sortieren aktualisieren." - -#~ msgid "View reports externally in default browser." -#~ msgstr "Berichte extern im Standard-Browser anzeigen." - -#~ msgid "Base Game Type" -#~ msgstr "Haupt Spiel Typ" - -#~ msgid "LOOT Folder Name" -#~ msgstr "LOOT Ordnername" - -#~ msgid "Default Game:" -#~ msgstr "Standard-Spiel:" - -#~ msgid "Debug Verbosity:" -#~ msgstr "Debug-Ausführlichkeit:" - -#~ msgid "Language and game changes will be applied after LOOT is restarted." -#~ msgstr "" -#~ "Änderungen der Sprache und der Spiele werden aktiv, nachdem LOOT " -#~ "neugestartet wurde." - -#~ msgid "LOOT: Add Game" -#~ msgstr "LOOT: Spiel hinzufügen" - -#~ msgid "" -#~ "Error: A path and/or registry key is required. Row will not be added." -#~ msgstr "" -#~ "Fehler: Ein Pfad und/oder Registrierungsschlüssel ist erforderlich. Die " -#~ "Reihe wird nicht hinzugefügt." - -#~ msgid "" -#~ "Error: A game with this name is already defined. Row will not be added." -#~ msgstr "" -#~ "Fehler: Ein Spiel mit diesem Namen existiert bereits. Die Reihe wird " -#~ "nicht hinzugefügt." - -#~ msgid "" -#~ "Error: A game with this folder name is already defined. Row will not be " -#~ "added." -#~ msgstr "" -#~ "Fehler: Ein Spiel mit diesem Ordnernamen existiert bereits. Die Reihe " -#~ "wird nicht hinzugefügt." - -#~ msgid "LOOT: Edit Game" -#~ msgstr "LOOT: Spiel bearbeiten" - -#~ msgid "Error: Name is required. Row will not be added." -#~ msgstr "Fehler: Name ist erforderlich. Die Reihe wird nicht hinzugefügt." - -#~ msgid "Error: Folder is required. Row will not be added." -#~ msgstr "Fehler: Ordner ist erforderlich. Die Reihe wird nicht hinzugefügt." - -#~ msgid "LOOT Folder Name (required):" -#~ msgstr "LOOT Ordner Name (erforderlich):" - -#~ msgid "Master File:" -#~ msgstr "Master-File:" - -#~ msgid "Masterlist Repository URL:" -#~ msgstr "Masterlist Repository URL:" - -#~ msgid "Masterlist Repository Branch:" -#~ msgstr "Masterlist Repository Branch:" - -#~ msgid "Install Path:" -#~ msgstr "Installationspfad:" - -#~ msgid "Install Path Registry Key:" -#~ msgstr "Installationspfad Registrierungsschlüssel:" - -#~ msgid "Version Information" -#~ msgstr "Informationen zur Version" - -#~ msgid "Plugin & Message Counts" -#~ msgstr "Plugin & Nachrichten Anzahl" - -#~ msgid "Note:" -#~ msgstr "Notiz:" - -#~ msgid "Bash Tag Suggestion(s):" -#~ msgstr "Bash Tag Vorschläge:" - -#~ msgid "Warning:" -#~ msgstr "Warnung:" - -#~ msgid "Error:" -#~ msgstr "Fehler:" - -#~ msgid "LOOT Report" -#~ msgstr "LOOT Bericht" - -#~ msgid "Summary" -#~ msgstr "Zusammenfassung" - -#~ msgid "Details" -#~ msgstr "Details" - -#~ msgid "LOOT Version" -#~ msgstr "LOOT Version" - -#~ msgid "Masterlist Version" -#~ msgstr "Masterlist Version" - -#~ msgid "Masterlist Updating" -#~ msgstr "Masterlist Aktualisierung" - -#~ msgid "Enabled" -#~ msgstr "Aktiviert" - -#~ msgid "Disabled" -#~ msgstr "Deaktiviert" - -#~ msgid "" -#~ "There have been no changes in the Details tab since LOOT was last run for " -#~ "this game." -#~ msgstr "" -#~ "Es hat keine Änderungen im Details-Reiter gegeben, seit LOOT das letzte " -#~ "Mal für dieses Spiel ausgeführt wurde." - -#~ msgid "General Messages" -#~ msgstr "Allgemeine Nachrichten" - -#~ msgid "Total Number of Messages" -#~ msgstr "Gesamtanzahl an Nachrichten" - -#~ msgid "Number of Warnings" -#~ msgstr "Anzahl Warnungen" - -#~ msgid "Number of Errors" -#~ msgstr "Anzahl Fehler" - -#~ msgid "Version:" -#~ msgstr "Version:" - -#~ msgid "Add:" -#~ msgstr "Hinzufügen:" - -#~ msgid "Remove:" -#~ msgstr "Entfernen:" - -#~ msgid "" -#~ "Contains %1% ITM records, %2% UDR records and %3% deleted navmeshes. " -#~ "Clean with %4%." -#~ msgstr "" -#~ "Enthält %1% ITM Einträge, %2% UDR Einträge und %3% gelöschte Navmeshes. " -#~ "Säubern mit %4%." - -#~ msgid "Contains %1% UDR records and %2% deleted navmeshes. Clean with %3%." -#~ msgstr "" -#~ "Enthält %1% UDR Einträge und %2% gelöschte Navmeshes. Säubern mit %3%." - -#~ msgid "Contains %1% UDR records. Clean with %2%." -#~ msgstr "Entält %1% UDR Einträge. Säubern mit %2%." - -#~ msgid "Contains %1% ITM records and %2% UDR records. Clean with %3%." -#~ msgstr "Enthält %1% ITM Einträge und %2% UDR Einträge. Säubern mit %3%." - -#~ msgid "" -#~ "The LOOT Report requires Javascript to be enabled in order to function." -#~ msgstr "" -#~ "Der LOOT Bericht benötigt Javascript um korrekt dargestellt zu werden." - -#~ msgid "Hide Version Numbers" -#~ msgstr "Versionsnummern verbergen" - -#~ msgid "Hide Bash Tag Suggestions" -#~ msgstr "Bash Tag Vorschläge verbergen" - -#~ msgid "Hide Notes" -#~ msgstr "Hinweise verbergen" - -#~ msgid "Hide 'Do Not Clean' Messages" -#~ msgstr "'Nicht säubern'-Nachrichten verbergen" - -#~ msgid "Hide All Plugin Messages" -#~ msgstr "Alle Plugin-Nachrichten verbergen" - -#~ msgid "Hide Messageless Plugins" -#~ msgstr "Plugins ohne Nachrichten verbergen" - -#~ msgid "%1% of %2% plugins hidden." -#~ msgstr "%1% von %2% Plugins verborgen." - -#~ msgid "%1% of %2% messages hidden." -#~ msgstr "%1% von %2% Nachrichten verborgen." diff --git a/resources/l10n/es/LC_MESSAGES/loot.po b/resources/l10n/es/LC_MESSAGES/loot.po deleted file mode 100644 index 9e8cab50..00000000 --- a/resources/l10n/es/LC_MESSAGES/loot.po +++ /dev/null @@ -1,949 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: BOSS v3.0.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-10-26 11:41-0000\n" -"PO-Revision-Date: 2013-10-26 11:41-0000\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: Spanish\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.5.7\n" - -#: backend/game.cpp:96 -msgid "Invalid game ID supplied." -msgstr "ID del juego suministra incorrecto." - -#: backend/game.cpp:147 -msgid "Game path could not be detected." -msgstr "Ruta del juego no se pudo encontrar." - -#: backend/game.cpp:248 backend/game.cpp:308 backend/game.cpp:363 -msgid "libloadorder failed to create a game handle. Details:" -msgstr "libloadorder no pudo crear un puñado del juego. Detalles:" - -#: backend/game.cpp:260 backend/game.cpp:320 backend/game.cpp:374 -msgid "libloadorder failed to initialise game master file support. Details:" -msgstr "libloadorder falló de iniciar apoyo del archivo master. Detalles:" - -#: backend/game.cpp:270 -msgid "libloadorder failed to get the active plugins list. Details:" -msgstr "libloadorer no pudo obtener la lista de plugins activos. Detalles:" - -#: backend/game.cpp:330 backend/game.cpp:396 -msgid "libloadorder failed to set the load order. Details:" -msgstr "libloadorder no podría establecer el orden de carga. Detalles:" - -#: backend/game.cpp:415 -msgid "Could not create BOSS folder for game. Details:" -msgstr "No se puede crear la carpeta datos de BOSS para este juego" - -#: backend/graph.cpp:46 -msgid "Cyclic interaction detected between plugins \"%1%\" and \"%2%\"." -msgstr "Interacción cíclica detectada entre plugins \"%1%\" y \"%2%\"." - -#: backend/helpers.cpp:140 -msgid "Unable to open \"%1%\" for CRC calculation." -msgstr "No se pudo abrir \"%1%\" para la cálculacion CDN." - -#: backend/helpers.cpp:302 -msgid "Could not create pipe for process." -msgstr "No se puede crear la tubería de proceso" - -#: backend/helpers.cpp:335 -msgid "Could not create process." -msgstr "No se puede crear el proceso." - -#: backend/helpers.cpp:346 -msgid "Could not get process exit code." -msgstr "No se puede obtener el código para detener el proceso." - -#: backend/helpers.cpp:353 -msgid "Could not read process output." -msgstr "No se puede leer la salida del proceso." - -#: backend/metadata.cpp:142 -msgid "Failed to parse condition \"%1%\": %2%" -msgstr "No se ha podido analizar la condición \"%1%\": %2%" - -#: backend/metadata.cpp:147 -msgid "Failed to parse condition \"%1%\"." -msgstr "No se ha podido analizar la condición \"%1%\"." - -#: backend/network.cpp:75 -msgid "Git operation failed. Error: %1%" -msgstr "Operación Git falló. Error: %1%" - -#: backend/network.cpp:338 -msgid "Masterlist revision" -msgstr "Revisión de la MasterList" - -#: gui/editor.cpp:37 -msgid "Note" -msgstr "Nota" - -#: gui/editor.cpp:38 -msgid "Warning" -msgstr "Advertencia" - -#: gui/editor.cpp:39 -msgid "Error" -msgstr "Error" - -#: gui/editor.cpp:43 -msgid "Add" -msgstr "Agregar" - -#: gui/editor.cpp:44 -msgid "Remove" -msgstr "Eliminar" - -#: gui/editor.cpp:48 -msgid "Type" -msgstr "Tipo" - -#: gui/editor.cpp:49 -msgid "Content" -msgstr "Contenido" - -#: gui/editor.cpp:50 gui/editor.cpp:155 gui/editor.cpp:159 gui/editor.cpp:163 -#: gui/editor.cpp:167 -msgid "Condition" -msgstr "Condición" - -#: gui/editor.cpp:51 gui/editor.cpp:990 -msgid "Language" -msgstr "Idioma" - -#: gui/editor.cpp:125 -msgid "Enable User Changes" -msgstr "Activar Cambios de usuario" - -#: gui/editor.cpp:127 gui/editor.cpp:375 -msgid "Add File" -msgstr "Agregar un Archivo" - -#: gui/editor.cpp:128 gui/editor.cpp:376 -msgid "Edit File" -msgstr "Editar un archivo" - -#: gui/editor.cpp:129 gui/editor.cpp:377 -msgid "Remove File" -msgstr "Eliminar archivo" - -#: gui/editor.cpp:130 -msgid "Save Changes" -msgstr "Guardar cambios" - -#: gui/editor.cpp:131 -msgid "Cancel" -msgstr "Cancelar" - -#: gui/editor.cpp:132 -msgid "Copy Metadata As Text" -msgstr "Copiar Metadatos como texto" - -#: gui/editor.cpp:143 -msgid "Requirements" -msgstr "Requisitos" - -#: gui/editor.cpp:144 -msgid "Incompatibilities" -msgstr "Incompatibilidades" - -#: gui/editor.cpp:145 -msgid "Load After" -msgstr "Después De" - -#: gui/editor.cpp:146 -msgid "Messages" -msgstr "Mensajes" - -#: gui/editor.cpp:147 -msgid "Bash Tags" -msgstr "Etiquetas de Bash" - -#: gui/editor.cpp:148 -msgid "Dirty Info" -msgstr "Informacion de ediciones sucias" - -#: gui/editor.cpp:151 -msgid "Plugins" -msgstr "Plugins" - -#: gui/editor.cpp:153 gui/editor.cpp:157 gui/editor.cpp:161 -msgid "Filename" -msgstr "Nombre del archivo" - -#: gui/editor.cpp:154 gui/editor.cpp:158 gui/editor.cpp:162 -msgid "Display Name" -msgstr "Nombre para Mostrar" - -#: gui/editor.cpp:165 -msgid "Add/Remove" -msgstr "Agregar o Quitar" - -#: gui/editor.cpp:166 -msgid "Bash Tag" -msgstr "Etiqueta de Bash" - -#: gui/editor.cpp:169 -msgid "CRC" -msgstr "CDN" - -#: gui/editor.cpp:170 -msgid "ITM Count" -msgstr "La enumeración de ITM" - -#: gui/editor.cpp:171 -msgid "UDR Count" -msgstr "La enumeración de UDR" - -#: gui/editor.cpp:172 -msgid "Deleted Navmesh Count" -msgstr "Enumeración Navmesh eliminado" - -#: gui/editor.cpp:173 -msgid "Cleaning Utility" -msgstr "Utilidad de limpieza" - -#: gui/editor.cpp:217 -msgid "Priority: " -msgstr "Prioridad: " - -#: gui/editor.cpp:379 -msgid "Add Plugin" -msgstr "Agregar un plugin" - -#: gui/editor.cpp:380 -msgid "Edit Plugin" -msgstr "Editar el plugin" - -#: gui/editor.cpp:381 -msgid "Remove Plugin" -msgstr "Eliminar plugin" - -#: gui/editor.cpp:383 -msgid "Add Message" -msgstr "Añadir un mensaje" - -#: gui/editor.cpp:384 -msgid "Edit Message" -msgstr "Editar mensaje" - -#: gui/editor.cpp:385 -msgid "Remove Message" -msgstr "Eliminar mensaje" - -#: gui/editor.cpp:387 -msgid "Add Bash Tag" -msgstr "Añadir una etiqueta Bash" - -#: gui/editor.cpp:388 -msgid "Edit Bash Tag" -msgstr "Editar una etiqueta Bash" - -#: gui/editor.cpp:389 -msgid "Remove Bash Tag" -msgstr "Eliminar una etiqueta Bash" - -#: gui/editor.cpp:391 -msgid "Add Dirty Info" -msgstr "Añadir informacion de ediciones sucias" - -#: gui/editor.cpp:392 -msgid "Edit Dirty Info" -msgstr "Editar informacion de ediciones sucias" - -#: gui/editor.cpp:393 -msgid "Remove Dirty Info" -msgstr "Eliminar informacion de ediciones sucias" - -#: gui/editor.cpp:411 -msgid "BOSS: Add File/Plugin" -msgstr "BOSS: Agregar Archivo / Plugin" - -#: gui/editor.cpp:433 -msgid "BOSS: Add Message" -msgstr "BOSS: Añadir un mensaje" - -#: gui/editor.cpp:443 -msgid "Error: No content specified. Row will not be added." -msgstr "Error: Ningun contenido especificado. La fila no se añadirá." - -#: gui/editor.cpp:444 gui/editor.cpp:526 gui/editor.cpp:1122 -#: gui/editor.cpp:1137 gui/main.cpp:164 gui/main.cpp:181 gui/main.cpp:194 -#: gui/main.cpp:273 gui/main.cpp:283 gui/main.cpp:296 gui/main.cpp:304 -#: gui/main.cpp:335 gui/main.cpp:352 gui/main.cpp:820 gui/main.cpp:873 -#: gui/main.cpp:893 gui/main.cpp:972 gui/main.cpp:1009 gui/main.cpp:1040 -#: gui/main.cpp:1060 gui/main.cpp:1075 gui/main.cpp:1182 gui/main.cpp:1227 -#: gui/settings.cpp:287 gui/settings.cpp:299 gui/settings.cpp:307 -#: gui/settings.cpp:350 gui/settings.cpp:358 gui/settings.cpp:366 -msgid "BOSS: Error" -msgstr "BOSS: Error de" - -#: gui/editor.cpp:454 -msgid "BOSS: Add Tag" -msgstr "BOSS: Añadir una etiqueta" - -#: gui/editor.cpp:468 -msgid "BOSS: Add Dirty Info" -msgstr "BOSS: Añadir informacion de ediciones sucias" - -#: gui/editor.cpp:487 -msgid "BOSS: Edit File/Plugin" -msgstr "BOSS: Editar Archivo o Plugin" - -#: gui/editor.cpp:511 -msgid "BOSS: Edit Message" -msgstr "BOSS: Editar mensaje" - -#: gui/editor.cpp:525 -msgid "Error: No content specified. Row will not be edited." -msgstr "Error: Ningun contenido especificado. La fila no se editará." - -#: gui/editor.cpp:535 -msgid "BOSS: Edit Tag" -msgstr "BOSS: Editar etiqueta Bash" - -#: gui/editor.cpp:557 -msgid "BOSS: Edit Dirty Info" -msgstr "BOSS: Editar informacion de ediciones sucias" - -#: gui/editor.cpp:932 -msgid "Filename (required):" -msgstr "Nombre de archivo (requerido):" - -#: gui/editor.cpp:935 -msgid "Displayed Name:" -msgstr "Nombre Mostrada:" - -#: gui/editor.cpp:938 gui/editor.cpp:1016 gui/editor.cpp:1172 -msgid "Condition:" -msgstr "Condición:" - -#: gui/editor.cpp:986 -msgid "Add Content" -msgstr "Añadir contenido:" - -#: gui/editor.cpp:987 -msgid "Edit Content" -msgstr "Editar contenido:" - -#: gui/editor.cpp:988 -msgid "Remove Content" -msgstr "Eliminar contenido:" - -#: gui/editor.cpp:991 -msgid "String" -msgstr "Cadena" - -#: gui/editor.cpp:1013 gui/settings.cpp:425 -msgid "Type:" -msgstr "Tipo:" - -#: gui/editor.cpp:1028 gui/settings.cpp:101 -msgid "Language:" -msgstr "Idioma:" - -#: gui/editor.cpp:1031 -msgid "Content:" -msgstr "Contenido:" - -#: gui/editor.cpp:1121 gui/editor.cpp:1136 -msgid "Error: No content row selected." -msgstr "Error: No fila de contenido seleccionado." - -#: gui/editor.cpp:1166 -msgid "Add/Remove:" -msgstr "Agregar o Quitar:" - -#: gui/editor.cpp:1169 gui/settings.cpp:422 -msgid "Name (required):" -msgstr "Nombre (requerido):" - -#: gui/editor.cpp:1234 -msgid "CRC (required):" -msgstr "CDN (requerido):" - -#: gui/editor.cpp:1237 -msgid "ITM Count:" -msgstr "La enumeración de ITM:" - -#: gui/editor.cpp:1240 -msgid "UDR Count:" -msgstr "La enumeración de UDR:" - -#: gui/editor.cpp:1243 -msgid "Deleted Navmesh Count:" -msgstr "Enumeración Navmesh eliminado:" - -#: gui/editor.cpp:1246 -msgid "Cleaning Utility (required):" -msgstr "Utilidad de limpieza (requerido):" - -#: gui/ids.cpp:31 -msgid "None Specified" -msgstr "Ninguno Especificado" - -#: gui/main.cpp:118 -msgid "Masterlist update failed. Details: %1%" -msgstr "Falló actualización del masterlist. Detalles: %1%" - -#: gui/main.cpp:134 -msgid "Masterlist parsing failed. Details: %1%" -msgstr "Falla en la lectura del archivo de reglas 'master'. Detalles: %1%" - -#: gui/main.cpp:142 -msgid "Unknown" -msgstr "Desconocido" - -#: gui/main.cpp:144 -msgid "No masterlist" -msgstr "No existe el archivo Masterlist" - -#: gui/main.cpp:163 -msgid "Error: BOSS is already running. This instance will now quit." -msgstr "" -"Error: La interfaz gráfica de usuario de BOSS ya se está ejecutando. Esta " -"instancia ahora se cerrará." - -#: gui/main.cpp:180 -msgid "Error: Could not create local app data BOSS folder." -msgstr "Error: No se puede crear una carpeta local para datos del aplicación BOSS." - -#: gui/main.cpp:193 -msgid "Error: Settings parsing failed. %1%" -msgstr "Error: Falla en la lectura del configuración. %1%" - -#: gui/main.cpp:272 -msgid "Error: Could not apply translation." -msgstr "Error: No se pudo aplicar la traducción." - -#: gui/main.cpp:282 -msgid "Error: The selected language is not available on this system." -msgstr "" - -#: gui/main.cpp:295 gui/main.cpp:351 gui/main.cpp:1039 -msgid "Error: Game-specific settings could not be initialised. %1%" -msgstr "" - -#: gui/main.cpp:303 -msgid "Error: Games' settings parsing failed. %1%" -msgstr "" - -#: gui/main.cpp:334 -msgid "Error: None of the supported games were detected." -msgstr "" - -#: gui/main.cpp:379 -msgid "Edit Metadata" -msgstr "" - -#: gui/main.cpp:380 -msgid "Sort Plugins" -msgstr "Ordenar Plugins" - -#: gui/main.cpp:381 -msgid "View Last Report" -msgstr "" - -#: gui/main.cpp:385 -msgid "&View Last Report" -msgstr "" - -#: gui/main.cpp:386 -msgid "View &Debug Log" -msgstr "" - -#: gui/main.cpp:387 -msgid "&Sort Plugins" -msgstr "&Ordenar Plugins" - -#: gui/main.cpp:388 -#, fuzzy -msgid "&Redate Plugins" -msgstr "&Ordenar Plugins" - -#: gui/main.cpp:391 -msgid "&File" -msgstr "&Archivo" - -#: gui/main.cpp:393 -msgid "&Metadata..." -msgstr "" - -#: gui/main.cpp:394 -msgid "&Settings..." -msgstr "&Configuración..." - -#: gui/main.cpp:395 -msgid "&Edit" -msgstr "&Editar" - -#: gui/main.cpp:407 -msgid "&Game" -msgstr "" - -#: gui/main.cpp:412 -msgid "&Help" -msgstr "&Ayuda" - -#: gui/main.cpp:496 gui/main.cpp:851 -msgid "BOSS: Working..." -msgstr "BOSS: Trabajando..." - -#: gui/main.cpp:496 gui/main.cpp:851 -msgid "BOSS working..." -msgstr "BOSS trabajando..." - -#: gui/main.cpp:547 -msgid "Userlist parsing failed. Details: %1%" -msgstr "" - -#: gui/main.cpp:584 -msgid "" -"A global message contains a condition that could not be evaluated. Details: " -"%1%" -msgstr "" - -#: gui/main.cpp:615 -msgid "\"%1%\" contains a condition that could not be evaluated. Details: %2%" -msgstr "" - -#: gui/main.cpp:627 -msgid "\"%1%\" is incompatible with \"%2%\" and is present." -msgstr "" - -#: gui/main.cpp:630 -msgid "\"%1%\" is required by \"%2%\" but is missing." -msgstr "" - -#: gui/main.cpp:670 -msgid "Failed to generate graph image. Details: %1%" -msgstr "" - -#: gui/main.cpp:687 -msgid "BOSS: Calculated Load Order" -msgstr "" - -#: gui/main.cpp:765 -msgid "Failed to set the load order. Details: %1%" -msgstr "" - -#: gui/main.cpp:769 -msgid "" -"The load order displayed in the Details tab was not applied as sorting was " -"canceled." -msgstr "" - -#: gui/main.cpp:778 -msgid "Failed to calculate the load order. Details: %1%" -msgstr "" - -#: gui/main.cpp:819 -msgid "Error: %1%" -msgstr "Error: %1%" - -#: gui/main.cpp:839 gui/main.cpp:954 -msgid "BOSS: Report Viewer" -msgstr "" - -#: gui/main.cpp:872 -msgid "Error: Masterlist parsing failed. %1%" -msgstr "" - -#: gui/main.cpp:892 -msgid "Error: Userlist parsing failed. %1%" -msgstr "" - -#: gui/main.cpp:939 -msgid "BOSS: Metadata Editor" -msgstr "" - -#: gui/main.cpp:961 -msgid "" -"This feature is provided so that modders using the Creation Kit may set the " -"load order it uses. A side-effect is that any subscribed Steam Workshop mods " -"will be re-downloaded by Steam. Do you wish to continue?" -msgstr "" - -#: gui/main.cpp:961 -#, fuzzy -msgid "BOSS: Warning" -msgstr "BOSS: Trabajando..." - -#: gui/main.cpp:971 -msgid "Error: Failed to get load order. %1%" -msgstr "" - -#: gui/main.cpp:1008 -msgid "Error: Failed to set plugin timestamps. %1%" -msgstr "" - -#: gui/main.cpp:1015 -msgid "Plugins were successfully redated." -msgstr "" - -#: gui/main.cpp:1016 -msgid "BOSS: Plugin Redate" -msgstr "" - -#: gui/main.cpp:1024 -msgid "BOSS: Settings" -msgstr "BOSS: Configuracion" - -#: gui/main.cpp:1059 gui/main.cpp:1074 -msgid "Error: \"%1%\" cannot be found." -msgstr "Error: \"%1%\" no se puede encontrar." - -#: gui/main.cpp:1086 -msgid "" -"A load order optimisation tool for games using the Elder Scrolls Plugin/" -"Master system." -msgstr "" - -#: gui/main.cpp:1110 -msgid "Up" -msgstr "" - -#: gui/main.cpp:1111 -msgid "Down" -msgstr "" - -#: gui/main.cpp:1114 -msgid "Load Order" -msgstr "" - -#: gui/main.cpp:1136 -msgid "" -"Please submit any alterations made for reasons other than user preference \n" -"to the BOSS team so that they may include the changes in the masterlist." -msgstr "" - -#: gui/main.cpp:1181 gui/main.cpp:1226 -msgid "Error: Cannot load \"%1%\" before \"%2%\"." -msgstr "Error: Ordenar %1% antes de %2%" - -#: gui/settings.cpp:40 -msgid "None" -msgstr "" - -#: gui/settings.cpp:41 -msgid "Low" -msgstr "" - -#: gui/settings.cpp:42 -msgid "Medium" -msgstr "" - -#: gui/settings.cpp:43 -msgid "High" -msgstr "" - -#: gui/settings.cpp:47 -msgid "Autodetect" -msgstr "Detección automática" - -#: gui/settings.cpp:59 -msgid "Add Game" -msgstr "" - -#: gui/settings.cpp:60 -msgid "Edit Game" -msgstr "" - -#: gui/settings.cpp:61 -msgid "Remove Game" -msgstr "" - -#: gui/settings.cpp:63 -msgid "Update masterlist before sorting." -msgstr "" - -#: gui/settings.cpp:64 -msgid "View reports externally in default browser." -msgstr "" - -#: gui/settings.cpp:65 -msgid "Generate and display plugin graph images." -msgstr "" - -#: gui/settings.cpp:68 -msgid "Name" -msgstr "" - -#: gui/settings.cpp:69 -msgid "Base Game Type" -msgstr "" - -#: gui/settings.cpp:70 -msgid "BOSS Folder Name" -msgstr "" - -#: gui/settings.cpp:71 -msgid "Master File" -msgstr "" - -#: gui/settings.cpp:72 -msgid "Online Masterlist URL" -msgstr "" - -#: gui/settings.cpp:73 -msgid "Install Path" -msgstr "" - -#: gui/settings.cpp:74 -msgid "Install Path Registry Key" -msgstr "" - -#: gui/settings.cpp:98 -msgid "Default Game:" -msgstr "Juego por defecto:" - -#: gui/settings.cpp:104 -msgid "Debug Verbosity:" -msgstr "Nivel de detalle de la salida de depuración:" - -#: gui/settings.cpp:126 -msgid "Language and game changes will be applied after BOSS is restarted." -msgstr "" - -#: gui/settings.cpp:139 -msgid "The output is logged to the BOSSDebugLog.txt file." -msgstr "La salida se registra en el archivo BOSSDebugLog.txt" - -#: gui/settings.cpp:279 -msgid "BOSS: Add Game" -msgstr "" - -#: gui/settings.cpp:286 gui/settings.cpp:365 -msgid "Error: A path and/or registry key is required. Row will not be added." -msgstr "" - -#: gui/settings.cpp:298 -msgid "Error: A game with this name is already defined. Row will not be added." -msgstr "" - -#: gui/settings.cpp:306 -msgid "" -"Error: A game with this folder name is already defined. Row will not be " -"added." -msgstr "" - -#: gui/settings.cpp:328 -msgid "BOSS: Edit Game" -msgstr "" - -#: gui/settings.cpp:349 -msgid "Error: Name is required. Row will not be added." -msgstr "" - -#: gui/settings.cpp:357 -msgid "Error: Folder is required. Row will not be added." -msgstr "" - -#: gui/settings.cpp:428 -msgid "BOSS Folder Name (required):" -msgstr "" - -#: gui/settings.cpp:431 -msgid "Master File:" -msgstr "" - -#: gui/settings.cpp:434 -msgid "Masterlist URL:" -msgstr "" - -#: gui/settings.cpp:437 -msgid "Install Path:" -msgstr "" - -#: gui/settings.cpp:440 -msgid "Install Path Registry Key:" -msgstr "" - -#: backend/generators.h:80 -msgid "Note:" -msgstr "Nota:" - -#: backend/generators.h:82 -msgid "Bash Tag Suggestion(s):" -msgstr "Bash Sugerencia de Tag(s):" - -#: backend/generators.h:84 -msgid "Warning:" -msgstr "Adverten:" - -#: backend/generators.h:86 -msgid "Error:" -msgstr "Errores:" - -#: backend/generators.h:159 -msgid "BOSS Report" -msgstr "" - -#: backend/generators.h:191 backend/generators.h:262 -msgid "Summary" -msgstr "Resumen" - -#: backend/generators.h:197 -msgid "Details" -msgstr "Detalles" - -#: backend/generators.h:204 -msgid "Graph" -msgstr "" - -#: backend/generators.h:211 -msgid "Filters" -msgstr "Filtros" - -#: backend/generators.h:275 -msgid "BOSS Version" -msgstr "BOSS Version" - -#: backend/generators.h:284 -msgid "Masterlist Version" -msgstr "" - -#: backend/generators.h:293 -msgid "Masterlist Updating" -msgstr "" - -#: backend/generators.h:297 -msgid "Enabled" -msgstr "" - -#: backend/generators.h:299 -msgid "Disabled" -msgstr "" - -#: backend/generators.h:306 -msgid "No change in details since last run." -msgstr "Ningún cambio desde la última ejecución." - -#: backend/generators.h:316 -msgid "General Messages" -msgstr "" - -#: backend/generators.h:326 -msgid "Total Number of Messages" -msgstr "" - -#: backend/generators.h:335 -msgid "Number of Warnings" -msgstr "" - -#: backend/generators.h:344 -msgid "Number of Errors" -msgstr "" - -#: backend/generators.h:385 -msgid "Version:" -msgstr "Version:" - -#: backend/generators.h:405 -msgid "Add:" -msgstr "" - -#: backend/generators.h:411 -msgid "Remove:" -msgstr "" - -#: backend/generators.h:419 -msgid "" -"Contains %1% ITM records, %2% UDR records and %3% deleted navmeshes. Clean " -"with %4%." -msgstr "" - -#: backend/generators.h:421 -msgid "Clean with %1%." -msgstr "" - -#: backend/generators.h:425 -msgid "Contains %1% UDR records and %2% deleted navmeshes. Clean with %3%." -msgstr "" - -#: backend/generators.h:427 -msgid "Contains %1% deleted navmeshes. Clean with %2%." -msgstr "" - -#: backend/generators.h:429 -msgid "Contains %1% UDR records. Clean with %2%." -msgstr "" - -#: backend/generators.h:432 -msgid "Contains %1% ITM records and %2% deleted navmeshes. Clean with %3%." -msgstr "" - -#: backend/generators.h:434 -msgid "Contains %1% ITM records. Clean with %2%." -msgstr "" - -#: backend/generators.h:437 -msgid "Contains %1% ITM records and %2% UDR records. Clean with %3%." -msgstr "" - -#: backend/generators.h:474 -msgid "The BOSS Report requires Javascript to be enabled in order to function." -msgstr "" -"El reportar de BOSS requiere que Javascript esté habilitado para funcionar." - -#: backend/generators.h:521 -msgid "Hide Version Numbers" -msgstr "Ocultar los números de versión" - -#: backend/generators.h:530 -msgid "Hide CRCs" -msgstr "" - -#: backend/generators.h:539 -msgid "Hide Bash Tag Suggestions" -msgstr "Ocultar Sugerencias Bash Tag(s)" - -#: backend/generators.h:547 -msgid "Hide Notes" -msgstr "Ocultar Notas" - -#: backend/generators.h:555 -msgid "Hide 'Do Not Clean' Messages" -msgstr "Ocultar mensajes 'No Se Limpia'" - -#: backend/generators.h:563 -msgid "Hide All Plugin Messages" -msgstr "Ocultar todos los mensajes de los Plugins" - -#: backend/generators.h:571 -msgid "Hide Messageless Plugins" -msgstr "Ocultar Plugins sin mensajes" - -#: backend/generators.h:581 -msgid "%1% of %2% plugins hidden." -msgstr "%1% de %2% los plugins ocultos." - -#: backend/generators.h:589 -msgid "%1% of %2% messages hidden." -msgstr "%1% de %2% los mensajes ocultos." - -#: backend/generators.h:631 -msgid "Could not write BOSS report." -msgstr "" - -#: backend/parsers.h:466 backend/parsers.h:549 -msgid "Invalid file path:" -msgstr "" - -#: backend/parsers.h:514 -msgid "Invalid folder path:" -msgstr "" - -#: backend/parsers.h:531 -msgid "Invalid regex string:" -msgstr "" - -#: backend/parsers.h:626 -msgid "Expected \"%1%\" at \"%2%\"." -msgstr "" diff --git a/resources/l10n/fi/LC_MESSAGES/loot.po b/resources/l10n/fi/LC_MESSAGES/loot.po deleted file mode 100644 index fa57087a..00000000 --- a/resources/l10n/fi/LC_MESSAGES/loot.po +++ /dev/null @@ -1,1086 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: BOSS v3.0.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-03-07 20:08-0000\n" -"PO-Revision-Date: 2014-06-05 19:32+0200\n" -"Last-Translator: \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.6.5\n" -"X-Poedit-KeywordsList: translate:1,1t;translate:1c,2,t\n" -"X-Poedit-Basepath: ../../src\n" -"X-Poedit-SourceCharset: UTF-8\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: fi\n" -"X-Poedit-SearchPath-0: backend\n" -"X-Poedit-SearchPath-1: gui\n" - -#: backend/game.cpp:99 -msgid "Invalid game ID supplied." -msgstr "Viallinen pelin ID." - -#: backend/game.cpp:159 -msgid "Game path could not be detected." -msgstr "Pelin asennusta ei löydetty." - -#: backend/game.cpp:262 backend/game.cpp:343 backend/game.cpp:419 -msgid "" -"libloadorder failed to create a game handle. Details could not be fetched." -msgstr "" -"libloadorder epäonnistui pelin käsittelyssä. Tietoja virheestä ei löydetty." - -#: backend/game.cpp:266 backend/game.cpp:347 backend/game.cpp:423 -msgid "libloadorder failed to create a game handle. Details:" -msgstr "libloadorder epäonnistui pelin käsittelyssä. Tiedot:" - -#: backend/game.cpp:281 backend/game.cpp:362 backend/game.cpp:437 -msgid "" -"libloadorder failed to initialise game master file support. Details could " -"not be fetched." -msgstr "" -"libloadorder epäonnistui pelin kantatiedoston lataamisessa. Tietoja " -"virheestä ei löydetty." - -#: backend/game.cpp:285 backend/game.cpp:366 backend/game.cpp:441 -msgid "libloadorder failed to initialise game master file support. Details:" -msgstr "libloadorder epäonnistui pelin kantatiedoston lataamisessa. Tiedot:" - -#: backend/game.cpp:298 -msgid "" -"libloadorder failed to get the active plugins list. Details could not be " -"fetched." -msgstr "" -"libloadorder epäonnistui käytössä olevan lisäosalistan hakemisessa. Tietoja " -"virheestä ei löydetty." - -#: backend/game.cpp:302 -msgid "libloadorder failed to get the active plugins list. Details:" -msgstr "" -"libloadorder epäonnistui käytössä olevan lisäosalistan hakemisessa. Tiedot:" - -#: backend/game.cpp:379 backend/game.cpp:466 -msgid "" -"libloadorder failed to set the load order. Details could not be fetched." -msgstr "" -"libloadorder ei voinut tallentaa uutta latausjärjestystä. Tietoja virheestä " -"ei löydetty." - -#: backend/game.cpp:383 -msgid "libloadorder failed to get the load order. Details:" -msgstr "libloadorder ei voinut lukea latausjärjestystä. Tiedot:" - -#: backend/game.cpp:470 -msgid "libloadorder failed to set the load order. Details:" -msgstr "libloadorder ei voinut tallentaa uutta latausjärjestystä. Tiedot:" - -#: backend/game.cpp:490 -msgid "Could not create LOOT folder for game. Details:" -msgstr "Pelin LOOT-kansion luominen epäonnistui. Tiedot:" - -#: backend/graph.cpp:47 -msgid "Cyclic interaction detected between plugins \"%1%\" and \"%2%\"." -msgstr "" -"Vuorovaikutussilmukka löytyi kahden lisäosan väliltä: \"%1%\" ja \"%2%\"." - -#: backend/helpers.cpp:141 -msgid "Unable to open \"%1%\" for CRC calculation." -msgstr "Lisäosan \"%1%\" avaaminen CRC:n laskemista varten epäonnistui." - -#: backend/helpers.cpp:262 -msgid "None Specified" -msgstr "Ei määritelty" - -#: backend/metadata.cpp:143 -msgid "Failed to parse condition \"%1%\": %2%" -msgstr "Ehdon \"%1%\" lukeminen epäonnistui: %2%" - -#: backend/metadata.cpp:148 -msgid "Failed to parse condition \"%1%\"." -msgstr "Ehdon \"%1%\" lukeminen epäonnistui." - -#: backend/metadata.cpp:330 -msgid "Cannot read \"%1%\". Details: %2%" -msgstr "\"%1%\" ei voitu lukea. Tiedot: %2%" - -#: backend/metadata.cpp:729 backend/metadata.cpp:740 -msgid "This plugin requires \"%1%\" to be installed, but it is missing." -msgstr "" -"Tämä lisäosa vaatii, että lisäosa \"%1%\" on asennettu, mutta se puuttuu." - -#: backend/metadata.cpp:733 -msgid "This plugin requires \"%1%\" to be active, but it is inactive." -msgstr "" -"Tämä lisäosa vaatii, että lisäosa \"%1%\" on käytössä, mutta se on poistettu " -"käytöstä." - -#: backend/metadata.cpp:746 -msgid "This plugin is incompatible with \"%1%\", but both are present." -msgstr "" -"Tämä lisäosa ei ole yhteensopiva lisäosan \"%1%\" kanssa, mutta molemmat " -"löydettiin." - -#: backend/network.cpp:82 -msgid "Git operation failed. Error: %1%" -msgstr "Git-toiminto epäonnistui. Virhe: %1%" - -#: backend/network.cpp:300 -msgid "Masterlist revision" -msgstr "Kantatiedoston versio" - -#: backend/network.cpp:300 -msgid "Rolled back to the previous revision." -msgstr "Palautettiin edelliseen versioon." - -#: gui/editor.cpp:159 gui/editor.cpp:326 gui/editor.cpp:464 -msgid "" -"Please submit any edits made for reasons other than personal preference to " -"the LOOT team so that they may be included in the masterlist." -msgstr "" -"Lähetäthän pelin toimivuuteen vaikuttavat muutokset LOOT-tiimille, jotta ne " -"voidaan sisällyttää kantatiedostoon." - -#: gui/editor.cpp:162 -msgid "Show only conflicting plugins" -msgstr "Näytä vain ristiriidassa olevat lisäosat" - -#: gui/editor.cpp:168 gui/editor.cpp:847 -msgid "Remove Plugin" -msgstr "Poista lisäosa" - -#: gui/editor.cpp:171 -msgid "Plugin" -msgstr "Lisäosa" - -#: gui/editor.cpp:172 -msgid "Priority" -msgstr "Tärkeys" - -#: gui/editor.cpp:174 gui/editor.cpp:518 gui/editor.cpp:522 gui/editor.cpp:526 -msgid "Filename" -msgstr "Tiedostonimi" - -#: gui/editor.cpp:175 gui/editor.cpp:519 gui/editor.cpp:523 gui/editor.cpp:527 -msgid "Display Name" -msgstr "Nimi" - -#: gui/editor.cpp:176 gui/editor.cpp:520 gui/editor.cpp:524 gui/editor.cpp:528 -#: gui/editor.cpp:532 gui/misc.cpp:37 -msgid "Condition" -msgstr "Tila" - -#: gui/editor.cpp:199 gui/editor.cpp:577 -msgid "Select a plugin to edit its load order metadata." -msgstr "Valitse lisäosa muokataksesi sen latausjärjestyksen metatietoja." - -#: gui/editor.cpp:200 -msgid "" -"Drag and drop a plugin here to make the selected plugin load after it. The " -"\"Show only conflicting plugins\" checkbox must be checked." -msgstr "" -"Vedä ja pudota lisäosa tähän, niin se ladataan ennen valittua lisäosaa. " -"\"Näytä vain ristiriidassa olevat lisäosat\" täytyy olla valittu." - -#: gui/editor.cpp:201 gui/editor.cpp:578 -msgid "" -"Plugins with higher priorities will load after plugins with smaller " -"priorities that they conflict with, unless one must explicitly load after " -"the other." -msgstr "" -"Lisäosat, joiden tärkeys on suurempi, ladataan muiden ristiriidassa olevien " -"lisäosien jälkeen, ellei jotakin lisäosaa ole pakko ladata toisen jälkeen." - -#: gui/editor.cpp:202 -msgid "" -"Filters the plugin list to only display plugins which can be loaded after " -"the currently selected plugin, and which either conflict with it, or, if it " -"loads a BSA, also load BSAs. Also enables drag and drop of plugins into the " -"Load After box." -msgstr "" -"Näyttää lisäosalistalla vain lisäosat, jotka voidaan ladata valitun lisäosan " -"jälkeen, ja jotka ovat ristiriidassa sen kanssa. Lisäosa näytetään myös, jos " -"se ja valittu lisäosa lataavat BSA-tiedoston. Sallii lisäosien vetämisen ja " -"pudottamisen \"Lataa näiden jälkeen\" -laatikkoon." - -#: gui/editor.cpp:203 -msgid "" -"Only newly-added plugins may be removed here. Use the metadata editor to " -"remove other user-added plugins." -msgstr "" -"Vain nyt lisätyt lisäosat voidaan poistaa tästä. Muut lisäosat tulee poistaa " -"muokkaamalla metatietoja." - -#: gui/editor.cpp:211 gui/editor.cpp:596 -msgid "Priority: " -msgstr "Tärkeys:" - -#: gui/editor.cpp:215 gui/editor.cpp:510 -msgid "Load After" -msgstr "Lataa näiden jälkeen" - -#: gui/editor.cpp:489 -msgid "Enable User Changes" -msgstr "Ota omat muokkaukset käyttöön" - -#: gui/editor.cpp:491 gui/editor.cpp:841 -msgid "Add File" -msgstr "Lisää tiedosto" - -#: gui/editor.cpp:492 gui/editor.cpp:842 -msgid "Edit File" -msgstr "Muokkaa tiedostoa" - -#: gui/editor.cpp:493 gui/editor.cpp:843 -msgid "Remove File" -msgstr "Poista tiedosto" - -#: gui/editor.cpp:494 -msgid "Save Changes" -msgstr "Tallenna muutokset" - -#: gui/editor.cpp:495 -msgid "Cancel" -msgstr "Peruuta" - -#: gui/editor.cpp:508 -msgid "Requirements" -msgstr "Vaatimukset" - -#: gui/editor.cpp:509 -msgid "Incompatibilities" -msgstr "Yhteensopivuus" - -#: gui/editor.cpp:511 -msgid "Messages" -msgstr "Viestit" - -#: gui/editor.cpp:512 -msgid "Bash Tags" -msgstr "Bash-tagit" - -#: gui/editor.cpp:513 -msgid "Dirty Info" -msgstr "Likainen tieto" - -#: gui/editor.cpp:516 -msgid "Plugins" -msgstr "Lisäosat" - -#: gui/editor.cpp:530 -msgid "Add/Remove" -msgstr "Lisää/Poista" - -#: gui/editor.cpp:531 -msgid "Bash Tag" -msgstr "Bash-tagi" - -#: gui/editor.cpp:534 -msgid "CRC" -msgstr "CRC" - -#: gui/editor.cpp:535 -msgid "ITM Count" -msgstr "ITM-lukumäärä" - -#: gui/editor.cpp:536 -msgid "UDR Count" -msgstr "UDR-lukumäärä" - -#: gui/editor.cpp:537 -msgid "Deleted Navmesh Count" -msgstr "Poistettujen Navmeshien lukumäärä" - -#: gui/editor.cpp:538 -msgid "Cleaning Utility" -msgstr "Puhdistustyökalu" - -#: gui/editor.cpp:541 -msgid "Copy Name" -msgstr "Kopioi nimi" - -#: gui/editor.cpp:542 -msgid "Copy Metadata As Text" -msgstr "Kopioi metatiedot tekstinä" - -#: gui/editor.cpp:543 -msgid "Remove All User-Added Metadata" -msgstr "Poista kaikki lisäämäni metatiedot" - -#: gui/editor.cpp:579 -msgid "If unchecked, any user-added metadata will be ignored during sorting." -msgstr "Itse lisätyt metatiedot ohitetaan, jos tämä ei ole valittu." - -#: gui/editor.cpp:580 gui/editor.cpp:581 -msgid "Only user-added data may be removed." -msgstr "Vain itse lisätyt metatiedot voidaan poistaa." - -#: gui/editor.cpp:813 -msgid "" -"Are you sure you want to clear all existing user-added metadata from this " -"plugin?" -msgstr "" -"Oletko varma, että haluat poistaa kaikki lisäämäsi metatiedot tästä " -"lisäosasta." - -#: gui/editor.cpp:814 gui/main.cpp:1074 -msgid "LOOT: Warning" -msgstr "LOOT: Varoitus" - -#: gui/editor.cpp:845 -msgid "Add Plugin" -msgstr "Lisää lisäosa" - -#: gui/editor.cpp:846 -msgid "Edit Plugin" -msgstr "Muokkaa lisäosaa" - -#: gui/editor.cpp:849 -msgid "Add Message" -msgstr "Lisää viesti" - -#: gui/editor.cpp:850 -msgid "Edit Message" -msgstr "Muokkaa viestiä" - -#: gui/editor.cpp:851 -msgid "Remove Message" -msgstr "Poista viesti" - -#: gui/editor.cpp:853 -msgid "Add Bash Tag" -msgstr "Lisää Bash-tagi" - -#: gui/editor.cpp:854 -msgid "Edit Bash Tag" -msgstr "Muokkaa Bash-tagia" - -#: gui/editor.cpp:855 -msgid "Remove Bash Tag" -msgstr "Poista Bash-tagi" - -#: gui/editor.cpp:857 -msgid "Add Dirty Info" -msgstr "Lisää likainen tieto" - -#: gui/editor.cpp:858 -msgid "Edit Dirty Info" -msgstr "Muokkaa likaista tietoa" - -#: gui/editor.cpp:859 -msgid "Remove Dirty Info" -msgstr "Poista likainen tieto" - -#: gui/editor.cpp:877 -msgid "LOOT: Add File/Plugin" -msgstr "LOOT: Lisää tiedosto/lisäosa" - -#: gui/editor.cpp:899 -msgid "LOOT: Add Message" -msgstr "LOOT: Lisää viesti" - -#: gui/editor.cpp:909 -msgid "Error: No content specified. Row will not be added." -msgstr "Virhe: ei sisältöä valittuna. Riviä ei lisätä." - -#: gui/editor.cpp:910 gui/editor.cpp:992 gui/main.cpp:180 gui/main.cpp:197 -#: gui/main.cpp:212 gui/main.cpp:295 gui/main.cpp:305 gui/main.cpp:318 -#: gui/main.cpp:326 gui/main.cpp:357 gui/main.cpp:374 gui/main.cpp:544 -#: gui/main.cpp:565 gui/main.cpp:581 gui/main.cpp:946 gui/main.cpp:998 -#: gui/main.cpp:1020 gui/main.cpp:1085 gui/main.cpp:1122 gui/misc.cpp:313 -#: gui/misc.cpp:328 gui/settings.cpp:288 gui/settings.cpp:300 -#: gui/settings.cpp:308 gui/settings.cpp:352 gui/settings.cpp:360 -#: gui/settings.cpp:368 -msgid "LOOT: Error" -msgstr "LOOT: Virhe" - -#: gui/editor.cpp:920 -msgid "LOOT: Add Tag" -msgstr "LOOT: Lisää tagi" - -#: gui/editor.cpp:934 -msgid "LOOT: Add Dirty Info" -msgstr "LOOT: Lisää likainen tieto" - -#: gui/editor.cpp:953 -msgid "LOOT: Edit File/Plugin" -msgstr "LOOT: Muokkaa tiedostoa/lisäosaa" - -#: gui/editor.cpp:977 -msgid "LOOT: Edit Message" -msgstr "LOOT: Muokkaa viestiä" - -#: gui/editor.cpp:991 -msgid "Error: No content specified. Row will not be edited." -msgstr "Virhe: ei sisältöä valittuna. Riviä ei muokata." - -#: gui/editor.cpp:1001 -msgid "LOOT: Edit Tag" -msgstr "LOOT: Muokkaa tagia" - -#: gui/editor.cpp:1023 -msgid "LOOT: Edit Dirty Info" -msgstr "LOOT: Muokkaa likaista tietoa" - -#: gui/main.cpp:120 -msgid "Masterlist update failed. Details: %1%" -msgstr "Kantatiedoston päivitys epäonnistui. Tiedot: %1%" - -#: gui/main.cpp:132 -msgid "Masterlist revision check failed. Details: %1%" -msgstr "Kantatiedoston version tarkistus epäonnistui. Tiedot: %1%" - -#: gui/main.cpp:150 -msgid "Masterlist parsing failed. Details: %1%" -msgstr "Kantatiedoston lukeminen epäonnistui. Tiedot: %1%" - -#: gui/main.cpp:158 -msgid "Unknown" -msgstr "Tuntematon" - -#: gui/main.cpp:160 -msgid "No masterlist" -msgstr "Ei kantatiedostoa" - -#: gui/main.cpp:179 -msgid "Error: LOOT is already running. This instance will now quit." -msgstr "Virhe: LOOT on jo käynnissä. Tämä prosessi lopetetaan." - -#: gui/main.cpp:196 -msgid "Error: Could not create local app data LOOT folder." -msgstr "Virhe: LOOT ei voinut luoda " - -#: gui/main.cpp:211 -msgid "Error: Settings parsing failed. %1%" -msgstr "Virhe: asetusten lukeminen epäonnistui. %1%" - -#: gui/main.cpp:294 -msgid "Error: Could not apply translation." -msgstr "Virhe: käännöstä ei voitu käyttää." - -#: gui/main.cpp:304 -msgid "Error: The selected language is not available on this system." -msgstr "Virhe: valittu kieli ei ole saatavilla tässä asennuksessa." - -#: gui/main.cpp:317 gui/main.cpp:373 gui/main.cpp:543 -msgid "Error: Game-specific settings could not be initialised. %1%" -msgstr "Virhe: pelikohtaisia asetuksia ei voitu ladata. %1%" - -#: gui/main.cpp:325 -msgid "Error: Games' settings parsing failed. %1%" -msgstr "Virhe: pelin asetusten lukeminen epäonnistui. %1%" - -#: gui/main.cpp:356 -msgid "Error: None of the supported games were detected." -msgstr "Virhe: yhtään tuettua peliä ei löytynyt." - -#: gui/main.cpp:401 -msgid "Edit Metadata" -msgstr "Muokkaa metatietoja" - -#: gui/main.cpp:402 -msgid "Sort Plugins" -msgstr "Järjestä lisäosat" - -#: gui/main.cpp:403 -msgid "View Last Report" -msgstr "Näytä viimeisin raportti" - -#: gui/main.cpp:407 -msgid "&View Last Report" -msgstr "Näytä &viimeisin raportti" - -#: gui/main.cpp:408 -msgid "View &Debug Log" -msgstr "Näytä lokitie&dosto" - -#: gui/main.cpp:409 -msgid "&Sort Plugins" -msgstr "Järje&stä lisäosat" - -#: gui/main.cpp:410 -msgid "&Redate Plugins" -msgstr "Jä&rjestä lisäosien päiväykset" - -#: gui/main.cpp:413 -msgid "&File" -msgstr "&Tiedosto" - -#: gui/main.cpp:415 -msgid "&Metadata..." -msgstr "&Metatiedot..." - -#: gui/main.cpp:416 -msgid "&Settings..." -msgstr "&Asetukset..." - -#: gui/main.cpp:417 -msgid "&Edit" -msgstr "&Muokkaa" - -#: gui/main.cpp:429 -msgid "&Game" -msgstr "&Peli" - -#: gui/main.cpp:434 -msgid "&Help" -msgstr "&Apua" - -#: gui/main.cpp:458 -msgid "" -"Opens the Metadata Editor, where plugins' sorting metadata, messages, dirty " -"info and Bash Tag suggestions can be edited." -msgstr "" -"Avaa metatietojen muokkausohjelman, jossa voit muokata lisäosien " -"järjestyksen metatietoja, viestejä, likaisia tietoja ja Bash-tagiehdotuksia." - -#: gui/main.cpp:459 -msgid "Sorts your plugins, then displays a report of the results." -msgstr "Järjestää lisäosasi ja näyttää raportin tuloksista." - -#: gui/main.cpp:460 -msgid "Opens the last report generated for the current game." -msgstr "Avaa viimeisimmän raportin kyseiselle pelille." - -#: gui/main.cpp:519 gui/main.cpp:962 -msgid "LOOT: Report Viewer" -msgstr "LOOT: Raporttilukija" - -#: gui/main.cpp:527 -msgid "LOOT: Settings" -msgstr "LOOT: Asetukset" - -#: gui/main.cpp:564 gui/main.cpp:580 -msgid "Error: \"%1%\" cannot be found." -msgstr "Error: \"%1%\" ei löytynyt." - -#: gui/main.cpp:592 -msgid "" -"Load order optimisation for Oblivion, Skyrim, Fallout 3 and Fallout: New " -"Vegas." -msgstr "" -"Latausjärjestyksen optimointi Oblivioniin, Skyrimiin, Fallout 3:seen ja " -"Fallout: New Vegasiin." - -#: gui/main.cpp:623 gui/main.cpp:827 gui/main.cpp:974 -msgid "LOOT: Working..." -msgstr "LOOT: Työstetään..." - -#: gui/main.cpp:623 gui/main.cpp:974 -msgid "LOOT working..." -msgstr "LOOT työskentelee..." - -#: gui/main.cpp:680 -msgid "Userlist parsing failed. Details: %1%" -msgstr "Käyttäjälistan lukeminen epäonnistui. Tiedot: %1%" - -#: gui/main.cpp:721 -msgid "" -"A global message contains a condition that could not be evaluated. Details: " -"%1%" -msgstr "Yleinen viesti sisältää ehdon, jota ei voida lukea. Tiedot: %1%" - -#: gui/main.cpp:754 -msgid "\"%1%\" contains a condition that could not be evaluated. Details: %2%" -msgstr "\"%1%\" sisältää ehdon, jota ei voida lukea. Tiedot: %2%" - -#: gui/main.cpp:767 -msgid "Building plugin graph..." -msgstr "Rakennetaan lisäosakaaviota..." - -#: gui/main.cpp:812 -msgid "LOOT: Calculated Load Order" -msgstr "LOOT: Laskettu latausjärjestys" - -#: gui/main.cpp:827 -msgid "Recalculating load order..." -msgstr "Lasketaan latausjärjestystä uudelleen..." - -#: gui/main.cpp:884 -msgid "Failed to set the load order. Details: %1%" -msgstr "Latausjärjestyksen tallennus epäonnistui. Tiedot: %1%" - -#: gui/main.cpp:894 -msgid "" -"The load order displayed in the Details tab was not applied as sorting was " -"canceled." -msgstr "Latausjärjestystä ei tallennettu, koska järjestäminen peruutettiin." - -#: gui/main.cpp:899 -msgid "Failed to calculate the load order. Details: %1%" -msgstr "Latausjärjestyksen laskeminen epäonnistui. Tiedot: %1%" - -#: gui/main.cpp:945 -msgid "Error: %1%" -msgstr "Virhe: %1%" - -#: gui/main.cpp:997 -msgid "Error: Masterlist parsing failed. %1%" -msgstr "Virhe: kantatiedoston lukeminen epäonnistui. %1%" - -#: gui/main.cpp:1019 -msgid "Error: Userlist parsing failed. %1%" -msgstr "Virhe: käyttäjälistan lukeminen epäonnistui. %1%" - -#: gui/main.cpp:1065 -msgid "LOOT: Metadata Editor" -msgstr "LOOT: Metatietojen muokkaus" - -#: gui/main.cpp:1074 -msgid "" -"This feature is provided so that modders using the Creation Kit may set the " -"load order it uses. A side-effect is that any subscribed Steam Workshop mods " -"will be re-downloaded by Steam. Do you wish to continue?" -msgstr "" -"Tämä toiminto sallii lisäosien luojien käyttää kyseistä latausjärjestystä " -"Creation Kitissä. Sivuvaikutuksena Steam Workshopista ladatut lisäosat " -"ladataan uudelleen, kun seuraavan kerran käynnistät Skyrimin. Jatketaanko?" - -#: gui/main.cpp:1084 -msgid "Error: Failed to get load order. %1%" -msgstr "Virhe: latausjärjestyksen hakeminen epäonnistui. %1%" - -#: gui/main.cpp:1121 -msgid "Error: Failed to set plugin timestamps. %1%" -msgstr "Virhe: lisäosan päiväyksen asettaminen epäonnistui. %1%" - -#: gui/main.cpp:1128 -msgid "Plugins were successfully redated." -msgstr "Lisäosat päivättiin uudelleen onnistuneesti." - -#: gui/main.cpp:1129 -msgid "LOOT: Plugin Redate" -msgstr "LOOT: Lisäosien päiväyksien muuttaminen" - -#: gui/misc.cpp:35 -msgid "Type" -msgstr "Tyyppi" - -#: gui/misc.cpp:36 -msgid "Content" -msgstr "Sisältö" - -#: gui/misc.cpp:38 gui/misc.cpp:181 -msgid "Language" -msgstr "Kieli" - -#: gui/misc.cpp:117 -msgid "Filename (required):" -msgstr "Tiedostonimi (vaaditaan):" - -#: gui/misc.cpp:120 -msgid "Displayed Name:" -msgstr "Nimi:" - -#: gui/misc.cpp:123 gui/misc.cpp:207 gui/misc.cpp:363 -msgid "Condition:" -msgstr "Ehto:" - -#: gui/misc.cpp:177 -msgid "Add Content" -msgstr "Lisää sisältöä" - -#: gui/misc.cpp:178 -msgid "Edit Content" -msgstr "Muokkaa sisältöä" - -#: gui/misc.cpp:179 -msgid "Remove Content" -msgstr "Poista sisältöä" - -#: gui/misc.cpp:182 -msgid "String" -msgstr "Merkkijono" - -#: gui/misc.cpp:204 gui/settings.cpp:429 -msgid "Type:" -msgstr "Tyyppi:" - -#: gui/misc.cpp:219 gui/settings.cpp:109 -msgid "Language:" -msgstr "Kieli:" - -#: gui/misc.cpp:222 -msgid "Content:" -msgstr "Sisältö:" - -#: gui/misc.cpp:312 gui/misc.cpp:327 -msgid "Error: No content row selected." -msgstr "Virhe: yhtään sisältöriviä ei valittu." - -#: gui/misc.cpp:357 -msgid "Add/Remove:" -msgstr "Lisää/poista:" - -#: gui/misc.cpp:360 gui/settings.cpp:426 -msgid "Name (required):" -msgstr "Nimi (vaaditaan):" - -#: gui/misc.cpp:425 -msgid "CRC (required):" -msgstr "CRC (vaaditaan):" - -#: gui/misc.cpp:428 -msgid "ITM Count:" -msgstr "ITM-lukumäärä:" - -#: gui/misc.cpp:431 -msgid "UDR Count:" -msgstr "UDR-lukumäärä:" - -#: gui/misc.cpp:434 -msgid "Deleted Navmesh Count:" -msgstr "Poistettujen Navmeshien lukumäärä:" - -#: gui/misc.cpp:437 -msgid "Cleaning Utility (required):" -msgstr "Puhdistustyökalu (vaaditaan):" - -#: gui/settings.cpp:42 -msgid "None" -msgstr "Ei mitään" - -#: gui/settings.cpp:43 -msgid "Low" -msgstr "Vähän" - -#: gui/settings.cpp:44 -msgid "Medium" -msgstr "Keskiverto" - -#: gui/settings.cpp:45 -msgid "High" -msgstr "Paljon" - -#: gui/settings.cpp:49 -msgid "Autodetect" -msgstr "Tunnista automaattisesti" - -#: gui/settings.cpp:67 -msgid "Add Game" -msgstr "Lisää peli" - -#: gui/settings.cpp:68 -msgid "Edit Game" -msgstr "Muokkaa peliä" - -#: gui/settings.cpp:69 -msgid "Remove Game" -msgstr "Poista peli" - -#: gui/settings.cpp:71 -msgid "Update masterlist before sorting." -msgstr "Päivitä kantatiedosto ennen järjestämistä" - -#: gui/settings.cpp:72 -msgid "View reports externally in default browser." -msgstr "Näytä raportit verkkoselaimessa." - -#: gui/settings.cpp:75 -msgid "Name" -msgstr "Nimi" - -#: gui/settings.cpp:76 -msgid "Base Game Type" -msgstr "Pelin tyyppi" - -#: gui/settings.cpp:77 -msgid "LOOT Folder Name" -msgstr "LOOT-kansion nimi" - -#: gui/settings.cpp:78 -msgid "Master File" -msgstr "Kantatiedosto" - -#: gui/settings.cpp:79 -msgid "Masterlist Repository URL" -msgstr "Kantatiedoston säilön URL" - -#: gui/settings.cpp:80 -msgid "Masterlist Repository Branch" -msgstr "Kantatiedoston säilön haara" - -#: gui/settings.cpp:81 -msgid "Install Path" -msgstr "Asennuspolku" - -#: gui/settings.cpp:82 -msgid "Install Path Registry Key" -msgstr "Asennuspolun rekisteriavain" - -#: gui/settings.cpp:106 -msgid "Default Game:" -msgstr "Oletuspeli:" - -#: gui/settings.cpp:112 -msgid "Debug Verbosity:" -msgstr "Virhelokiin kirjattavat tiedot:" - -#: gui/settings.cpp:131 -msgid "Language and game changes will be applied after LOOT is restarted." -msgstr "" -"Kieli- ja peliasetusten muutokset tulevat voimaan LOOTin seuraavan " -"käynnistyksen yhteydessä." - -#: gui/settings.cpp:144 -msgid "The output is logged to the LOOTDebugLog.txt file." -msgstr "Tiedot kirjataan LOOTDebugLog.txt-tiedostoon." - -#: gui/settings.cpp:280 -msgid "LOOT: Add Game" -msgstr "LOOT: Lisää peli" - -#: gui/settings.cpp:287 gui/settings.cpp:367 -msgid "Error: A path and/or registry key is required. Row will not be added." -msgstr "Virhe: polku ja/tai rekisteriavain vaaditaan. Riviä ei listätä." - -#: gui/settings.cpp:299 -msgid "Error: A game with this name is already defined. Row will not be added." -msgstr "Virhe: tämänniminen peli on jo määritelty. Riviä ei lisätä." - -#: gui/settings.cpp:307 -msgid "" -"Error: A game with this folder name is already defined. Row will not be " -"added." -msgstr "Virhe: tässä kansiossa oleva peli on jo määritelty. Riviä ei lisätä." - -#: gui/settings.cpp:330 -msgid "LOOT: Edit Game" -msgstr "LOOT: Muokkaa peliä" - -#: gui/settings.cpp:351 -msgid "Error: Name is required. Row will not be added." -msgstr "Virhe: nimi vaaditaan. Riviä ei lisätä." - -#: gui/settings.cpp:359 -msgid "Error: Folder is required. Row will not be added." -msgstr "Virhe: kansio vaaditaan. Riviä ei lisätä." - -#: gui/settings.cpp:432 -msgid "LOOT Folder Name (required):" -msgstr "LOOT-kansion nimi (vaaditaan):" - -#: gui/settings.cpp:435 -msgid "Master File:" -msgstr "Kantatiedosto:" - -#: gui/settings.cpp:438 -msgid "Masterlist Repository URL:" -msgstr "Kantatiedoston säilön URL:" - -#: gui/settings.cpp:441 -msgid "Masterlist Repository Branch:" -msgstr "Kantatiedoston säilön haara:" - -#: gui/settings.cpp:444 -msgid "Install Path:" -msgstr "Asennuspolku:" - -#: gui/settings.cpp:447 -msgid "Install Path Registry Key:" -msgstr "Asennuspolun rekisteriavain:" - -#: backend/generators.h:57 -msgid "Note:" -msgstr "Huom:" - -#: backend/generators.h:59 -msgid "Bash Tag Suggestion(s):" -msgstr "Bash-tagiehdotukset:" - -#: backend/generators.h:61 -msgid "Warning:" -msgstr "Varoitus:" - -#: backend/generators.h:63 -msgid "Error:" -msgstr "Virhe:" - -#: backend/generators.h:128 -msgid "LOOT Report" -msgstr "LOOT raportti" - -#: backend/generators.h:154 backend/generators.h:217 -msgid "Summary" -msgstr "Yhteenveto" - -#: backend/generators.h:160 -msgid "Details" -msgstr "Tiedot" - -#: backend/generators.h:166 -msgid "Filters" -msgstr "Suodattimet" - -#: backend/generators.h:230 -msgid "LOOT Version" -msgstr "LOOT-versio" - -#: backend/generators.h:239 -msgid "Masterlist Version" -msgstr "Kantatiedoston versio" - -#: backend/generators.h:248 -msgid "Masterlist Updating" -msgstr "Kantatiedoston päivitys" - -#: backend/generators.h:252 -msgid "Enabled" -msgstr "Päällä" - -#: backend/generators.h:254 -msgid "Disabled" -msgstr "Pois päältä" - -#: backend/generators.h:263 -msgid "" -"There have been no changes in the Details tab since LOOT was last run for " -"this game." -msgstr "" -"Tiedot eivät ole muuttuneet LOOTin viimekertaisen tarkistuksen jälkeen." - -#: backend/generators.h:273 -msgid "General Messages" -msgstr "Yleiset viestit" - -#: backend/generators.h:283 -msgid "Total Number of Messages" -msgstr "Viestien lukumäärä" - -#: backend/generators.h:292 -msgid "Number of Warnings" -msgstr "Varoitusten lukumäärä" - -#: backend/generators.h:301 -msgid "Number of Errors" -msgstr "Virheiden lukumäärä" - -#: backend/generators.h:342 -msgid "Version:" -msgstr "Versio:" - -#: backend/generators.h:362 -msgid "Add:" -msgstr "Lisää:" - -#: backend/generators.h:368 -msgid "Remove:" -msgstr "Poista:" - -#: backend/generators.h:376 -msgid "" -"Contains %1% ITM records, %2% UDR records and %3% deleted navmeshes. Clean " -"with %4%." -msgstr "" -"Sisältää %1% ITM-kirjausta, %2% UDR-kirjausta ja %3% poistettua navmeshiä. " -"Puhdista työkalulla %4%." - -#: backend/generators.h:378 -msgid "Clean with %1%." -msgstr "Puhdista työkalulla %1%." - -#: backend/generators.h:382 -msgid "Contains %1% UDR records and %2% deleted navmeshes. Clean with %3%." -msgstr "" -"Sisältää %1% UDR-kirjausta ja %2% poistettua navmeshiä. Puhdista työkalulla " -"%3%." - -#: backend/generators.h:384 -msgid "Contains %1% deleted navmeshes. Clean with %2%." -msgstr "Sisältää %1% poistettua navmeshiä. Puhdista työkalulla %2%." - -#: backend/generators.h:386 -msgid "Contains %1% UDR records. Clean with %2%." -msgstr "Sisältää %1% UDR-kirjausta. Puhdista työkalulla %2%" - -#: backend/generators.h:389 -msgid "Contains %1% ITM records and %2% deleted navmeshes. Clean with %3%." -msgstr "" -"Sisältää %1% ITM-kirjausta ja %2% poistettua navmeshiä. Puhdista työkalulla " -"%3%." - -#: backend/generators.h:391 -msgid "Contains %1% ITM records. Clean with %2%." -msgstr "Sisältää %1% ITM-kirjausta. Puhdista työkalulla %2%." - -#: backend/generators.h:394 -msgid "Contains %1% ITM records and %2% UDR records. Clean with %3%." -msgstr "" -"Sisältää %1% ITM-kirjausta ja %2% UDR-kirjausta. Puhdista työkalulla %3%." - -#: backend/generators.h:430 -msgid "The LOOT Report requires Javascript to be enabled in order to function." -msgstr "LOOT-raportti vaatii Javascriptiä toimiakseen." - -#: backend/generators.h:457 -msgid "Hide Version Numbers" -msgstr "Piilota versionumerot" - -#: backend/generators.h:466 -msgid "Hide CRCs" -msgstr "Piilota CRC:t" - -#: backend/generators.h:475 -msgid "Hide Bash Tag Suggestions" -msgstr "Piilota Bash-tagiehdotukset" - -#: backend/generators.h:483 -msgid "Hide Notes" -msgstr "Piilota huomautukset" - -#: backend/generators.h:491 -msgid "Hide 'Do Not Clean' Messages" -msgstr "Piilota \"älä puhdista\"-viestit" - -#: backend/generators.h:499 -msgid "Hide All Plugin Messages" -msgstr "Piilota kaikki lisäosaviestit" - -#: backend/generators.h:507 -msgid "Hide Messageless Plugins" -msgstr "Piilota viestittömät lisäosat" - -#: backend/generators.h:517 -msgid "%1% of %2% plugins hidden." -msgstr "%1%/%2% lisäosaa piilotettiin" - -#: backend/generators.h:525 -msgid "%1% of %2% messages hidden." -msgstr "%1%/%2% viestiä piilotettiin." - -#: backend/parsers.h:470 backend/parsers.h:553 -msgid "Invalid file path:" -msgstr "Virheellinen tiedostosijainti:" - -#: backend/parsers.h:518 -msgid "Invalid folder path:" -msgstr "Virheellinen kansiopolku:" - -#: backend/parsers.h:535 -msgid "Invalid regex string:" -msgstr "Virheellinen säännöllinen lauseke:" - -#: backend/parsers.h:630 -msgid "Expected \"%1%\" at \"%2%\"." -msgstr "Odotettiin \"%1%\" osoitteessa \"%2%\"." - -#: gui/misc.h:36 -msgid "Note" -msgstr "Huomaa" - -#: gui/misc.h:37 -msgid "Warning" -msgstr "Varoitus" - -#: gui/misc.h:38 -msgid "Error" -msgstr "Virhe" - -#: gui/misc.h:42 -msgid "Add" -msgstr "Lisää" - -#: gui/misc.h:43 -msgid "Remove" -msgstr "Poista" diff --git a/resources/l10n/fr/LC_MESSAGES/loot.po b/resources/l10n/fr/LC_MESSAGES/loot.po deleted file mode 100644 index 5d9543a3..00000000 --- a/resources/l10n/fr/LC_MESSAGES/loot.po +++ /dev/null @@ -1,1126 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: LOOT v0.9\n" -"Report-Msgid-Bugs-To: https://github.com/loot/loot/issues\n" -"POT-Creation-Date: 2016-07-31 14:31+0200\n" -"PO-Revision-Date: 2016-07-31 15:02+0200\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.8\n" -"X-Poedit-SourceCharset: UTF-8\n" - -#: src/gui/html/js/events.js:16 -msgid "Identifying conflicting plugins..." -msgstr "Identification des plugins en conflit..." - -#: src/gui/html/js/events.js:96 -msgid "No masterlist update was necessary." -msgstr "La mise à jour de la masterlist n'est pas nécessaire." - -#: src/gui/html/js/events.js:146 -msgid "Sorting made no changes to the load order." -msgstr "Aucune modification de l'ordre de chargement n'est nécessaire." - -#: src/gui/html/js/events.js:178 -msgid "Redate Plugins?" -msgstr "Redater les plugins ?" - -#: src/gui/html/js/events.js:178 -msgid "" -"This feature is provided so that modders using the Creation Kit may set the " -"load order it uses. A side-effect is that any subscribed Steam Workshop mods " -"will be re-downloaded by Steam. Do you wish to continue?" -msgstr "" -"Cette fonction est prévue pour que les moddeurs qui utilisent le Creation " -"Kit puissent définir l'ordre de chargement qu'ils utilisent. L'effet " -"secondaire est que les mods choisis sur le Steam Workshop seront " -"retéléchargés par Steam. Voulez-vous continuer ? " - -#: src/gui/html/js/events.js:178 -msgid "Redate" -msgstr "Redater" - -#: src/gui/html/js/events.js:187 -msgid "" -"Are you sure you want to clear all existing user-added metadata from all " -"plugins?" -msgstr "" -"Êtes-vous sûr de vouloir effacer toutes les métadonnées utilisateur " -"existantes dans tous les plugins ?" - -#: src/gui/html/js/events.js:187 src/gui/html/js/events.js:395 -msgid "Clear" -msgstr "Confirmer" - -#: src/gui/html/js/events.js:198 -msgid "All user-added metadata has been cleared." -msgstr "Toutes les métadonnées utilisateur ont été supprimées." - -#: src/gui/html/js/events.js:221 -msgid "LOOT's content has been copied to the clipboard." -msgstr "Le contenu de LOOT a été copié dans le presse-papiers." - -#: src/gui/html/js/events.js:232 -msgid "The load order has been copied to the clipboard." -msgstr "L'ordre de chargement a été copié dans le presse-papiers." - -#: src/gui/html/js/events.js:263 src/gui/html/js/translateStaticText.js:182 -msgid "Quit" -msgstr "Quitter" - -#: src/gui/html/js/events.js:275 -msgid "sorted load order" -msgstr "ordre de chargement trié" - -#: src/gui/html/js/events.js:277 -msgid "metadata edits" -msgstr "modifications de métadonnées" - -#: src/gui/html/js/filters.js:28 -msgid "Do not clean" -msgstr "Ne pas nettoyer" - -#: src/gui/html/js/game.js:22 -msgid "N/A" -msgstr "N/A" - -#: src/gui/html/js/handlePromiseError.js:15 -#: src/gui/html/js/translateStaticText.js:111 -msgid "Error" -msgstr "Erreur" - -#: src/gui/html/js/translateStaticText.js:17 -msgid "Active Plugin" -msgstr "Plugin actif" - -#: src/gui/html/js/translateStaticText.js:18 -#: src/gui/html/js/translateStaticText.js:251 -msgid "Master File" -msgstr "Fichier maître" - -#: src/gui/html/js/translateStaticText.js:19 -msgid "Empty Plugin" -msgstr "Plugin vide" - -#: src/gui/html/js/translateStaticText.js:20 -msgid "Loads Archive" -msgstr "Charger une archive" - -#: src/gui/html/js/translateStaticText.js:21 -#: src/gui/html/js/translateStaticText.js:85 -msgid "Has User Metadata" -msgstr "A des métadonnées utilisateur" - -#: src/gui/html/js/translateStaticText.js:23 -msgid "Edit Metadata" -msgstr "Éditer les métadonnées" - -#: src/gui/html/js/translateStaticText.js:24 -msgid "Copy Metadata" -msgstr "Copier les métadonnées" - -#: src/gui/html/js/translateStaticText.js:25 -msgid "Clear User Metadata" -msgstr "Vider les métadonnées utilsateur" - -#: src/gui/html/js/translateStaticText.js:32 -msgid "Enable Edits" -msgstr "Activer les modifications" - -#: src/gui/html/js/translateStaticText.js:33 -#: src/gui/html/js/translateStaticText.js:84 -msgid "Global Priority" -msgstr "Priorité globale" - -#: src/gui/html/js/translateStaticText.js:34 -msgid "" -"Global priorities are compared against all other plugins. Normal priorities " -"are compared against only conflicting plugins." -msgstr "" -"Les priorités globales sont comparées à tous les autres plugins. Les " -"priorités normales sont comparées uniquement avec les plugins conflictuels." - -#: src/gui/html/js/translateStaticText.js:35 -msgid "Priority Value" -msgstr "Valeur de priorité" - -#: src/gui/html/js/translateStaticText.js:37 -msgid "Main" -msgstr "Principal" - -#: src/gui/html/js/translateStaticText.js:38 -msgid "Load After" -msgstr "Charger après" - -#: src/gui/html/js/translateStaticText.js:39 -msgid "Requirements" -msgstr "Requis" - -#: src/gui/html/js/translateStaticText.js:40 -msgid "Incompatibilities" -msgstr "Incompatibilités" - -#: src/gui/html/js/translateStaticText.js:41 -msgid "Messages" -msgstr "Messages" - -#: src/gui/html/js/translateStaticText.js:42 -msgid "Bash Tags" -msgstr "Étiquettes du bash" - -#: src/gui/html/js/translateStaticText.js:43 -msgid "Dirty Info" -msgstr "Infos sur les entrées sales" - -#: src/gui/html/js/translateStaticText.js:44 -msgid "Locations" -msgstr "Emplacements" - -#: src/gui/html/js/translateStaticText.js:46 -#: src/gui/html/js/translateStaticText.js:50 -#: src/gui/html/js/translateStaticText.js:54 -msgid "Filename" -msgstr "Nom du fichier" - -#: src/gui/html/js/translateStaticText.js:47 -#: src/gui/html/js/translateStaticText.js:51 -#: src/gui/html/js/translateStaticText.js:55 -msgid "Display Name" -msgstr "Afficher le nom" - -#: src/gui/html/js/translateStaticText.js:48 -#: src/gui/html/js/translateStaticText.js:52 -#: src/gui/html/js/translateStaticText.js:56 -#: src/gui/html/js/translateStaticText.js:60 -#: src/gui/html/js/translateStaticText.js:65 -msgid "Condition" -msgstr "Condition" - -#: src/gui/html/js/translateStaticText.js:58 -msgid "Type" -msgstr "Type" - -#: src/gui/html/js/translateStaticText.js:59 -msgid "Content" -msgstr "Contenu" - -#: src/gui/html/js/translateStaticText.js:61 -#: src/gui/html/js/translateStaticText.js:239 -msgid "Language" -msgstr "Langue" - -#: src/gui/html/js/translateStaticText.js:63 -msgid "Add/Remove" -msgstr "Ajouter/Retirer" - -#: src/gui/html/js/translateStaticText.js:64 -msgid "Bash Tag" -msgstr "Étiquette du bash" - -#: src/gui/html/js/translateStaticText.js:67 -msgid "CRC" -msgstr "CRC" - -#: src/gui/html/js/translateStaticText.js:68 -msgid "ITM Count" -msgstr "Énumération des ITM " - -#: src/gui/html/js/translateStaticText.js:69 -msgid "Deleted References" -msgstr "Références supprimées" - -#: src/gui/html/js/translateStaticText.js:70 -msgid "Deleted Navmeshes" -msgstr "Navmeshes supprimés" - -#: src/gui/html/js/translateStaticText.js:71 -msgid "Cleaning Utility" -msgstr "Utilitaire de nettoyage" - -#: src/gui/html/js/translateStaticText.js:73 -msgid "URL" -msgstr "URL" - -#: src/gui/html/js/translateStaticText.js:74 -#: src/gui/html/js/translateStaticText.js:248 -msgid "Name" -msgstr "Nom" - -#: src/gui/html/js/translateStaticText.js:76 -msgid "Save Metadata" -msgstr "Sauver les métadonnées" - -#: src/gui/html/js/translateStaticText.js:77 -#: src/gui/html/js/translateStaticText.js:94 -#: src/gui/html/js/translateStaticText.js:169 -#: src/gui/html/js/translateStaticText.js:262 -msgid "Cancel" -msgstr "Annuler" - -#: src/gui/html/js/translateStaticText.js:86 -msgid "Editor Is Open" -msgstr "L'éditeur est ouvert" - -#: src/gui/html/js/translateStaticText.js:93 -#: src/gui/html/js/translateStaticText.js:276 -msgid "OK" -msgstr "OK" - -#: src/gui/html/js/translateStaticText.js:101 -msgid "A filename is required." -msgstr "Un nom de fichier est requis." - -#: src/gui/html/js/translateStaticText.js:102 -#: src/gui/html/js/translateStaticText.js:113 -#: src/gui/html/js/translateStaticText.js:123 -#: src/gui/html/js/translateStaticText.js:135 -#: src/gui/html/js/translateStaticText.js:143 -#: src/gui/html/js/translateStaticText.js:152 -msgid "Delete Row" -msgstr "Supprimer la ligne" - -#: src/gui/html/js/translateStaticText.js:109 -msgid "Note" -msgstr "Note" - -#: src/gui/html/js/translateStaticText.js:110 -msgid "Warning" -msgstr "Avertissement" - -#: src/gui/html/js/translateStaticText.js:112 -msgid "A content string is required." -msgstr "Une chaîne de contenu est requise." - -#: src/gui/html/js/translateStaticText.js:120 -msgid "Add" -msgstr "Ajouter" - -#: src/gui/html/js/translateStaticText.js:121 -msgid "Remove" -msgstr "Retirer" - -#: src/gui/html/js/translateStaticText.js:122 -#: src/gui/html/js/translateStaticText.js:150 -msgid "A name is required." -msgstr "Un nom est requis." - -#: src/gui/html/js/translateStaticText.js:130 -msgid "A CRC is required." -msgstr "Un CRC est requis." - -#: src/gui/html/js/translateStaticText.js:131 -#: src/gui/html/js/translateStaticText.js:132 -#: src/gui/html/js/translateStaticText.js:133 -msgid "Values must be integers." -msgstr "Les valeurs doivent être des nombres entiers." - -#: src/gui/html/js/translateStaticText.js:134 -msgid "A utility name is required." -msgstr "Un nom d'utilitaire est requis." - -#: src/gui/html/js/translateStaticText.js:142 -msgid "A link is required." -msgstr "Un lien est requis." - -#: src/gui/html/js/translateStaticText.js:151 -msgid "A folder is required." -msgstr "Un dossier est requis." - -#: src/gui/html/js/translateStaticText.js:159 -#: src/gui/html/js/translateStaticText.js:259 -msgid "Add New Row" -msgstr "Ajouter une nouvelle ligne" - -#: src/gui/html/js/translateStaticText.js:165 -msgid "Jump To General Information" -msgstr "Aller aux informations générales" - -#: src/gui/html/js/translateStaticText.js:166 -msgid "Sort Plugins" -msgstr "Trier les plugins" - -#: src/gui/html/js/translateStaticText.js:167 -msgid "Update Masterlist" -msgstr "Mettre à jour la masterlist" - -#: src/gui/html/js/translateStaticText.js:168 -#: src/gui/html/js/translateStaticText.js:261 -msgid "Apply" -msgstr "Appliquer" - -# Affiché à quel endroit ? à vérifier... -# Autre correspondance (Search card) traduite en "Rechercher..." -#: src/gui/html/js/translateStaticText.js:170 -msgid "Search Cards" -msgstr "Rechercher" - -#: src/gui/html/js/translateStaticText.js:173 -msgid "Redate Plugins" -msgstr "Redater les plugins" - -#: src/gui/html/js/translateStaticText.js:174 -msgid "Open Debug Log Location" -msgstr "Ouvrir le dossier du journal de débogage" - -#: src/gui/html/js/translateStaticText.js:175 -msgid "Clear All User Metadata" -msgstr "Vider toutes les métadonnées utilisateur" - -#: src/gui/html/js/translateStaticText.js:176 -msgid "Copy Load Order" -msgstr "Copier l'ordre de chargement" - -#: src/gui/html/js/translateStaticText.js:177 -msgid "Copy Content" -msgstr "Copier le contenu" - -#: src/gui/html/js/translateStaticText.js:178 -msgid "Refresh Content" -msgstr "Actualiser le contenu" - -#: src/gui/html/js/translateStaticText.js:179 -msgid "View Documentation" -msgstr "Afficher la documentation" - -#: src/gui/html/js/translateStaticText.js:180 -msgid "About" -msgstr "A propos" - -#: src/gui/html/js/translateStaticText.js:181 -#: src/gui/html/js/translateStaticText.js:231 -msgid "Settings" -msgstr "Paramètres" - -#: src/gui/html/js/translateStaticText.js:185 -msgid "Search cards" -msgstr "Rechercher..." - -#: src/gui/html/js/translateStaticText.js:190 -msgid "Plugins" -msgstr "Plugins" - -#: src/gui/html/js/translateStaticText.js:191 -msgid "Filters" -msgstr "Filtres" - -#: src/gui/html/js/translateStaticText.js:192 -msgid "Press Enter or click outside the input to set the filter." -msgstr "" -"Pour appliquer le filtre, appuyez sur Entrée ou cliquez hors du champ de " -"saisie." - -#: src/gui/html/js/translateStaticText.js:193 -msgid "Show only plugins with cards that contain" -msgstr "Afficher uniquement les plugins avec des cartes qui contiennent :" - -#: src/gui/html/js/translateStaticText.js:194 -msgid "No text specified" -msgstr "Aucun texte spécifié" - -#: src/gui/html/js/translateStaticText.js:197 -msgid "Hide version numbers" -msgstr "Masquer les numéros de versions" - -#: src/gui/html/js/translateStaticText.js:198 -msgid "Hide CRCs" -msgstr "Masquer le CRC" - -#: src/gui/html/js/translateStaticText.js:199 -msgid "Hide Bash Tags" -msgstr "Masquer les étiquettes bash" - -#: src/gui/html/js/translateStaticText.js:200 -msgid "Hide notes" -msgstr "Masquer les notes" - -#: src/gui/html/js/translateStaticText.js:201 -msgid "Hide 'Do not clean' messages" -msgstr "Masquer les messages 'Ne pas nettoyer'" - -#: src/gui/html/js/translateStaticText.js:202 -msgid "Hide all plugin messages" -msgstr "Masquer les messages des plugins" - -#: src/gui/html/js/translateStaticText.js:203 -msgid "Hide inactive plugins" -msgstr "Masquer les plugins inactifs" - -#: src/gui/html/js/translateStaticText.js:204 -msgid "Hide messageless plugins" -msgstr "Masquer les plugins sans messages" - -#: src/gui/html/js/translateStaticText.js:207 -msgid "Show only conflicting plugins for" -msgstr "Afficher uniquement les plugins en conflit avec :" - -#: src/gui/html/js/translateStaticText.js:208 -msgid "No plugin selected" -msgstr "Aucun plugin sélectionné" - -#: src/gui/html/js/translateStaticText.js:212 -msgid "Hidden plugins:" -msgstr "Plugins masqués :" - -#: src/gui/html/js/translateStaticText.js:213 -msgid "Hidden messages:" -msgstr "Message masqués :" - -#: src/gui/html/js/translateStaticText.js:218 -msgid "General Information" -msgstr "Informations générales" - -#: src/gui/html/js/translateStaticText.js:219 -msgid "Masterlist Revision" -msgstr "Révision de la masterlist" - -#: src/gui/html/js/translateStaticText.js:220 -msgid "Masterlist Date" -msgstr "Date de la masterlist" - -#: src/gui/html/js/translateStaticText.js:221 -msgid "Warnings" -msgstr "Avertissements" - -#: src/gui/html/js/translateStaticText.js:222 -msgid "Errors" -msgstr "Erreurs" - -#: src/gui/html/js/translateStaticText.js:223 -msgid "Total Messages" -msgstr "Total de messages" - -#: src/gui/html/js/translateStaticText.js:224 -msgid "Active Plugins" -msgstr "Plugins actifs" - -#: src/gui/html/js/translateStaticText.js:225 -msgid "Dirty Plugins" -msgstr "Plugins sales" - -#: src/gui/html/js/translateStaticText.js:226 -msgid "Total Plugins" -msgstr "Total de plugins" - -#: src/gui/html/js/translateStaticText.js:234 -msgid "Default Game" -msgstr "Jeu par défaut" - -#: src/gui/html/js/translateStaticText.js:235 -msgid "Autodetect" -msgstr "Détection automatique" - -#: src/gui/html/js/translateStaticText.js:240 -msgid "Language changes will be applied after LOOT is restarted." -msgstr "Le changement de langage sera effectif après un redémarrage de LOOT." - -#: src/gui/html/js/translateStaticText.js:242 -msgid "Enable debug logging" -msgstr "Activer le journal de débogage" - -#: src/gui/html/js/translateStaticText.js:243 -msgid "The output is logged to the LOOTDebugLog.txt file." -msgstr "Les informations sont enregistrées dans le fichier LOOTDEbugLog.txt." - -#: src/gui/html/js/translateStaticText.js:245 -msgid "Update masterlist before sorting" -msgstr "Mettre à jour la masterlist avant de trier" - -#: src/gui/html/js/translateStaticText.js:249 -msgid "Base Game" -msgstr "Jeu de base" - -#: src/gui/html/js/translateStaticText.js:250 -msgid "LOOT Folder" -msgstr "Dossier LOOT" - -#: src/gui/html/js/translateStaticText.js:252 -msgid "Masterlist Repository URL" -msgstr "URL de la masterlist" - -#: src/gui/html/js/translateStaticText.js:253 -msgid "Masterlist Repository Branch" -msgstr "Branche de la masterlist" - -#: src/gui/html/js/translateStaticText.js:254 -msgid "Install Path" -msgstr "Chemin d'instal." - -#: src/gui/html/js/translateStaticText.js:255 -msgid "Install Path Registry Key" -msgstr "Clé registre du chemin d'instal." - -#: src/gui/html/js/translateStaticText.js:268 -msgid "First-Time Tips" -msgstr "Astuces" - -#: src/gui/html/js/translateStaticText.js:270 -msgid "" -"CRCs are only displayed after plugins have been loaded, either by conflict " -"filtering, or by sorting." -msgstr "" -"Les CRC sont affichés uniquement après que les plugins aient été chargés, " -"soit par filtrage des conflits, ou par le tri." - -#: src/gui/html/js/translateStaticText.js:271 -msgid "" -"Double-click a plugin in the sidebar to quickly open it in the metadata " -"editor." -msgstr "" -"Double-cliquez sur un plugin dans la barre latérale pour l'ouvrir rapidement " -"dans l'éditeur de métadonnées." - -#: src/gui/html/js/translateStaticText.js:272 -msgid "" -"Plugins can be drag and dropped from the sidebar into the metadata editor's " -"\"load after\", \"requirements\" and \"incompatibility\" tables." -msgstr "" -"Les plugins peuvent être déplacés de la barre latérale vers les panneaux \\" -"\"Charger après\\\", \\\"Requis\\\" et \\\"Incompatibilités\\ de l'éditeur " -"de métaonnées." - -#: src/gui/html/js/translateStaticText.js:273 -msgid "" -"Some features are disabled while the metadata editor is open, or while there " -"is a sorted load order that has not been applied or discarded." -msgstr "" -"Certaines fonctionnalités sont désactivées lorsque l'éditeur de métadonnées " -"est ouvert, ou qu'une modification de l'ordre de chargement n'a pas été " -"appliquée ou annulée." - -#: src/gui/html/js/translateStaticText.js:274 -msgid "" -"Many interface elements have tooltips. If you don't know what something is, " -"try hovering your mouse over it to find out. Otherwise, LOOT's documentation " -"can be accessed through the main menu." -msgstr "" -"De nombreux éléments de l'interface ont des bulles d'aide. Si vous ne savez " -"pas ce qu'est une chose, essayez de passer votre souris au-dessus pour le " -"découvrir. Sinon, la documentation de LOOT est accessible par le menu " -"principal." - -#: src/gui/query_handler.cpp:111 -msgid "Parsing, merging and evaluating metadata..." -msgstr "Analyse, fusion et évaluation des métadonnées..." - -#: src/gui/query_handler.cpp:203 src/gui/query_handler.cpp:206 -msgid "Failed to change game. Details: %1%" -msgstr "Impossible de changer jeu. Détails : %1%" - -#: src/gui/query_handler.cpp:220 src/gui/query_handler.cpp:223 -#: src/gui/query_handler.cpp:298 src/gui/query_handler.cpp:301 -#: src/gui/query_handler.cpp:329 src/gui/query_handler.cpp:332 -msgid "Failed to copy plugin metadata. Details: %1%" -msgstr "Impossible de copier les métadonnées du plugin. Détails : %1%" - -#: src/gui/query_handler.cpp:238 src/gui/query_handler.cpp:248 -msgid "Failed to apply plugin metadata. Details: %1%" -msgstr "Impossible d'appliquer les métadonnées du plugin. Détails : %1%" - -#: src/gui/query_handler.cpp:596 -msgid "" -"An error occurred while parsing the masterlist: %1%. This probably happened " -"because an update to LOOT changed its metadata syntax support. Try updating " -"your masterlist to resolve the error." -msgstr "" -"Une erreur s'est produite lors de l'analyse de la masterlist : %1%. Cela est " -"probablement arrivé parce qu'une mise à jour de LOOT a modifié sa prise " -"charge de syntaxe de métadonnées. Essayez de mettre à jour votre masterlist " -"pour résoudre l'erreur." - -# à completer -#: src/gui/query_handler.cpp:611 -msgid "" -"An error occurred while parsing the userlist: %1%. This probably happened " -"because an update to LOOT changed its metadata syntax support. Your user " -"metadata will have to be updated manually.\n" -"\n" -"To do so, use the 'Open Debug Log Location' in LOOT's main menu to open its " -"data folder, then open your 'userlist.yaml' file in the relevant game " -"folder. You can then edit the metadata it contains with reference to the " -"[syntax documentation](https://loot.github.io/docs/%2%.%3%.%4%/LOOT%" -"%20Metadata%%20Syntax.html).\n" -"\n" -"You can also seek support on LOOT's forum thread, which is linked to on " -"[LOOT's website](https://loot.github.io/)." -msgstr "" -"Une erreur s'est produite lors de l'analyse de l'userlist : %1%. Cela est " -"probablement arrivé parce qu'une mise à jour de LOOT a modifié sa prise " -"charge de syntaxe de métadonnées. Vos métadonnées utilisateur doivent être " -"mises à jour manuellement.\n" -"\n" -"To do so, use the 'Open Debug Log Location' in LOOT's main menu to open its " -"data folder, then open your 'userlist.yaml' file in the relevant game " -"folder. You can then edit the metadata it contains with reference to the " -"[syntax documentation](https://loot.github.io/docs/%2%.%3%.%4%/LOOT%" -"%20Metadata%%20Syntax.html).\n" -"\n" -"You can also seek support on LOOT's forum thread, which is linked to on " -"[LOOT's website](https://loot.github.io/)." - -#: src/gui/query_handler.cpp:719 src/gui/query_handler.cpp:722 -msgid "Failed to get game data. Details: %1%" -msgstr "Impossible d'obtenir les données du jeu. Détails : %1%" - -#: src/gui/query_handler.cpp:803 src/gui/query_handler.cpp:806 -msgid "Failed to update the masterlist. Details: %1%" -msgstr "Impossible de mettre à jour la masterlist. Détails : %1%" - -#: src/gui/query_handler.cpp:845 -msgid "Loading plugin contents..." -msgstr "Chargement du contenu des plugins..." - -#: src/gui/query_handler.cpp:849 -msgid "Sorting load order..." -msgstr "Tri de l'ordre de chargement ..." - -#: src/gui/query_handler.cpp:906 -msgid "Failed to sort plugins. Details: %1%" -msgstr "Impossible de trier les plugins. Détails : %1%" - -#: src/gui/query_handler.cpp:936 -msgid "" -"A global message contains a condition that could not be evaluated. Details: " -"%1%" -msgstr "" -"Un message global contient une condition qui n'a pas pu être évaluée. " -"Détails : %1%" - -#: src/gui/query_handler.cpp:958 src/backend/plugin/plugin_sorter.cpp:216 -msgid "\"%1%\" contains a condition that could not be evaluated. Details: %2%" -msgstr "" -"\"%1%\" contient une condition qui n'a pas pu être évaluée. Détails : %2%" - -#: src/backend/app/loot_paths.cpp:85 -msgid "Failed to get %LOCALAPPDATA% path." -msgstr "Impossible d'obtenir le chemin %LOCALAPPDATA%" - -#: src/backend/app/loot_state.cpp:124 -msgid "Error: Could not create LOOT settings file. %1%" -msgstr "Erreur : impossible de créer le fichier de paramètres de LOOT. %1%" - -#: src/backend/app/loot_state.cpp:131 -msgid "Error: Settings parsing failed. %1%" -msgstr "Erreur : les paramètres d'analyse ont échoué. %1%" - -#: src/backend/app/loot_state.cpp:194 -msgid "Error: Game-specific settings could not be initialised. %1%" -msgstr "" -"Erreur : les paramètres spécifiques du jeu ne peuvent pas être initialisés. " -"%1%" - -#: src/backend/app/loot_state.cpp:272 -msgid "None of the supported games were detected." -msgstr "Aucuns des jeux pris en charge n'a été détecté." - -#: src/backend/game/game.cpp:62 -msgid "Invalid game ID supplied." -msgstr "ID du jeu fourni incorrect." - -#: src/backend/game/game.cpp:69 -msgid "Game path could not be detected." -msgstr "Le chemin du jeu n'a pas pu être trouvé. " - -#: src/backend/game/game.cpp:79 -msgid "Could not create LOOT folder for game. Details:" -msgstr "Impossible de créer le dossier de LOOT pour ce jeu. Détails :" - -#: src/backend/game/load_order_handler.cpp:49 -msgid "Unsupported game ID supplied." -msgstr "ID du jeu fourni n'est pas supporté." - -#: src/backend/game/load_order_handler.cpp:54 -msgid "Game path is not initialised." -msgstr "Le chemin du jeu n'est pas initialisé." - -#: src/backend/game/load_order_handler.cpp:88 -msgid "" -"libloadorder failed to create a game handle. Details could not be fetched." -msgstr "" -"libloadorder n'est pas parvenu à créer une poignée du jeu. Les détails ne " -"peuvent pas être récupérés." - -#: src/backend/game/load_order_handler.cpp:91 -msgid "libloadorder failed to create a game handle. Details:" -msgstr "libloadorder n'est pas parvenu à créer une poignée du jeu. Détails :" - -#: src/backend/game/load_order_handler.cpp:109 -msgid "" -"libloadorder failed to check if a plugin is active. Details could not be " -"fetched." -msgstr "" -"libloadorer n'a pas pu vérifier si un plugin est actif. Les détails ne " -"peuvent pas être récupérés." - -#: src/backend/game/load_order_handler.cpp:112 -msgid "libloadorder failed to check if a plugin is active. Details:" -msgstr "libloadorer n'a pas pu vérifier si un plugin est actif. Détails :" - -#: src/backend/game/load_order_handler.cpp:134 -msgid "" -"libloadorder failed to get the load order. Details could not be fetched." -msgstr "" -"libloadorder n'a pas pu obtenir l'ordre de chargement. Les détails ne " -"peuvent pas être récupérés." - -#: src/backend/game/load_order_handler.cpp:137 -msgid "libloadorder failed to get the load order. Details:" -msgstr "libloadorder n'a pas pu obtenir l'ordre de chargement. Détails :" - -#: src/backend/game/load_order_handler.cpp:160 -msgid "" -"libloadorder failed to set the load order. Details could not be fetched." -msgstr "" -"libloadorder n'a pas pu définir l'ordre de chargement. Les détails ne " -"peuvent pas être récupérés." - -#: src/backend/game/load_order_handler.cpp:163 -msgid "libloadorder failed to set the load order. Details:" -msgstr "libloadorder n'a pas pu définir l'ordre de chargement. Détails :" - -#: src/backend/helpers/git_helper.cpp:104 -msgid "Git operation failed. Error: %1%" -msgstr "L'opération d'obtention a échoué. Erreur : %1%" - -#: src/backend/helpers/git_helper.cpp:145 -msgid "" -"An error occurred while trying to clone the remote masterlist repository." -msgstr "" -"Une erreur s'est produite lors de la tentative de clonage du dépôt distant " -"de la masterlist." - -#: src/backend/helpers/git_helper.cpp:197 -msgid "" -"An error occurred while trying to update the masterlist. This could be due " -"to a server-side error. Try again in a few minutes." -msgstr "" -"Une erreur s'est produite lors de la tentative de mise à jour de la " -"masterlist. Cela peut être dû à une erreur coté serveur. Réessayez dans " -"quelques minutes." - -#: src/backend/helpers/git_helper.cpp:311 src/backend/masterlist.cpp:50 -msgid "Unknown: Git repository missing" -msgstr "Inconnu : dépôt Git manquant" - -#: src/backend/helpers/helpers.cpp:81 -msgid "Unable to open \"%1%\" for CRC calculation." -msgstr "Impossible d'ouvrir \"%1%\" pour le calcul du CRC. " - -#: src/backend/helpers/helpers.cpp:122 src/backend/helpers/helpers.cpp:125 -msgid "Failed to open file in its default application." -msgstr "Impossible d'ouvrir le fichier avec son application par défaut" - -#: src/backend/masterlist.cpp:43 -msgid "" -"An error occurred while trying to read the local masterlist's version. If " -"this error happens again, try deleting the \".git\" folder in %1%." -msgstr "" -"Une erreur s'est produite lors de la tentative de lecture de la version de " -"la masterlist locale. Si cette erreur se reproduit, essayez de supprimer le " -"dossier \".git\" dans %1%." - -#: src/backend/masterlist.cpp:47 -msgid "N/A: No masterlist present" -msgstr "N/A : aucune masterlist présente" - -#: src/backend/masterlist.cpp:80 src/backend/masterlist.cpp:81 -msgid "(edited)" -msgstr "(modifié)" - -#: src/backend/masterlist.cpp:118 src/backend/masterlist.cpp:132 -msgid "" -"An error occurred while trying to access the local masterlist repository. If " -"this error happens again, try deleting the \".git\" folder in %1%." -msgstr "" -"Une erreur s'est produite lors de la tentative d'accès au dépôt local de la " -"masterlist. Si cette erreur se reproduit, essayez de supprimer le dossier \"." -"git\" dans %1%." - -#: src/backend/masterlist.cpp:239 -msgid "" -"An error occurred while trying to read information on the updated " -"masterlist. If this error happens again, try deleting the \".git\" folder in " -"%1%." -msgstr "" -"Une erreur s'est produite lors de la tentative de lecture des informations à " -"partir de la masterlist mise à jour. Si cette erreur se reproduit, essayez " -"de supprimer le dossier \".git\" dans %1%." - -#: src/backend/masterlist.cpp:253 -msgid "Masterlist revision" -msgstr "Révision de la masterlist" - -#: src/backend/masterlist.cpp:257 -msgid "" -"The latest masterlist revision contains a syntax error, LOOT is using the " -"most recent valid revision instead. Syntax errors are usually minor and " -"fixed within hours." -msgstr "" -"La dernière révision de la masterlist contient une erreur de syntaxe, LOOT " -"utilise la plus récente révision valide à la place. Les erreurs de syntaxe " -"sont habituellement mineures et corrigées dans les heures qui suivent." - -#: src/backend/metadata/condition_grammar.h:146 -#: src/backend/metadata/condition_grammar.h:281 -#: src/backend/metadata/condition_grammar.h:365 -msgid "Invalid file path:" -msgstr "Chemin du fichier invalide :" - -#: src/backend/metadata/condition_grammar.h:187 -#: src/backend/metadata/condition_grammar.h:213 -msgid "Invalid regex string \"%1%\": %2%" -msgstr "Chaine regex \"%1%\" incorrecte : %2%" - -#: src/backend/metadata/condition_grammar.h:205 -msgid "Invalid folder path:" -msgstr "Chemin du dossier invalide :" - -#: src/backend/metadata/condition_grammar.h:385 -msgid "Expected \"%1%\" at \"%2%\"." -msgstr "Prévu \"%1%\" à \"%2%\"." - -#: src/backend/metadata/conditional_metadata.cpp:73 -#: src/backend/metadata/conditional_metadata.cpp:104 -msgid "Failed to parse condition \"%1%\": %2%" -msgstr "Échec de l'analyse de la condition \"%1%\": %2%" - -#: src/backend/metadata/conditional_metadata.cpp:78 -#: src/backend/metadata/conditional_metadata.cpp:109 -msgid "Failed to parse condition \"%1%\"." -msgstr "Échec de l'analyse de la condition \"%1%\"." - -#: src/backend/metadata/plugin_dirty_info.cpp:69 -msgid "" -"Contains %1% ITM records, %2% deleted references and %3% deleted navmeshes. " -"Clean with %4%." -msgstr "" -"Contient %1% enregistrements d'ITM, %2% références supprimées et %3% " -"navmeshes supprimés. Nettoyez-les avec %4%. " - -#: src/backend/metadata/plugin_dirty_info.cpp:71 -msgid "Clean with %1%." -msgstr "Nettoyez avec %1%. " - -#: src/backend/metadata/plugin_dirty_info.cpp:74 -msgid "" -"Contains %1% deleted references and %2% deleted navmeshes. Clean with %3%." -msgstr "" -"Contient %1% références supprimées et %2% navmeshes supprimés. Nettoyez-les " -"avec %3%. " - -#: src/backend/metadata/plugin_dirty_info.cpp:76 -msgid "Contains %1% deleted navmeshes. Clean with %2%." -msgstr "Contient %1% navmeshes supprimés. Nettoyez-les avec %2%. " - -#: src/backend/metadata/plugin_dirty_info.cpp:78 -msgid "Contains %1% deleted references. Clean with %2%." -msgstr "Contient %1% références supprimées. Nettoyez-les avec %2%." - -#: src/backend/metadata/plugin_dirty_info.cpp:81 -msgid "Contains %1% ITM records and %2% deleted navmeshes. Clean with %3%." -msgstr "" -"Contient %1% enregistrements d'ITM, %2% navmeshes supprimés. Nettoyez-les " -"avec %3%. " - -#: src/backend/metadata/plugin_dirty_info.cpp:83 -msgid "Contains %1% ITM records. Clean with %2%." -msgstr "Contient %1% enregistrements d'ITM. Nettoyez-les avec %2%. " - -#: src/backend/metadata/plugin_dirty_info.cpp:86 -msgid "Contains %1% ITM records and %2% deleted references. Clean with %3%." -msgstr "" -"Contient %1% enregistrements d'ITM, %2% références supprimées. Nettoyez-les " -"avec %3%." - -#: src/backend/plugin/plugin.cpp:115 -msgid "Cannot read \"%1%\". Details: %2%" -msgstr "Impossible de charger \"%1%\". Détails : %2%" - -#: src/backend/plugin/plugin.cpp:213 src/backend/plugin/plugin.cpp:224 -msgid "This plugin requires \"%1%\" to be installed, but it is missing." -msgstr "Ce plugin nécessite \"%1%\" d'être installé, mais il est absent." - -#: src/backend/plugin/plugin.cpp:216 -msgid "This plugin requires \"%1%\" to be active, but it is inactive." -msgstr "Ce plugin nécessite \"%1%\" d'être actif, mais il est inactif." - -#: src/backend/plugin/plugin.cpp:230 -msgid "This plugin is incompatible with \"%1%\", but both are present." -msgstr "Ce plugin est incompatible avec \"%1%\", mais les deux sont présents." - -#: src/backend/plugin/plugin_sorter.cpp:81 -msgid "" -"Cyclic interaction detected between plugins \"%1%\" and \"%2%\". Back cycle: " -"%3%" -msgstr "" -"Interaction cyclique détectée entre les plugins \"%1%\" et «%2%\". Retour de " -"cycle : %3%" - -#~ msgid "An exception occurred while loading this plugin. Details:" -#~ msgstr "Une erreur est survenue lors du chargement de ce plugin. Détails :" - -#~ msgid "" -#~ "libloadorder failed to get the active plugins list. Details could not be " -#~ "fetched." -#~ msgstr "" -#~ "libloadorer n'a pas pu obtenir la liste des plugins actifs. Les détails " -#~ "ne peuvent pas être récupérés." - -#~ msgid "libloadorder failed to get the active plugins list. Details:" -#~ msgstr "" -#~ "libloadorer n'a pas pu obtenir la liste des plugins actifs. Détails :" - -#~ msgid "Building plugin graph..." -#~ msgstr "Analyse de l'ordre des plugins..." - -#~ msgid "Adding edges to plugin graph and performing topological sort..." -#~ msgstr "Calcul de l'ordre et tri des plugins..." - -#~ msgid "Checking for conflicting plugins..." -#~ msgstr "Vérification des conflits de plugins..." - -#~ msgid "Loading plugin headers..." -#~ msgstr "Chargement des en-têtes des plugins..." - -#~ msgid "Parsing masterlist..." -#~ msgstr "Traitement de la masterlist..." - -#~ msgid "Parsing userlist..." -#~ msgstr "Traitement de l'userlist..." - -#~ msgid "Merging and evaluating plugin metadata..." -#~ msgstr "Fusion et évaluation des métadonnées des plugins..." - -#~ msgid "Loading general messages..." -#~ msgstr "Chargement des messages généraux ..." - -#~ msgid "Updating and parsing masterlist..." -#~ msgstr "Mise à jour et traitement de la masterlist..." - -#~ msgid "Regenerating displayed content..." -#~ msgstr "Régénération du contenu affiché..." - -#~ msgid "Error: Games' settings parsing failed. %1%" -#~ msgstr "Erreur : les paramètres d'analyse du jeu ont échoué. %1%" - -#~ msgid "Loading game data..." -#~ msgstr "Chargement des données du jeu..." - -#~ msgid "Masterlist updated to revision %s." -#~ msgstr "Masterlist mise à jour vers la révision %s." - -#~ msgid "Updating masterlist..." -#~ msgstr "Mise à jour de la masterlist..." - -#~ msgid "Sorting plugins..." -#~ msgstr "Tri des plugins..." - -#~ msgid "The metadata for \"%s\" has been copied to the clipboard." -#~ msgstr "Les métadonnées de \"%s\" ont été copiées dans le presse-papiers." - -#~ msgid "" -#~ "Are you sure you want to clear all existing user-added metadata from \"%s" -#~ "\"?" -#~ msgstr "" -#~ "Êtes-vous sûr de vouloir effacer toutes les métadonnées utilisateur " -#~ "existantes de \"%s\" ?" - -#~ msgid "The user-added metadata for \"%s\" has been cleared." -#~ msgstr "Les métadonnées utilisateur de \"%s\" ont été supprimées." - -#~ msgid "Refreshing data..." -#~ msgstr "Actualisation des données..." - -#~ msgid "Checking if plugins have been loaded..." -#~ msgstr "Vérifie si les plugins ont été chargés..." - -#~ msgid "" -#~ "You have not yet applied or cancelled your %s. Are you sure you want to " -#~ "quit?" -#~ msgstr "" -#~ "Vous n'êtes pas encore appliquée ou annulé votre %s. Êtes-vous sûr de " -#~ "vouloir quitter ?" - -#~ msgid "unknown" -#~ msgstr "inconnu" - -#~ msgid "Show Only Conflicts" -#~ msgstr "Afficher seulement les conflits" - -#~ msgid "Filter content" -#~ msgstr "Filtrer le contenu..." - -#~ msgid "" -#~ "Double-click a plugin in the sidebar to quickly open its metadata editor. " -#~ "Multiple metadata editors can be opened at once." -#~ msgstr "" -#~ "Double-cliquez sur un plugin dans la barre latérale pour ouvrir " -#~ "rapidement son éditeur de métadonnées. Plusieurs éditeurs de métadonnées " -#~ "peuvent être ouverts à la fois." - -#~ msgid "" -#~ "Plugins can be drag and dropped from the sidebar into editors' \"load " -#~ "after\", \"requirements\" and \"incompatibility\" tables." -#~ msgstr "" -#~ "Les plugins peuvent être déplacés de la barre latérale vers les panneaux " -#~ "d'édition \"Charger après\", \"Requis\" et \"Incompatibilités\"." - -#~ msgid "" -#~ "Some features are disabled while there is an editor open, or while there " -#~ "is a sorted load order that has not been applied or discarded." -#~ msgstr "" -#~ "Certaines fonctionnalités sont désactivées lorsqu'un éditeur est ouvert, " -#~ "ou qu'une modification de l'ordre de chargement n'a pas été appliquée ou " -#~ "annulée." - -#~ msgid "" -#~ "libloadorder failed to initialise game master file support. Details could " -#~ "not be fetched." -#~ msgstr "" -#~ "libloadorder a échoué dans l'initialisation du support de fichier maître " -#~ "du jeu. Les détails ne peuvent pas être récupérés." - -#~ msgid "libloadorder failed to initialise game master file support. Details:" -#~ msgstr "" -#~ "libloadorder a échoué dans l'initialisation du support de fichier maître " -#~ "du jeu. Détails :" - -#~ msgid "Shell execute failed." -#~ msgstr "Échec de la fonction ShellExecute." - -#~ msgid "Invalid regex string:" -#~ msgstr "Regex string invalide :" - -#~ msgid "Loads BSA" -#~ msgstr "Charger les BSA" - -#~ msgid "An exception occurred while loading this plugin. Details: " -#~ msgstr "Une erreur est survenue lors du chargement de ce plugin. Détails :" - -#~ msgid "Object memory already allocated!" -#~ msgstr "Mémoire \"object\" déjà allouée !" - -#~ msgid "Tree memory already allocated!" -#~ msgstr "Mémoire \"tree\" déjà allouée !" - -#~ msgid "Diff memory already allocated!" -#~ msgstr "Mémoire \"diff\" déjà allouée !" - -#~ msgid "Rolled back to the previous revision." -#~ msgstr "Revenir à la révision précédente." - -#~ msgid "An error occurred while parsing the masterlist: %1%" -#~ msgstr "" -#~ "Une erreur s'est produite pendant le traitement de la masterlist : %1%" - -#~ msgid "An error occurred while parsing the userlist: %1%" -#~ msgstr "Une erreur s'est produite pendant le traitement de l'userlist : %1%" - -#~ msgid "Version" -#~ msgstr "Version" - -#~ msgid "Filter content..." -#~ msgstr "Filtrer le contenu..." diff --git a/resources/l10n/ko/LC_MESSAGES/loot.po b/resources/l10n/ko/LC_MESSAGES/loot.po deleted file mode 100644 index 3d1ad7ad..00000000 --- a/resources/l10n/ko/LC_MESSAGES/loot.po +++ /dev/null @@ -1,956 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: LOOT v0.7\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-09 10:40-0000\n" -"PO-Revision-Date: 2015-01-18 13:26+0900\n" -"Last-Translator: SteamB23 \n" -"Language-Team: SteamB23 \n" -"Language: ko\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.7.1\n" -"X-Poedit-KeywordsList: translate:1,1t;translate:1c,2,t\n" -"X-Poedit-Basepath: ../../\n" -"X-Poedit-SourceCharset: UTF-8\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Poedit-SearchPath-0: src/backend\n" -"X-Poedit-SearchPath-1: src/gui\n" -"X-Poedit-SearchPath-2: resources/report/js\n" -"X-Poedit-SearchPathExcluded-0: resources/report/js/jed.js\n" -"X-Poedit-SearchPathExcluded-1: resources/report/js/marked.js\n" -"X-Poedit-SearchPathExcluded-2: resources/report/js/require.js\n" - -#: src/backend/game.cpp:347 -msgid "Invalid game ID supplied." -msgstr "잘못된 게임 ID가 제공되었습니다." - -#: src/backend/game.cpp:371 -msgid "Game path could not be detected." -msgstr "게임 경로를 감지 할 수 없습니다." - -#: src/backend/game.cpp:489 -msgid "" -"libloadorder failed to create a game handle. Details could not be fetched." -msgstr "" -"libloadorder가 게임 핸들을 만들지 못했습니다. 자세한 사항은 가져올 수 없습니" -"다." - -#: src/backend/game.cpp:493 -msgid "libloadorder failed to create a game handle. Details:" -msgstr "libloadorder가 게임 핸들을 만들지 못했습니다. 자세한 사항:" - -#: src/backend/game.cpp:510 -msgid "" -"libloadorder failed to initialise game master file support. Details could " -"not be fetched." -msgstr "" -"libloadorder가 게임 마스터 파일 지원을 초기화하지 못했습니다. 자세한 사항은 " -"가져올 수 없습니다." - -#: src/backend/game.cpp:514 -msgid "libloadorder failed to initialise game master file support. Details:" -msgstr "" -"libloadorder가 게임 마스터 파일 지원을 초기화하지 못했습니다. 자세한 사항:" - -#: src/backend/game.cpp:534 -msgid "" -"libloadorder failed to get the active plugins list. Details could not be " -"fetched." -msgstr "" -"libloadorder가 활성 플러그인 목록을 가져오지 못했습니다. 자세한 사항은 가져" -"올 수 없습니다." - -#: src/backend/game.cpp:538 -msgid "libloadorder failed to get the active plugins list. Details:" -msgstr "libloadorder가 활성 플러그인 목록을 가져오지 못했습니다. 자세한 사항:" - -#: src/backend/game.cpp:567 -msgid "" -"libloadorder failed to get the load order. Details could not be fetched." -msgstr "" -"libloadorder가 로드 순서를 가져오지 못했습니다. 자세한 사항은 가져올 수 없습" -"니다." - -#: src/backend/game.cpp:571 -msgid "libloadorder failed to get the load order. Details:" -msgstr "libloadorder가 로드 순서를 가져오지 못했습니다. 자세한 사항:" - -#: src/backend/game.cpp:593 -msgid "" -"libloadorder failed to set the load order. Details could not be fetched." -msgstr "" -"libloadorder가 로드 순서를 설정하지 못했습니다. 자세한 사항은 가져올 수 없습" -"니다." - -#: src/backend/game.cpp:597 -msgid "libloadorder failed to set the load order. Details:" -msgstr "libloadorder가 로드 순서를 설정하지 못했습니다. 자세한 사항:" - -#: src/backend/game.cpp:701 -msgid "An exception occurred while loading this plugin. Details: " -msgstr "이 플러그인을 로드하는 동안 예외가 발생했습니다. 자세한 사항: " - -#: src/backend/game.cpp:719 -msgid "An exception occurred while loading this plugin. Details:" -msgstr "이 플러그인을 로드하는 동안 예외가 발생했습니다. 자세한 사항:" - -#: src/backend/game.cpp:779 -msgid "Could not create LOOT folder for game. Details:" -msgstr "게임에 대한 LOOT폴더를 생성할 수 없습니다. 자세한 사항:" - -#: src/backend/game.cpp:787 -msgid "Building plugin graph..." -msgstr "플러그인 그래프 빌드 중..." - -#: src/backend/game.cpp:813 src/gui/handler.cpp:968 -msgid "\"%1%\" contains a condition that could not be evaluated. Details: %2%" -msgstr "\"%1%\"에는 평가될 수 없는 조건이 포함되어 있습니다. 자세한 사항: %2%" - -#: src/backend/game.cpp:823 -msgid "Adding edges to plugin graph and performing topological sort..." -msgstr "플러그인 그래프에 엣지를 추가하고 위상 정렬을 수행 중..." - -#: src/backend/git.cpp:132 -msgid "Git operation failed. Error: %1%" -msgstr "Git 작업이 실패했습니다. 오류: %1%" - -#: src/backend/git.cpp:179 -msgid "Object memory already allocated!" -msgstr "개체 메모리는 이미 할당되어있습니다!" - -#: src/backend/git.cpp:183 -msgid "Tree memory already allocated!" -msgstr "계층 트리 메모리는 이미 할당되어있습니다!" - -#: src/backend/git.cpp:187 -msgid "Diff memory already allocated!" -msgstr "차분 메모리는 이미 할당되어있습니다!" - -#: src/backend/git.cpp:191 -msgid "Repository handle not open!" -msgstr "저장소 핸들을 열 수 없습니다!" - -#: src/backend/git.cpp:222 -msgid "Unknown: Git repository missing" -msgstr "알 수 없음: Git 저장소 누락" - -#: src/backend/git.cpp:226 -msgid "N/A: No masterlist present" -msgstr "N/A: 마스터 리스트가 존재하지 않음" - -#: src/backend/git.cpp:231 -msgid "" -"An error occurred while trying to read the local masterlist's version. If " -"this error happens again, try deleting the \".git\" folder in %1%." -msgstr "" -"로컬 마스터 리스트의 버전을 읽는 동안 오류가 발생했습니다. 이 오류가 다시 발" -"생한다면 %1%에서 \".git\" 폴더를 삭제하십시오." - -#: src/backend/git.cpp:264 src/backend/git.cpp:265 -msgid "(edited)" -msgstr "(편집됨)" - -#: src/backend/git.cpp:294 -msgid "" -"An error occurred while trying to clone the remote masterlist repository." -msgstr "원격 마스터 리스트 저장소를 복재하는 동안 오류가 발생했습니다." - -#: src/backend/git.cpp:350 src/backend/git.cpp:383 -msgid "" -"An error occurred while trying to access the local masterlist repository. If " -"this error happens again, try deleting the \".git\" folder in %1%." -msgstr "" -"로컬 마스터 리스트 저장소에 저장하는 동안 오류가 발생했습니다. 이 오류가 다" -"시 발생한다면 %1%에서 \".git\" 폴더를 삭제하십시오." - -#: src/backend/git.cpp:374 -msgid "" -"An error occurred while trying to update the masterlist. This could be due " -"to a server-side error. Try again in a few minutes." -msgstr "" -"마스터 리스트를 갱신하는 동안 오류가 발생했습니다. 이것은 서버 측의 오류로 인" -"한 것일 수도 있습니다. 잠시 후에 다시 시도하십시오." - -#: src/backend/git.cpp:517 -msgid "" -"An error occurred while trying to read information on the updated " -"masterlist. If this error happens again, try deleting the \".git\" folder in " -"%1%." -msgstr "" -"갱신된 마스터 리스트에 대한 정보를 읽는 동안 오류가 발생했습니다. 이 오류가 " -"다시 발생한다면 %1%에서 \".git\" 폴더를 삭제하십시오." - -#: src/backend/git.cpp:587 -msgid "Masterlist revision" -msgstr "마스터 리스트 버전" - -#: src/backend/git.cpp:587 -msgid "Rolled back to the previous revision." -msgstr "이전 버전으로 되돌립니다." - -#: src/backend/graph.cpp:77 -msgid "" -"Cyclic interaction detected between plugins \"%1%\" and \"%2%\". Back cycle: " -"%3%" -msgstr "" -"\"%1%\"와 \"%2%\"플러그인 사이의 순환 참조를 검출합니다. 순환 주기: %3%" - -#: src/backend/helpers.cpp:153 -msgid "Unable to open \"%1%\" for CRC calculation." -msgstr "CRC 연산을 위해 \"%1%\"을 열 수 없습니다." - -#: src/backend/metadata.cpp:146 src/backend/metadata.cpp:178 -msgid "Failed to parse condition \"%1%\": %2%" -msgstr "\"%1%\"조건을 구문 분석하지 못했습니다: %2%" - -#: src/backend/metadata.cpp:151 src/backend/metadata.cpp:183 -msgid "Failed to parse condition \"%1%\"." -msgstr "\"%1%\"조건을 구문 분석하지 못했습니다." - -#: src/backend/metadata.cpp:457 -msgid "Cannot read \"%1%\". Details: %2%" -msgstr "\"%1%\"을 읽을 수 없습니다. 자세한 사항: %2%" - -#: src/backend/metadata.cpp:882 src/backend/metadata.cpp:893 -msgid "This plugin requires \"%1%\" to be installed, but it is missing." -msgstr "이 플러그인은 \"%1%\"가 설치되어야 하지만 찾을 수 없습니다." - -#: src/backend/metadata.cpp:886 -msgid "This plugin requires \"%1%\" to be active, but it is inactive." -msgstr "이 플러그인은 \"%1%\"가 활성화되어야 하지만 비활성화되어있습니다." - -#: src/backend/metadata.cpp:901 -msgid "This plugin is incompatible with \"%1%\", but both are present." -msgstr "이 플러그인은 \"%1%\"와 호환되지 않지만 양쪽 모두 존재합니다." - -#: src/backend/metadata.cpp:910 -msgid "" -"Contains %1% ITM records, %2% deleted references and %3% deleted navmeshes. " -"Clean with %4%." -msgstr "" -"%1%개의 ITM 레코드, %2%개의 삭제된 참조와 %3%개의 삭제된 Navmesh가 포함되어있" -"습니다. %4%를 사용하여 청소하십시오." - -#: src/backend/metadata.cpp:912 -msgid "Clean with %1%." -msgstr "%1%를 사용하여 청소하십시오." - -#: src/backend/metadata.cpp:915 -msgid "" -"Contains %1% deleted references and %2% deleted navmeshes. Clean with %3%." -msgstr "" -"%1%개의 삭제된 참조와 %2%개의 삭제된 Navmesh가 포함되어있습니다. %3%를 사용하" -"여 청소하십시오." - -#: src/backend/metadata.cpp:917 -msgid "Contains %1% deleted navmeshes. Clean with %2%." -msgstr "" -"%1%개의 삭제된 navmesh가 포함되어있습니다. %2%를 사용하여 청소하십시오." - -#: src/backend/metadata.cpp:919 -msgid "Contains %1% deleted references. Clean with %2%." -msgstr "%1%개의 삭제된 참조가 포함되어있습니다. %2%를 사용하여 청소하십시오." - -#: src/backend/metadata.cpp:922 -msgid "Contains %1% ITM records and %2% deleted navmeshes. Clean with %3%." -msgstr "" -"%1%개의 ITM 레코드와 %2%개의 삭제된 Navmesh가 포함되어있습니다. %3%를 사용하" -"여 청소하십시오." - -#: src/backend/metadata.cpp:924 -msgid "Contains %1% ITM records. Clean with %2%." -msgstr "%1%개의 ITM 레코드가 포함되어있습니다. %2%를 사용하여 청소하십시오." - -#: src/backend/metadata.cpp:927 -msgid "Contains %1% ITM records and %2% deleted references. Clean with %3%." -msgstr "" -"%1%개의 ITM 레코드와 %2%개의 삭제된 참조가 포함되어있습니다. %3%를 사용하여 " -"청소하십시오." - -#: src/gui/app.cpp:174 -msgid "Error: Could not create LOOT settings file. %1%" -msgstr "오류: LOOT 설정 파일을 만들 수 없습니다. %1%" - -#: src/gui/app.cpp:184 -msgid "Error: Settings parsing failed. %1%" -msgstr "오류: 설정의 구문 분석을 하지 못했습니다. %1%" - -#: src/gui/app.cpp:249 -msgid "Error: Games' settings parsing failed. %1%" -msgstr "오류: 게임 설정의 구문 분석을 하지 못했습니다. %1%" - -#: src/gui/app.cpp:269 -msgid "Error: Game-specific settings could not be initialised. %1%" -msgstr "오류: 게임별 설정을 초기화 할 수 없습니다. %1%" - -#: src/gui/app.cpp:410 -msgid "None of the supported games were detected." -msgstr "지원되는 게임 중 어느 것도 감지되지 않았습니다." - -#: src/gui/handler.cpp:226 src/gui/handler.cpp:230 -msgid "Failed to change game. Details: %1%" -msgstr "게임을 변경하지 못했습니다. 자세한 사항: %1%" - -#: src/gui/handler.cpp:247 src/gui/handler.cpp:251 src/gui/handler.cpp:328 -#: src/gui/handler.cpp:332 -msgid "Failed to copy plugin metadata. Details: %1%" -msgstr "플러그인 메타데이터를 복사하지 못했습니다. 자세한 사항: %1%" - -#: src/gui/handler.cpp:347 src/gui/handler.cpp:907 -msgid "Loading plugin contents..." -msgstr "플러그인 내용 로드 중..." - -#: src/gui/handler.cpp:351 -msgid "Checking for conflicting plugins..." -msgstr "플러그인 충돌에 대해 확인중..." - -#: src/gui/handler.cpp:518 src/gui/handler.cpp:526 -msgid "Shell execute failed." -msgstr "명령을 실행하지 못했습니다." - -#: src/gui/handler.cpp:584 -msgid "Loading plugin headers..." -msgstr "플러그인 헤더 로드 중..." - -#: src/gui/handler.cpp:610 -msgid "Parsing masterlist..." -msgstr "마스터 리스트 구문 분석 중..." - -#: src/gui/handler.cpp:616 -msgid "An error occurred while parsing the masterlist: %1%" -msgstr "마스터 리스트를 구문 분석하는 동안 오류가 발생했습니다: %1%" - -#: src/gui/handler.cpp:622 -msgid "Parsing userlist..." -msgstr "유저리스트 구문 분석 중..." - -#: src/gui/handler.cpp:628 -msgid "An error occurred while parsing the userlist: %1%" -msgstr "유저리스트를 구문 분석하는 동안 오류가 발생했습니다: %1%" - -#: src/gui/handler.cpp:653 -msgid "Merging and evaluating plugin metadata..." -msgstr "플러그인 메타데이터를 병합 및 평가 중..." - -#: src/gui/handler.cpp:718 -msgid "Loading general messages..." -msgstr "일반 메시지 로드 중..." - -#: src/gui/handler.cpp:742 src/gui/handler.cpp:848 -msgid "" -"A global message contains a condition that could not be evaluated. Details: " -"%1%" -msgstr "" -"전역 메세지에는 평가될 수 없는 조건이 포함되어 있습니다. 자세한 사항: %1%" - -#: src/gui/handler.cpp:752 src/gui/handler.cpp:756 -msgid "Failed to get game data. Details: %1%" -msgstr "게임 데이터를 가져오지 못했습니다. 자세한 사항: %1%" - -#: src/gui/handler.cpp:775 -msgid "Updating and parsing masterlist..." -msgstr "마스터 리스트 갱신 및 구문 분석 중..." - -#: src/gui/handler.cpp:791 -msgid "Regenerating displayed content..." -msgstr "표시되는 내용을 재생성 중..." - -#: src/gui/handler.cpp:861 src/gui/handler.cpp:865 -msgid "Failed to update the masterlist. Details: %1%" -msgstr "마스터 리스트를 갱신하지 못했습니다. 자세한 사항: %1%" - -#: src/gui/handler.cpp:941 -msgid "Failed to sort plugins. Details: %1%" -msgstr "플러그인을 정렬하지 못했습니다. 자세한 사항: %1%" - -#: src/backend/parsers.h:553 src/backend/parsers.h:645 -msgid "Invalid file path:" -msgstr "잘못된 파일 경로:" - -#: src/backend/parsers.h:607 -msgid "Invalid folder path:" -msgstr "잘못된 폴더 경로:" - -#: src/backend/parsers.h:625 -msgid "Invalid regex string:" -msgstr "잘못된 정규식 문자열:" - -#: src/backend/parsers.h:727 -msgid "Expected \"%1%\" at \"%2%\"." -msgstr "\"%1%\"에서 \"%2%\"가 예상됩니다." - -#: resources/report/js/filters.js:121 -msgid "Do not clean" -msgstr "청소 금지" - -#: resources/report/js/l10n.js:61 resources/report/js/l10n.js:80 -msgid "Active Plugin" -msgstr "활성화된 플러그인" - -#: resources/report/js/l10n.js:62 resources/report/js/l10n.js:289 -msgid "Master File" -msgstr "마스터 파일" - -#: resources/report/js/l10n.js:63 resources/report/js/l10n.js:81 -msgid "Empty Plugin" -msgstr "빈 플러그인" - -#: resources/report/js/l10n.js:64 resources/report/js/l10n.js:82 -#: resources/report/js/l10n.js:139 -msgid "Loads BSA" -msgstr "BSA 로드" - -#: resources/report/js/l10n.js:65 resources/report/js/l10n.js:140 -msgid "Has User Metadata" -msgstr "사용자 메타데이터를 가짐" - -#: resources/report/js/l10n.js:67 -msgid "Show Only Conflicts" -msgstr "충돌만 보기" - -#: resources/report/js/l10n.js:68 -msgid "Edit Metadata" -msgstr "메타데이터 편집" - -#: resources/report/js/l10n.js:69 -msgid "Copy Metadata" -msgstr "메타데이터 복사" - -#: resources/report/js/l10n.js:70 -msgid "Clear User Metadata" -msgstr "유저 데이터 삭제" - -#: resources/report/js/l10n.js:84 -msgid "Enable Edits" -msgstr "편집 사용" - -#: resources/report/js/l10n.js:85 -msgid "" -"Global priorities are compared against all other plugins. Normal priorities " -"are compared against only conflicting plugins." -msgstr "" -"전역 우선 순위는 다른 모든 플러그인에 대해 비교됩니다. 일반 우선 순위는 충돌" -"하는 플러그인과 비교됩니다." - -#: resources/report/js/l10n.js:86 resources/report/js/l10n.js:138 -msgid "Global Priority" -msgstr "전역 우선 순위" - -#: resources/report/js/l10n.js:87 -msgid "Priority Value" -msgstr "우선 순위 값" - -#: resources/report/js/l10n.js:89 -msgid "Main" -msgstr "메인" - -#: resources/report/js/l10n.js:90 -msgid "Load After" -msgstr "선행 로드" - -#: resources/report/js/l10n.js:91 -msgid "Requirements" -msgstr "요구 사항" - -#: resources/report/js/l10n.js:92 -msgid "Incompatibilities" -msgstr "비호환성" - -#: resources/report/js/l10n.js:93 -msgid "Messages" -msgstr "메시지" - -#: resources/report/js/l10n.js:94 -msgid "Bash Tags" -msgstr "배쉬 태그" - -#: resources/report/js/l10n.js:95 -msgid "Dirty Info" -msgstr "지저분한 정보" - -#: resources/report/js/l10n.js:96 -msgid "Locations" -msgstr "위치" - -#: resources/report/js/l10n.js:98 resources/report/js/l10n.js:102 -#: resources/report/js/l10n.js:106 -msgid "Filename" -msgstr "파일 이름" - -#: resources/report/js/l10n.js:99 resources/report/js/l10n.js:103 -#: resources/report/js/l10n.js:107 -msgid "Display Name" -msgstr "표시되는 이름" - -#: resources/report/js/l10n.js:100 resources/report/js/l10n.js:104 -#: resources/report/js/l10n.js:108 resources/report/js/l10n.js:112 -#: resources/report/js/l10n.js:117 -msgid "Condition" -msgstr "상태" - -#: resources/report/js/l10n.js:110 -msgid "Type" -msgstr "형식" - -#: resources/report/js/l10n.js:111 -msgid "Content" -msgstr "내용" - -#: resources/report/js/l10n.js:113 resources/report/js/l10n.js:277 -msgid "Language" -msgstr "언어" - -#: resources/report/js/l10n.js:115 -msgid "Add/Remove" -msgstr "추가/제거" - -#: resources/report/js/l10n.js:116 -msgid "Bash Tag" -msgstr "배쉬 태그" - -#: resources/report/js/l10n.js:119 -msgid "CRC" -msgstr "CRC" - -#: resources/report/js/l10n.js:120 -msgid "ITM Count" -msgstr "ITM 개수" - -#: resources/report/js/l10n.js:121 -msgid "Deleted References" -msgstr "삭제된 참조" - -#: resources/report/js/l10n.js:122 -msgid "Deleted Navmeshes" -msgstr "삭제된 Navmesh" - -#: resources/report/js/l10n.js:123 -msgid "Cleaning Utility" -msgstr "청소 유틸리티" - -#: resources/report/js/l10n.js:125 -msgid "URL" -msgstr "URL" - -#: resources/report/js/l10n.js:126 -msgid "Version" -msgstr "버전" - -#: resources/report/js/l10n.js:128 resources/report/js/l10n.js:225 -#: resources/report/js/l10n.js:299 -msgid "Apply" -msgstr "적용" - -#: resources/report/js/l10n.js:129 resources/report/js/l10n.js:226 -#: resources/report/js/l10n.js:300 resources/report/js/script.js:418 -msgid "Cancel" -msgstr "취소" - -#: resources/report/js/l10n.js:149 -msgid "A filename is required." -msgstr "파일 이름이 필요합니다." - -#: resources/report/js/l10n.js:150 resources/report/js/l10n.js:163 -#: resources/report/js/l10n.js:175 resources/report/js/l10n.js:189 -#: resources/report/js/l10n.js:199 resources/report/js/l10n.js:210 -msgid "Delete Row" -msgstr "행 삭제" - -#: resources/report/js/l10n.js:159 -msgid "Note" -msgstr "노트" - -#: resources/report/js/l10n.js:160 -msgid "Warning" -msgstr "경고" - -#: resources/report/js/l10n.js:161 resources/report/js/script.js:346 -msgid "Error" -msgstr "오류" - -#: resources/report/js/l10n.js:162 -msgid "A content string is required." -msgstr "내용 문자열이 필요합니다." - -#: resources/report/js/l10n.js:172 -msgid "Add" -msgstr "추가" - -#: resources/report/js/l10n.js:173 -msgid "Remove" -msgstr "제거" - -#: resources/report/js/l10n.js:174 resources/report/js/l10n.js:208 -msgid "A name is required." -msgstr "이름이 필요합니다." - -#: resources/report/js/l10n.js:184 -msgid "A CRC is required." -msgstr "CRC가 필요합니다." - -#: resources/report/js/l10n.js:185 resources/report/js/l10n.js:186 -#: resources/report/js/l10n.js:187 -msgid "Values must be integers." -msgstr "값은 정수여야 합니다." - -#: resources/report/js/l10n.js:188 -msgid "A utility name is required." -msgstr "유틸리티 이름이 필요합니다." - -#: resources/report/js/l10n.js:198 -msgid "A link is required." -msgstr "링크가 필요합니다." - -#: resources/report/js/l10n.js:209 -msgid "A folder is required." -msgstr "폴더가 필요합니다." - -#: resources/report/js/l10n.js:219 resources/report/js/l10n.js:297 -msgid "Add New Row" -msgstr "새 행 추가" - -#: resources/report/js/l10n.js:222 -msgid "Jump To General Information" -msgstr "일반 정보로 이동" - -#: resources/report/js/l10n.js:223 -msgid "Sort Plugins" -msgstr "플러그인 정렬" - -#: resources/report/js/l10n.js:224 -msgid "Update Masterlist" -msgstr "마스터 리스트 갱신" - -#: resources/report/js/l10n.js:229 -msgid "Redate Plugins" -msgstr "플러그인 날짜 변경" - -#: resources/report/js/l10n.js:230 -msgid "Open Debug Log Location" -msgstr "디버그 로그 위치 열기" - -#: resources/report/js/l10n.js:231 -msgid "Clear All User Metadata" -msgstr "유저 메타데이터 모두 삭제" - -#: resources/report/js/l10n.js:232 -msgid "Copy Content" -msgstr "내용 복사" - -#: resources/report/js/l10n.js:233 -msgid "Refresh Content" -msgstr "내용 새로고침" - -#: resources/report/js/l10n.js:234 -msgid "View Documentation" -msgstr "문서 보기" - -#: resources/report/js/l10n.js:235 -msgid "About" -msgstr "정보" - -#: resources/report/js/l10n.js:236 resources/report/js/l10n.js:269 -msgid "Settings" -msgstr "설정" - -#: resources/report/js/l10n.js:237 resources/report/js/script.js:808 -msgid "Quit" -msgstr "종료" - -#: resources/report/js/l10n.js:240 -msgid "Plugins" -msgstr "플러그인" - -#: resources/report/js/l10n.js:241 -msgid "Filters" -msgstr "필터" - -#: resources/report/js/l10n.js:242 -msgid "Press Enter or click outside the input to set the filter." -msgstr "필터를 설정하기 위해 Enter를 누르거나 바깥 쪽을 클릭하십시오." - -#: resources/report/js/l10n.js:243 -msgid "Filter content..." -msgstr "필터링할 콘텐츠..." - -#: resources/report/js/l10n.js:246 -msgid "Hide version numbers" -msgstr "버전 번호 숨기기" - -#: resources/report/js/l10n.js:247 -msgid "Hide CRCs" -msgstr "CRC 숨기기" - -#: resources/report/js/l10n.js:248 -msgid "Hide Bash Tags" -msgstr "배쉬 태그 숨기기" - -#: resources/report/js/l10n.js:249 -msgid "Hide notes" -msgstr "노트 숨기기" - -#: resources/report/js/l10n.js:250 -msgid "Hide 'Do not clean' messages" -msgstr "'청소 금지'메시지 숨기기" - -#: resources/report/js/l10n.js:251 -msgid "Hide all plugin messages" -msgstr "모든 플러그인 메시지 숨기기" - -#: resources/report/js/l10n.js:252 -msgid "Hide inactive plugins" -msgstr "비활성 플러그인 숨기기" - -#: resources/report/js/l10n.js:253 -msgid "Hide messageless plugins" -msgstr "메시지 적은 플러그인 숨기기" - -#: resources/report/js/l10n.js:254 -msgid "Hidden plugins:" -msgstr "숨겨진 플러그인:" - -#: resources/report/js/l10n.js:255 -msgid "Hidden messages:" -msgstr "숨겨진 메시지:" - -#: resources/report/js/l10n.js:258 -msgid "General Information" -msgstr "일반 정보" - -#: resources/report/js/l10n.js:259 -msgid "Masterlist Revision" -msgstr "마스터 리스트 버전" - -#: resources/report/js/l10n.js:260 -msgid "Masterlist Date" -msgstr "마스터 리스트 일자" - -#: resources/report/js/l10n.js:261 -msgid "Warnings" -msgstr "경고" - -#: resources/report/js/l10n.js:262 -msgid "Errors" -msgstr "오류" - -#: resources/report/js/l10n.js:263 -msgid "Total Messages" -msgstr "전체 메시지" - -#: resources/report/js/l10n.js:264 -msgid "Active Plugins" -msgstr "활성화된 플러그인" - -#: resources/report/js/l10n.js:265 -msgid "Dirty Plugins" -msgstr "지저분한 플러그인" - -#: resources/report/js/l10n.js:266 -msgid "Total Plugins" -msgstr "전체 플러그인" - -#: resources/report/js/l10n.js:272 -msgid "Default Game" -msgstr "기본 게임" - -#: resources/report/js/l10n.js:273 resources/report/js/l10n.js:275 -msgid "Autodetect" -msgstr "자동 감지" - -#: resources/report/js/l10n.js:278 -msgid "Language changes will be applied after LOOT is restarted." -msgstr "LOOT가 다시 시작 된후 언어 변경이 적용됩니다." - -#: resources/report/js/l10n.js:280 -msgid "Enable debug logging" -msgstr "디버그 로깅 사용" - -#: resources/report/js/l10n.js:281 -msgid "The output is logged to the LOOTDebugLog.txt file." -msgstr "출력은 LOOTDebugLog.txt 파일에 기록됩니다." - -#: resources/report/js/l10n.js:283 -msgid "Update masterlist before sorting" -msgstr "정렬하기 전에 마스터 리스트 갱신" - -#: resources/report/js/l10n.js:286 -msgid "Name" -msgstr "이름" - -#: resources/report/js/l10n.js:287 -msgid "Base Game" -msgstr "기반 게임" - -#: resources/report/js/l10n.js:288 -msgid "LOOT Folder" -msgstr "LOOT 폴더" - -#: resources/report/js/l10n.js:290 -msgid "Masterlist Repository URL" -msgstr "마스터 리스트 저장소 URL" - -#: resources/report/js/l10n.js:291 -msgid "Masterlist Repository Branch" -msgstr "마스터 리스트 저장소 브랜치" - -#: resources/report/js/l10n.js:292 -msgid "Install Path" -msgstr "설치 경로" - -#: resources/report/js/l10n.js:293 -msgid "Install Path Registry Key" -msgstr "설치 경로 레지스트리 키" - -#: resources/report/js/l10n.js:304 -msgid "First-Time Tips" -msgstr "처음 팁" - -#: resources/report/js/l10n.js:306 -msgid "" -"CRCs are only displayed after plugins have been loaded, either by conflict " -"filtering, or by sorting." -msgstr "CRC는 플러그인이 로드된후 충돌 필터링이나 정렬 중에서 표시됩니다." - -#: resources/report/js/l10n.js:307 -msgid "" -"Double-click a plugin in the sidebar to quickly open its metadata editor. " -"Multiple metadata editors can be opened at once." -msgstr "" -"사이드바에서 플러그인을 두번 클릭하여 빠르게 메타데이터 편집기를 엽니다. 메타" -"데이터 편집기는 한번에 여러개를 열 수 있습니다." - -#: resources/report/js/l10n.js:308 -msgid "" -"Plugins can be drag and dropped from the sidebar into editors' \"load after\", " -"\"requirements\" and \"incompatibility\" tables." -msgstr "" -"플러그인은 사이드바에서 편집기로 '선행 로드', 요구 사항', '비호환성'테이블" -"을 끌어다 놓을 수 있습니다." - -#: resources/report/js/l10n.js:309 -msgid "" -"Some features are disabled while there is an editor open, or while there is " -"a sorted load order that has not been applied or discarded." -msgstr "" -"편집기가 열렸을 때는 일부 기능을 사용하거나 정렬된 로드 순서를 적용 또는 폐기" -"할 수 없습니다." - -#: resources/report/js/l10n.js:310 -msgid "" -"Many interface elements have tooltips. If you don't know what something is, " -"try hovering your mouse over it to find out. Otherwise, LOOT's documentation " -"can be accessed through the main menu." -msgstr "" -"대부분의 인터페이스 요소는 툴팁이 있습니다. 무엇인지 알 수 없을 때 에는 마우" -"스를 올려 찾을 수 있습니다. 그래도 알 수 없다면 메인 메뉴를 통해 LOOT의 문서" -"에 접근할 수 있습니다." - -#: resources/report/js/l10n.js:312 resources/report/js/script.js:424 -msgid "OK" -msgstr "확인" - -#: resources/report/js/script.js:209 resources/report/js/script.js:214 -msgid "N/A" -msgstr "N/A" - -#: resources/report/js/script.js:383 -msgid "Checking if plugins have been loaded..." -msgstr "플러그인이 로드되었는지 확인 중..." - -#: resources/report/js/script.js:438 -msgid "Loading game data..." -msgstr "게임 데이터 로드 중..." - -#: resources/report/js/script.js:508 -#, javascript-format -msgid "Masterlist updated to revision %s." -msgstr "마스터 리스트를 %s버전으로 갱신되었습니다." - -#: resources/report/js/script.js:510 -msgid "No masterlist update was necessary." -msgstr "마스터 리스트를 갱신할 필요가 없었습니다." - -#: resources/report/js/script.js:515 -msgid "Updating masterlist..." -msgstr "마스터 리스트 갱신 중..." - -#: resources/report/js/script.js:545 -msgid "Sorting plugins..." -msgstr "플러그인 정렬 중..." - -#: resources/report/js/script.js:647 -msgid "Redate Plugins?" -msgstr "플러그인 날짜를 변경할까요?" - -#: resources/report/js/script.js:647 -msgid "" -"This feature is provided so that modders using the Creation Kit may set the " -"load order it uses. A side-effect is that any subscribed Steam Workshop mods " -"will be re-downloaded by Steam. Do you wish to continue?" -msgstr "" -"이 기능은 모더가 크리에이션 킷을 사용해 로드 순서를 설정할 수 있도록 제공합니" -"다. 부작용으로 모든 구독된 스팀 워크샵 모드들을 다시 다운로드할 것입니다. 계" -"속하시겠습니까?" - -#: resources/report/js/script.js:647 -msgid "Redate" -msgstr "날짜 변경" - -#: resources/report/js/script.js:656 -msgid "" -"Are you sure you want to clear all existing user-added metadata from all " -"plugins?" -msgstr "" -"모든 플러그인에서 기존의 모든 사용자 추가 메타데이터를 삭제하시겠습니까?" - -#: resources/report/js/script.js:656 resources/report/js/script.js:961 -msgid "Clear" -msgstr "삭제" - -#: resources/report/js/script.js:677 -msgid "All user-added metadata has been cleared." -msgstr "모든 사용자 추가 메타데이터가 삭제되었습니다." - -#: resources/report/js/script.js:734 -msgid "LOOT's content has been copied to the clipboard." -msgstr "LOOT의 내용이 클립보드에 복사되었습니다." - -#: resources/report/js/script.js:808 -#, javascript-format -msgid "" -"You have not yet applied or cancelled your %s. Are you sure you want to quit?" -msgstr "아직 %s을/를 적용하거나 취소하지 않았습니다. 종료하시겠습니까?" - -#: resources/report/js/script.js:957 -#, javascript-format -msgid "The metadata for \"%s\" has been copied to the clipboard." -msgstr "\"%s\"에 대한 메타데이터가 클립보드에 복사되었습니다." - -#: resources/report/js/script.js:961 -#, javascript-format -msgid "" -"Are you sure you want to clear all existing user-added metadata from \"%s\"?" -msgstr "\"%s\"에서 기존의 모든 사용자 추가 메타데이터를 삭제하시겠습니까?" - -#: resources/report/js/script.js:986 -#, javascript-format -msgid "The user-added metadata for \"%s\" has been cleared." -msgstr "\"%s\"에 대한 사용자 추가 메타데이터가 삭제되었습니다." - -#: resources/report/js/script.js:1006 -msgid "sorted load order" -msgstr "정렬된 로드 순서" - -#: resources/report/js/script.js:1008 -msgid "metadata edits" -msgstr "메타데이터 편집" - -#: resources/report/js/script.js:1074 -msgid "unknown" -msgstr "알 수 없음" - -#: resources/report/js/script.js:1215 -msgid "Refreshing data..." -msgstr "데이터 새로 고침 중..." diff --git a/resources/l10n/pl/LC_MESSAGES/loot.po b/resources/l10n/pl/LC_MESSAGES/loot.po deleted file mode 100644 index a7ef07ad..00000000 --- a/resources/l10n/pl/LC_MESSAGES/loot.po +++ /dev/null @@ -1,1076 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: BOSS v3.0.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-02-19 19:26-0000\n" -"PO-Revision-Date: 2014-11-02 13:07-0000\n" -"Last-Translator: Łukasz Niemczyk \n" -"Language-Team: \n" -"Language: pl_PL\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.6.10\n" -"X-Poedit-KeywordsList: translate:1,1t;translate:1c,2,t\n" -"X-Poedit-Basepath: ../../src\n" -"X-Poedit-SourceCharset: UTF-8\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2);\n" -"X-Poedit-SearchPath-0: backend\n" -"X-Poedit-SearchPath-1: gui\n" - -#: backend/game.cpp:98 -msgid "Invalid game ID supplied." -msgstr "Błędny ID gry." - -#: backend/game.cpp:158 -msgid "Game path could not be detected." -msgstr "Nie wykryto ścieżki do gry." - -#: backend/game.cpp:261 backend/game.cpp:342 backend/game.cpp:418 -msgid "" -"libloadorder failed to create a game handle. Details could not be fetched." -msgstr "" -"libloader nie zdołał zainicjować operatora gry. Szczegóły nie zostały " -"załadowane." - -#: backend/game.cpp:265 backend/game.cpp:346 backend/game.cpp:422 -msgid "libloadorder failed to create a game handle. Details:" -msgstr "libloader nie zdołał zainicjować operatora gry. Szczegóły:" - -#: backend/game.cpp:280 backend/game.cpp:361 backend/game.cpp:436 -msgid "" -"libloadorder failed to initialise game master file support. Details could " -"not be fetched." -msgstr "" -"libloadorder nie zdołał uruchomić wsparcia dla głównego pliku gry. Szczegóły " -"nie są dostępne." - -#: backend/game.cpp:284 backend/game.cpp:365 backend/game.cpp:440 -msgid "libloadorder failed to initialise game master file support. Details:" -msgstr "" -"libloadorder nie zdołał uruchomić wsparcia dla głównego pliku gry. Szczegóły:" - -#: backend/game.cpp:297 -msgid "" -"libloadorder failed to get the active plugins list. Details could not be " -"fetched." -msgstr "" -"libloadorder nie zdołał pobrać listy aktywnych wtyczek. Szczegóły nie są " -"dostępne." - -#: backend/game.cpp:301 -msgid "libloadorder failed to get the active plugins list. Details:" -msgstr "libloadorder nie zdołał pobrać listy aktywnych wtyczek. Szczegóły:" - -#: backend/game.cpp:378 backend/game.cpp:465 -msgid "" -"libloadorder failed to set the load order. Details could not be fetched." -msgstr "" -"libloadorder nie zdołał ustalić kolejności uruchamiania. Szczegóły nie są " -"dostępne." - -#: backend/game.cpp:382 -#, fuzzy -msgid "libloadorder failed to get the load order. Details:" -msgstr "libloadorder nie zdołał wyliczyć kolejności uruchamiania. Szczegóły:" - -#: backend/game.cpp:469 -msgid "libloadorder failed to set the load order. Details:" -msgstr "libloadorder nie zdołał ustawić kolejności uruchamiania. Szczegóły:" - -#: backend/game.cpp:489 -msgid "Could not create BOSS folder for game. Details:" -msgstr "Nie można utworzyć folderu BOSS dla gry. Szczegóły:" - -#: backend/graph.cpp:46 -msgid "Cyclic interaction detected between plugins \"%1%\" and \"%2%\"." -msgstr "" -"Wykryto zamknięte koło powiązań pomiędzy dodatkami \"%1%\" and \"%2%\"." - -#: backend/helpers.cpp:140 -msgid "Unable to open \"%1%\" for CRC calculation." -msgstr "Nie można otworzyć \"%1%\" by obliczyć CRC." - -#: backend/helpers.cpp:259 -msgid "None Specified" -msgstr "Brak wybranych" - -#: backend/metadata.cpp:142 -msgid "Failed to parse condition \"%1%\": %2%" -msgstr "Przetwarzanie warunku nieudane \"%1%\": %2%" - -#: backend/metadata.cpp:147 -msgid "Failed to parse condition \"%1%\"." -msgstr "Przetwarzanie warunku nieudane \"%1%\"." - -#: backend/metadata.cpp:708 backend/metadata.cpp:719 -msgid "This plugin requires \"%1%\" to be installed, but it is missing." -msgstr "Ta wtyczka wymaga \"%1%\", a jest niezainstalowany." - -#: backend/metadata.cpp:712 -msgid "This plugin requires \"%1%\" to be active, but it is inactive." -msgstr "Ta wtyczka wymaga aktywnego \"%1%\" a jest nieaktywny." - -#: backend/metadata.cpp:725 -msgid "This plugin is incompatible with \"%1%\", but both are present." -msgstr "Ta wtyczka jest niekompatybilna z \"%1%\" , a jest aktywna." - -#: backend/network.cpp:75 -msgid "Git operation failed. Error: %1%" -msgstr "Operacja na Git nie udana. Błąd: %1%" - -#: backend/network.cpp:313 -msgid "Masterlist revision" -msgstr "Wersja Bazy Danych" - -#: backend/network.cpp:313 -msgid "Rolled back to the previous revision." -msgstr "Przywrócono poprzednią wersję." - -#: gui/editor.cpp:158 gui/editor.cpp:325 gui/editor.cpp:463 -msgid "" -"Please submit any edits made for reasons other than personal preference to " -"the BOSS team so that they may be included in the masterlist." -msgstr "" -"Prosimy o informacje o wszelkich nowościach i niezbędnych zmianach w " -"kolejności wtyczek kierować do ekipy BOSS, aby znalazły się w następnej " -"aktualizacji bazy danych." - -#: gui/editor.cpp:161 -msgid "Show only conflicting plugins" -msgstr "Pokaż tylko nikompatybilne wtyczki." - -#: gui/editor.cpp:167 gui/editor.cpp:846 -msgid "Remove Plugin" -msgstr "Usuń wtyczkę" - -#: gui/editor.cpp:170 -msgid "Plugin" -msgstr "Wtyczka" - -#: gui/editor.cpp:171 -msgid "Priority" -msgstr "Priorytet" - -#: gui/editor.cpp:173 gui/editor.cpp:517 gui/editor.cpp:521 gui/editor.cpp:525 -msgid "Filename" -msgstr "Nazwa pliku" - -#: gui/editor.cpp:174 gui/editor.cpp:518 gui/editor.cpp:522 gui/editor.cpp:526 -msgid "Display Name" -msgstr "Nazwa wyświetlana" - -#: gui/editor.cpp:175 gui/editor.cpp:519 gui/editor.cpp:523 gui/editor.cpp:527 -#: gui/editor.cpp:531 gui/misc.cpp:36 -msgid "Condition" -msgstr "Warunek" - -#: gui/editor.cpp:198 gui/editor.cpp:576 -msgid "Select a plugin to edit its load order metadata." -msgstr "Zaznacz wtyczkę aby edytować jej włąściwości." - -#: gui/editor.cpp:199 -msgid "" -"Drag and drop a plugin here to make the selected plugin load after it. The " -"\"Show only conflicting plugins\" checkbox must be checked." -msgstr "" -"Przenieś i upuść tutaj wtyczkę aby załadować zaznaczoną wtyczkę po niej. " -"Opcja \"Pokaż niekompatybilne wtyczki\" musi być wybrana." - -#: gui/editor.cpp:200 gui/editor.cpp:577 -msgid "" -"Plugins with higher priorities will load after plugins with smaller " -"priorities that they conflict with, unless one must explicitly load after " -"the other." -msgstr "" -"Wtyczki z większym priorytetem zostaną załadowane po wtyczkach z niższym " -"priorytetem, chyba że muszą być ładowane po określonej wtyczce." - -#: gui/editor.cpp:201 -msgid "" -"Filters the plugin list to only display plugins which can be loaded after " -"the currently selected plugin, and which either conflict with it, or, if it " -"loads a BSA, also load BSAs. Also enables drag and drop of plugins into the " -"Load After box." -msgstr "" -"Pokazuje listę wtyczek które mogą być załadowane po zaznaczonej wtyczce. " -"Pokazuje również wtyczki niekompatybilne, oraz ładujące BSA. Aktywuje opcję " -"\"Przenieś i upuść\"." - -#: gui/editor.cpp:202 -msgid "" -"Only newly-added plugins may be removed here. Use the metadata editor to " -"remove other user-added plugins." -msgstr "" -"Tylko nowe wtyczki mogą zostać z tąd usunięte. Do usunięcia pozostałych " -"tyczek użyj edytora." - -#: gui/editor.cpp:210 gui/editor.cpp:595 -msgid "Priority: " -msgstr "Priorytet:" - -#: gui/editor.cpp:214 gui/editor.cpp:509 -msgid "Load After" -msgstr "Załaduj po" - -#: gui/editor.cpp:488 -msgid "Enable User Changes" -msgstr "Zazwól na zmiany użytkownika" - -#: gui/editor.cpp:490 gui/editor.cpp:840 -msgid "Add File" -msgstr "Dodaj plik" - -#: gui/editor.cpp:491 gui/editor.cpp:841 -msgid "Edit File" -msgstr "Edytuj plik" - -#: gui/editor.cpp:492 gui/editor.cpp:842 -msgid "Remove File" -msgstr "Usuń plik" - -#: gui/editor.cpp:493 -msgid "Save Changes" -msgstr "Zapisz zmiany" - -#: gui/editor.cpp:494 -msgid "Cancel" -msgstr "Anuluj" - -#: gui/editor.cpp:507 -msgid "Requirements" -msgstr "Wymagania" - -#: gui/editor.cpp:508 -msgid "Incompatibilities" -msgstr "Niekompatybilne" - -#: gui/editor.cpp:510 -msgid "Messages" -msgstr "Wiadomości" - -#: gui/editor.cpp:511 -msgid "Bash Tags" -msgstr "Tagi Bash" - -#: gui/editor.cpp:512 -msgid "Dirty Info" -msgstr "Dane o dublach" - -#: gui/editor.cpp:515 -msgid "Plugins" -msgstr "Wtyczki" - -#: gui/editor.cpp:529 -msgid "Add/Remove" -msgstr "Dodaj/Usuń" - -#: gui/editor.cpp:530 -msgid "Bash Tag" -msgstr "Tag Bash" - -#: gui/editor.cpp:533 -msgid "CRC" -msgstr "CRC" - -#: gui/editor.cpp:534 -msgid "ITM Count" -msgstr "Liczba ITM" - -#: gui/editor.cpp:535 -msgid "UDR Count" -msgstr "Liczba UDR" - -#: gui/editor.cpp:536 -msgid "Deleted Navmesh Count" -msgstr "Liczba usuniętych Navmesh" - -#: gui/editor.cpp:537 -msgid "Cleaning Utility" -msgstr "Narzędzie czyszczące" - -#: gui/editor.cpp:540 -msgid "Copy Name" -msgstr "Kopiuj Nazwę" - -#: gui/editor.cpp:541 -msgid "Copy Metadata As Text" -msgstr "Kopiuj Metadane jako tekst" - -#: gui/editor.cpp:542 -msgid "Remove All User-Added Metadata" -msgstr "Usuń wszystkie informacje dodane przez użytkownika." - -#: gui/editor.cpp:578 -msgid "If unchecked, any user-added metadata will be ignored during sorting." -msgstr "Odznacz, aby pominąć dane użytkownika podczas sortowania." - -#: gui/editor.cpp:579 gui/editor.cpp:580 -msgid "Only user-added data may be removed." -msgstr "Tylko dane dodane przez użytkowników mogą zostać usunięte." - -#: gui/editor.cpp:812 -msgid "" -"Are you sure you want to clear all existing user-added metadata from this " -"plugin?" -msgstr "" -"Czy jesteś pewny że chcesz usunąć wszystkie informacje dodane przez " -"użytkownika o tej wtyczce?" - -#: gui/editor.cpp:813 gui/main.cpp:1065 -msgid "BOSS: Warning" -msgstr "BOSS: Ostrzeżenie" - -#: gui/editor.cpp:844 -msgid "Add Plugin" -msgstr "Dodaj wtyczkę" - -#: gui/editor.cpp:845 -msgid "Edit Plugin" -msgstr "Edytuj wtyczkę" - -#: gui/editor.cpp:848 -msgid "Add Message" -msgstr "Dodaj wiadomość" - -#: gui/editor.cpp:849 -msgid "Edit Message" -msgstr "Edytuj wiadomość" - -#: gui/editor.cpp:850 -msgid "Remove Message" -msgstr "Usuń wiadomość" - -#: gui/editor.cpp:852 -msgid "Add Bash Tag" -msgstr "Dodaj Tag Bash" - -#: gui/editor.cpp:853 -msgid "Edit Bash Tag" -msgstr "Edytuj Tag Bash" - -#: gui/editor.cpp:854 -msgid "Remove Bash Tag" -msgstr "Usuń Tag Bash" - -#: gui/editor.cpp:856 -msgid "Add Dirty Info" -msgstr "Dodaj dane o dublach" - -#: gui/editor.cpp:857 -msgid "Edit Dirty Info" -msgstr "Edytuj dane o dublach" - -#: gui/editor.cpp:858 -msgid "Remove Dirty Info" -msgstr "Usuń dane o dublach" - -#: gui/editor.cpp:876 -msgid "BOSS: Add File/Plugin" -msgstr "BOSS: Dodaj Plik/Wtyczkę" - -#: gui/editor.cpp:898 -msgid "BOSS: Add Message" -msgstr "BOSS: Dodaj Wiadomość" - -#: gui/editor.cpp:908 -msgid "Error: No content specified. Row will not be added." -msgstr "Błąd: Brak wybranej zawartości. Linia nie będzie dodana." - -#: gui/editor.cpp:909 gui/editor.cpp:991 gui/main.cpp:167 gui/main.cpp:184 -#: gui/main.cpp:199 gui/main.cpp:280 gui/main.cpp:290 gui/main.cpp:303 -#: gui/main.cpp:311 gui/main.cpp:342 gui/main.cpp:359 gui/main.cpp:529 -#: gui/main.cpp:550 gui/main.cpp:566 gui/main.cpp:937 gui/main.cpp:989 -#: gui/main.cpp:1011 gui/main.cpp:1076 gui/main.cpp:1113 gui/misc.cpp:312 -#: gui/misc.cpp:327 gui/settings.cpp:287 gui/settings.cpp:299 -#: gui/settings.cpp:307 gui/settings.cpp:351 gui/settings.cpp:359 -#: gui/settings.cpp:367 -msgid "BOSS: Error" -msgstr "BOSS: Błąd" - -#: gui/editor.cpp:919 -msgid "BOSS: Add Tag" -msgstr "BOSS: Dodaj Tag" - -#: gui/editor.cpp:933 -msgid "BOSS: Add Dirty Info" -msgstr "BOSS: Dodaj info dublach w" - -#: gui/editor.cpp:952 -msgid "BOSS: Edit File/Plugin" -msgstr "BOSS: Edytuj plik/wtyczkę" - -#: gui/editor.cpp:976 -msgid "BOSS: Edit Message" -msgstr "BOSS: Edytuj Wiadomość" - -#: gui/editor.cpp:990 -msgid "Error: No content specified. Row will not be edited." -msgstr "Błąd: Brak zawartości. Linia nie będzie edytowana" - -#: gui/editor.cpp:1000 -msgid "BOSS: Edit Tag" -msgstr "BOSS: Edytuj Tag" - -#: gui/editor.cpp:1022 -msgid "BOSS: Edit Dirty Info" -msgstr "BOSS: Edytuj dane o dublach" - -#: gui/main.cpp:119 -msgid "Masterlist update failed. Details: %1%" -msgstr "Aktualizacja Bazy danych nie powiodła się. Szczegóły: %1%" - -#: gui/main.cpp:137 -msgid "Masterlist parsing failed. Details: %1%" -msgstr "Przetwarzanie Bazy danych nie powiodło się. Szczegóły: %1%" - -#: gui/main.cpp:145 -msgid "Unknown" -msgstr "Nieznany" - -#: gui/main.cpp:147 -msgid "No masterlist" -msgstr "Brak Bazy danych" - -#: gui/main.cpp:166 -msgid "Error: BOSS is already running. This instance will now quit." -msgstr "Błąd: BOSS jest już uruchomiony. To okno zostanie zamknięte." - -#: gui/main.cpp:183 -msgid "Error: Could not create local app data BOSS folder." -msgstr "Błąd: Nie znaleziono folderu z ustawieniami BOSS." - -#: gui/main.cpp:198 -msgid "Error: Settings parsing failed. %1%" -msgstr "Błąd: Przetwarzanie ustawień nieudane. %1%" - -#: gui/main.cpp:279 -msgid "Error: Could not apply translation." -msgstr "Błąd: Nie można zastosować tłumaczenia." - -#: gui/main.cpp:289 -msgid "Error: The selected language is not available on this system." -msgstr "Błąd: Wybrany język jest niedostępny w tym systemie." - -#: gui/main.cpp:302 gui/main.cpp:358 gui/main.cpp:528 -msgid "Error: Game-specific settings could not be initialised. %1%" -msgstr "Błąd: Nie można zainicjować ustawień gry. %1%" - -#: gui/main.cpp:310 -msgid "Error: Games' settings parsing failed. %1%" -msgstr "Błąd: Przetwarzanie ustawień gry nieudane. %1%" - -#: gui/main.cpp:341 -msgid "Error: None of the supported games were detected." -msgstr "Błąd: Nie wykryto obsługiwanych gier." - -#: gui/main.cpp:386 -msgid "Edit Metadata" -msgstr "Edytuj Metadane" - -#: gui/main.cpp:387 -msgid "Sort Plugins" -msgstr "Sortuj Wtyczki" - -#: gui/main.cpp:388 -msgid "View Last Report" -msgstr "Czytaj ostatni raport" - -#: gui/main.cpp:392 -msgid "&View Last Report" -msgstr "&Czytaj ostatni raport" - -#: gui/main.cpp:393 -msgid "View &Debug Log" -msgstr "Czytaj Logi &Debug" - -#: gui/main.cpp:394 -msgid "&Sort Plugins" -msgstr "&Sortuj Wtyczki" - -#: gui/main.cpp:395 -msgid "&Redate Plugins" -msgstr "P&Rzedatuj Wtyczki" - -#: gui/main.cpp:398 -msgid "&File" -msgstr "&Plik" - -#: gui/main.cpp:400 -msgid "&Metadata..." -msgstr "&Metadane..." - -#: gui/main.cpp:401 -msgid "&Settings..." -msgstr "&Ustawienia..." - -#: gui/main.cpp:402 -msgid "&Edit" -msgstr "&Edycja" - -#: gui/main.cpp:414 -msgid "&Game" -msgstr "&Gra" - -#: gui/main.cpp:419 -msgid "&Help" -msgstr "&Pomoc" - -#: gui/main.cpp:443 -msgid "" -"Opens the Metadata Editor, where plugins' sorting metadata, messages, dirty " -"info and Bash Tag suggestions can be edited." -msgstr "" -"Otwiera edytor metadanych, gdzie zawarte są informacje o wtyczce, jej Tag " -"Bash, oraz informacje o kolejności ładowania." - -#: gui/main.cpp:444 -msgid "Sorts your plugins, then displays a report of the results." -msgstr "Sortuje wtyczki i wyświetla raport." - -#: gui/main.cpp:445 -msgid "Opens the last report generated for the current game." -msgstr "Otwiera ostatni raport wygenerowany dla obecnej gry." - -#: gui/main.cpp:504 gui/main.cpp:953 -msgid "BOSS: Report Viewer" -msgstr "BOSS: Wyswietlacz Raportów" - -#: gui/main.cpp:512 -msgid "BOSS: Settings" -msgstr "BOSS: Ustawienia" - -#: gui/main.cpp:549 gui/main.cpp:565 -msgid "Error: \"%1%\" cannot be found." -msgstr "Błąd: Nie znaleziono \"%1%\"" - -#: gui/main.cpp:577 -msgid "" -"Load order optimisation for Oblivion, Skyrim, Fallout 3 and Fallout: New " -"Vegas." -msgstr "" -"Optymalizacja kolejności ładowania wtyczek dla gier: Oblivion, Skyrim, " -"Fallout 3 oraz Fallout: New Vegas." - -#: gui/main.cpp:608 gui/main.cpp:818 gui/main.cpp:965 -msgid "BOSS: Working..." -msgstr "BOSS: Pracuję..." - -#: gui/main.cpp:608 gui/main.cpp:965 -msgid "BOSS working..." -msgstr "BOSS pracuje..." - -#: gui/main.cpp:665 -msgid "Userlist parsing failed. Details: %1%" -msgstr "Przetwarzanie listy użytkownika zawiodło. Szczegóły: %1%" - -#: gui/main.cpp:706 -msgid "" -"A global message contains a condition that could not be evaluated. Details: " -"%1%" -msgstr "Wiadomość nie możliwa do oszacowania. Szczegóły: %1%" - -#: gui/main.cpp:739 -msgid "\"%1%\" contains a condition that could not be evaluated. Details: %2%" -msgstr "" -"\"%1%\" zawiera warunek który nie może zostać oszacowany. Szczegóły: %2%" - -#: gui/main.cpp:758 -msgid "Building plugin graph..." -msgstr "Tworzenie wykresu wtyczek..." - -#: gui/main.cpp:803 -msgid "BOSS: Calculated Load Order" -msgstr "BOSS: Wyliczona Kolejność Ładowania" - -#: gui/main.cpp:818 -msgid "Recalculating load order..." -msgstr "Obliczanie kolejności ładowania..." - -#: gui/main.cpp:875 -msgid "Failed to set the load order. Details: %1%" -msgstr "Nie udało się ustalić kolejności ładowania. Szczegóły: %1%" - -#: gui/main.cpp:885 -msgid "" -"The load order displayed in the Details tab was not applied as sorting was " -"canceled." -msgstr "" -"Kolejność ładowania wyswietlona w karcie szczegółów nie została zastosowana " -"gdyż sortowanie zostało anulowane." - -#: gui/main.cpp:890 -msgid "Failed to calculate the load order. Details: %1%" -msgstr "Wyliczenie kolejności ładowania nieudane. Szczegóły: %1%" - -#: gui/main.cpp:936 -msgid "Error: %1%" -msgstr "Błąd: %1%" - -#: gui/main.cpp:988 -msgid "Error: Masterlist parsing failed. %1%" -msgstr "Błąd: Przetwarzanie bazy danych nieudane. %1%" - -#: gui/main.cpp:1010 -msgid "Error: Userlist parsing failed. %1%" -msgstr "Błąd: Przetwarzanie listy użytkownika nieudane. %1%" - -#: gui/main.cpp:1056 -msgid "BOSS: Metadata Editor" -msgstr "BOSS: Edytor Metadanych" - -#: gui/main.cpp:1065 -msgid "" -"This feature is provided so that modders using the Creation Kit may set the " -"load order it uses. A side-effect is that any subscribed Steam Workshop mods " -"will be re-downloaded by Steam. Do you wish to continue?" -msgstr "" -"Ta opcja jest dla użytkowników programu Creation Kit, aby mogli używać " -"kolejności wczytywania tego programu. W efekcie każdy subskrybowany mod ze " -"Steam Workshop będzie ponownie pobrany przez Steam. Czy chcesz kontynuować?" - -#: gui/main.cpp:1075 -msgid "Error: Failed to get load order. %1%" -msgstr "Błąd: Wczytywanie kolejności ładowania nieudane. %1%" - -#: gui/main.cpp:1112 -#, fuzzy -msgid "Error: Failed to set plugin timestamps. %1%" -msgstr "Błąd: Ustawianie znacznika czasu wtyczek nieudane. %1%" - -#: gui/main.cpp:1119 -msgid "Plugins were successfully redated." -msgstr "Wtyczki zostały pomyślnie przedatowane." - -#: gui/main.cpp:1120 -msgid "BOSS: Plugin Redate" -msgstr "BOSS: Przedatowanie Wtyczek" - -#: gui/misc.cpp:34 -msgid "Type" -msgstr "Typ" - -#: gui/misc.cpp:35 -msgid "Content" -msgstr "Zawartość" - -#: gui/misc.cpp:37 gui/misc.cpp:180 -msgid "Language" -msgstr "Język" - -#: gui/misc.cpp:116 -msgid "Filename (required):" -msgstr "Nazwa pliku (wymagane):" - -#: gui/misc.cpp:119 -msgid "Displayed Name:" -msgstr "Nazwa wyświetlana:" - -#: gui/misc.cpp:122 gui/misc.cpp:206 gui/misc.cpp:362 -msgid "Condition:" -msgstr "Warunek:" - -#: gui/misc.cpp:176 -msgid "Add Content" -msgstr "Dodaj zawartość" - -#: gui/misc.cpp:177 -msgid "Edit Content" -msgstr "Edytuj zawartość" - -#: gui/misc.cpp:178 -msgid "Remove Content" -msgstr "Usuń zawartość" - -#: gui/misc.cpp:181 -msgid "String" -msgstr "Ciąg" - -#: gui/misc.cpp:203 gui/settings.cpp:428 -msgid "Type:" -msgstr "Typ:" - -#: gui/misc.cpp:218 gui/settings.cpp:108 -msgid "Language:" -msgstr "Język:" - -#: gui/misc.cpp:221 -msgid "Content:" -msgstr "Zawartość:" - -#: gui/misc.cpp:311 gui/misc.cpp:326 -msgid "Error: No content row selected." -msgstr "Błąd: Brak zawartości w wybranej lini." - -#: gui/misc.cpp:356 -msgid "Add/Remove:" -msgstr "Dodaj/Usuń:" - -#: gui/misc.cpp:359 gui/settings.cpp:425 -msgid "Name (required):" -msgstr "Nazwa (wymagane)" - -#: gui/misc.cpp:424 -msgid "CRC (required):" -msgstr "CRC (wymagane)" - -#: gui/misc.cpp:427 -msgid "ITM Count:" -msgstr "Liczba ITM:" - -#: gui/misc.cpp:430 -msgid "UDR Count:" -msgstr "Liczba UDR:" - -#: gui/misc.cpp:433 -msgid "Deleted Navmesh Count:" -msgstr "Liczba usuniętych Navmesh:" - -#: gui/misc.cpp:436 -msgid "Cleaning Utility (required):" -msgstr "Narzędzie czyszczące (wymagane):" - -#: gui/settings.cpp:41 -msgid "None" -msgstr "Brak" - -#: gui/settings.cpp:42 -msgid "Low" -msgstr "Niskie" - -#: gui/settings.cpp:43 -msgid "Medium" -msgstr "Średnie" - -#: gui/settings.cpp:44 -msgid "High" -msgstr "Wysokie" - -#: gui/settings.cpp:48 -msgid "Autodetect" -msgstr "Automatycznie" - -#: gui/settings.cpp:66 -msgid "Add Game" -msgstr "Dodaj Grę" - -#: gui/settings.cpp:67 -msgid "Edit Game" -msgstr "Edytuj Grę" - -#: gui/settings.cpp:68 -msgid "Remove Game" -msgstr "Usuń Grę" - -#: gui/settings.cpp:70 -msgid "Update masterlist before sorting." -msgstr "Uaktualnij Bazę Danych przes sortowaniem." - -#: gui/settings.cpp:71 -msgid "View reports externally in default browser." -msgstr "Czytaj raport w domyślnej przeglądarce." - -#: gui/settings.cpp:74 -msgid "Name" -msgstr "Nazwa" - -#: gui/settings.cpp:75 -msgid "Base Game Type" -msgstr "Podstawowy typ gry" - -#: gui/settings.cpp:76 -msgid "BOSS Folder Name" -msgstr "nazwa folderu BOSS (wymagane):" - -#: gui/settings.cpp:77 -msgid "Master File" -msgstr "Plik Nadrzędny" - -#: gui/settings.cpp:78 -msgid "Masterlist Repository URL" -msgstr "URL do Bazy danych:" - -#: gui/settings.cpp:79 -msgid "Masterlist Repository Branch" -msgstr "Gałąź bazy danych" - -#: gui/settings.cpp:80 -msgid "Install Path" -msgstr "Ścieżka instalacyjna:" - -#: gui/settings.cpp:81 -msgid "Install Path Registry Key" -msgstr "Klucz rejestru ścieżki instalacyjnej " - -#: gui/settings.cpp:105 -msgid "Default Game:" -msgstr "Domyslna gra:" - -#: gui/settings.cpp:111 -msgid "Debug Verbosity:" -msgstr "Debug Verbosity:" - -#: gui/settings.cpp:130 -msgid "Language and game changes will be applied after BOSS is restarted." -msgstr "JZmiany w języku oraz grze zostaną zastosowane po restarcie BOSS." - -#: gui/settings.cpp:143 -msgid "The output is logged to the BOSSDebugLog.txt file." -msgstr "Wyniki zostały zapisane w BOSSDebugLog.txt." - -#: gui/settings.cpp:279 -msgid "BOSS: Add Game" -msgstr "BOSS: Dodaj Grę" - -#: gui/settings.cpp:286 gui/settings.cpp:366 -msgid "Error: A path and/or registry key is required. Row will not be added." -msgstr "" -"Błąd: Ścieżka oraz/lub klucz rejestru jest wymagany. Linia nie zostanie " -"dodana." - -#: gui/settings.cpp:298 -msgid "Error: A game with this name is already defined. Row will not be added." -msgstr "Błąd: Gra z tą nazwą jest już opisana. Linia nie zostanie dodana." - -#: gui/settings.cpp:306 -msgid "" -"Error: A game with this folder name is already defined. Row will not be " -"added." -msgstr "Błąd: Gra z tym folderem jest już opisana. Linia nie zostanie dodana." - -#: gui/settings.cpp:329 -msgid "BOSS: Edit Game" -msgstr "BOSS: Edytuj grę" - -#: gui/settings.cpp:350 -msgid "Error: Name is required. Row will not be added." -msgstr "Błąd: Nazwa jest wymagana. Linia nie zostanie dodana." - -#: gui/settings.cpp:358 -msgid "Error: Folder is required. Row will not be added." -msgstr "Błąd: Folder jest wymagany. Linia nie zostanie dodana." - -#: gui/settings.cpp:431 -msgid "BOSS Folder Name (required):" -msgstr "Nazwa folderu BOSS (wymagane):" - -#: gui/settings.cpp:434 -msgid "Master File:" -msgstr "Plik nadrzędny:" - -#: gui/settings.cpp:437 -msgid "Masterlist Repository URL:" -msgstr "URL do Bazy danych:" - -#: gui/settings.cpp:440 -msgid "Masterlist Repository Branch:" -msgstr "Gałąź Bazy danych" - -#: gui/settings.cpp:443 -msgid "Install Path:" -msgstr "Ścieżka instalacyjna:" - -#: gui/settings.cpp:446 -msgid "Install Path Registry Key:" -msgstr "Klucz rejestru ścieżki instalacyjnej " - -#: backend/generators.h:56 -msgid "Note:" -msgstr "Notatki:" - -#: backend/generators.h:58 -msgid "Bash Tag Suggestion(s):" -msgstr "Sugerowane Tagi Bash:" - -#: backend/generators.h:60 -msgid "Warning:" -msgstr "Ostrzeżenie:" - -#: backend/generators.h:62 -msgid "Error:" -msgstr "Błąd:" - -#: backend/generators.h:127 -msgid "BOSS Report" -msgstr "Raport BOSS" - -#: backend/generators.h:153 backend/generators.h:216 -msgid "Summary" -msgstr "Podsumowanie" - -#: backend/generators.h:159 -msgid "Details" -msgstr "Szczegóły" - -#: backend/generators.h:165 -msgid "Filters" -msgstr "Filtry" - -#: backend/generators.h:229 -msgid "BOSS Version" -msgstr "Wersja BOSS" - -#: backend/generators.h:238 -msgid "Masterlist Version" -msgstr "Wersja Bazy Danych" - -#: backend/generators.h:247 -msgid "Masterlist Updating" -msgstr "Aktualizacja Bazy Danych" - -#: backend/generators.h:251 -msgid "Enabled" -msgstr "Aktywny" - -#: backend/generators.h:253 -msgid "Disabled" -msgstr "Nieaktywny" - -#: backend/generators.h:262 -msgid "" -"There have been no changes in the Details tab since BOSS was last run for " -"this game." -msgstr "" -"Nie ma zmian w zakładce \"Szczegóły\" od ostantiego uruchomienia BOSS'a dla " -"tej gry." - -#: backend/generators.h:272 -msgid "General Messages" -msgstr "Ogólne wiadomości" - -#: backend/generators.h:282 -msgid "Total Number of Messages" -msgstr "Liczba wiadomości" - -#: backend/generators.h:291 -msgid "Number of Warnings" -msgstr "Liczba ostrzeżeń" - -#: backend/generators.h:300 -msgid "Number of Errors" -msgstr "Liczba błędów" - -#: backend/generators.h:341 -msgid "Version:" -msgstr "Wersja:" - -#: backend/generators.h:361 -msgid "Add:" -msgstr "Dodaj:" - -#: backend/generators.h:367 -msgid "Remove:" -msgstr "Usuń:" - -#: backend/generators.h:375 -msgid "" -"Contains %1% ITM records, %2% UDR records and %3% deleted navmeshes. Clean " -"with %4%." -msgstr "" -"Zawiera %1% wpisów ITM, %2% wpisów UDR oraz %3% usuniętych navmesh. Oczyść w " -"%4%." - -#: backend/generators.h:377 -msgid "Clean with %1%." -msgstr "Wyczyść w %1%." - -#: backend/generators.h:381 -msgid "Contains %1% UDR records and %2% deleted navmeshes. Clean with %3%." -msgstr "Zawiera %1% wpisów UDR oraz %2% usuniętych navmesh. Oczyść w %3%." - -#: backend/generators.h:383 -msgid "Contains %1% deleted navmeshes. Clean with %2%." -msgstr "Zawiera %1% usuniętych navmesh. Oczyść w %2%." - -#: backend/generators.h:385 -msgid "Contains %1% UDR records. Clean with %2%." -msgstr "Zawiera %1% wpisów UDR. Oczyść w %2%." - -#: backend/generators.h:388 -msgid "Contains %1% ITM records and %2% deleted navmeshes. Clean with %3%." -msgstr "Zawiera %1% wpisów ITM oraz %2% usuniętych navmesh. Oczyść w %3%." - -#: backend/generators.h:390 -msgid "Contains %1% ITM records. Clean with %2%." -msgstr "Zawiera %1% wpisów ITM. Wyczyść w %2%." - -#: backend/generators.h:393 -msgid "Contains %1% ITM records and %2% UDR records. Clean with %3%." -msgstr "Zawiera %1% wpisów ITM oraz %2% wpisów UDR. Oczyść w %3%." - -#: backend/generators.h:429 -msgid "The BOSS Report requires Javascript to be enabled in order to function." -msgstr "Raport BOSS wymaga włączonego Javascript do pracy." - -#: backend/generators.h:456 -msgid "Hide Version Numbers" -msgstr "Ukryj numery wersji" - -#: backend/generators.h:465 -msgid "Hide CRCs" -msgstr "Ukryj CRC" - -#: backend/generators.h:474 -msgid "Hide Bash Tag Suggestions" -msgstr "Ukryj sugestie tagów Bash" - -#: backend/generators.h:482 -msgid "Hide Notes" -msgstr "Ukryj notatki" - -#: backend/generators.h:490 -msgid "Hide 'Do Not Clean' Messages" -msgstr "Ukryj wiadomości \"Nie czyścić\"" - -#: backend/generators.h:498 -msgid "Hide All Plugin Messages" -msgstr "Ukryj wszystkie wiadomości wtyczek" - -#: backend/generators.h:506 -msgid "Hide Messageless Plugins" -msgstr "Ukryj wtyczki bez wiadomości" - -#: backend/generators.h:516 -msgid "%1% of %2% plugins hidden." -msgstr "%1% z %2% wtyczek ukrytych." - -#: backend/generators.h:524 -msgid "%1% of %2% messages hidden." -msgstr "%1% z %2% wiadomości ukrytych." - -#: backend/parsers.h:467 backend/parsers.h:550 -msgid "Invalid file path:" -msgstr "Nieprawidłowa ścieżka do pliku:" - -#: backend/parsers.h:515 -msgid "Invalid folder path:" -msgstr "Nieprawidłowa ścieżka do folderu:" - -#: backend/parsers.h:532 -msgid "Invalid regex string:" -msgstr "Nieprawidłowy ciąg regex:" - -#: backend/parsers.h:627 -msgid "Expected \"%1%\" at \"%2%\"." -msgstr "Oczekiwano \"%1%\" w \"%2%\"." - -#: gui/misc.h:35 -msgid "Note" -msgstr "Notki:" - -#: gui/misc.h:36 -msgid "Warning" -msgstr "Ostrzeżenie" - -#: gui/misc.h:37 -msgid "Error" -msgstr "Błąd" - -#: gui/misc.h:41 -msgid "Add" -msgstr "Dodaj" - -#: gui/misc.h:42 -msgid "Remove" -msgstr "Usuń" diff --git a/resources/l10n/pt_BR/LC_MESSAGES/loot.po b/resources/l10n/pt_BR/LC_MESSAGES/loot.po deleted file mode 100644 index d118eccb..00000000 --- a/resources/l10n/pt_BR/LC_MESSAGES/loot.po +++ /dev/null @@ -1,1043 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: BOSS v3.0.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-09-24 17:57-0000\n" -"PO-Revision-Date: 2014-10-17 11:53-0300\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: pt_BR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.6.9\n" -"X-Poedit-KeywordsList: translate:1,1t;translate:1c,2,t\n" -"X-Poedit-Basepath: ../../src\n" -"X-Poedit-SourceCharset: UTF-8\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Poedit-SearchPath-0: backend\n" -"X-Poedit-SearchPath-1: gui\n" - -#: src/backend/game.cpp:357 -msgid "Invalid game ID supplied." -msgstr "Inválido jogo ID fornecido." - -#: src/backend/game.cpp:381 -msgid "Game path could not be detected." -msgstr "Caminho de jogo não pode ser detectado." - -#: src/backend/game.cpp:490 src/backend/game.cpp:573 src/backend/game.cpp:651 -msgid "" -"libloadorder failed to create a game handle. Details could not be fetched." -msgstr "" -"libloadorder não conseguiu criar uma alça de jogo. Os detalhes não poderiam " -"ser buscados." - -#: src/backend/game.cpp:494 src/backend/game.cpp:577 src/backend/game.cpp:655 -msgid "libloadorder failed to create a game handle. Details:" -msgstr "libloadorder não conseguiu criar uma alça de jogo. Detalhes:" - -#: src/backend/game.cpp:509 src/backend/game.cpp:592 src/backend/game.cpp:669 -msgid "" -"libloadorder failed to initialise game master file support. Details could " -"not be fetched." -msgstr "" -"libloadorder não conseguiu inicializar suporte de arquivo mestre do jogo. Os " -"detalhes não poderiam ser buscados." - -#: src/backend/game.cpp:513 src/backend/game.cpp:596 src/backend/game.cpp:673 -msgid "libloadorder failed to initialise game master file support. Details:" -msgstr "" -"libloadorder não conseguiu inicializar suporte de arquivo mestre do jogo. " -"Detalhes:" - -#: src/backend/game.cpp:526 -msgid "" -"libloadorder failed to get the active plugins list. Details could not be " -"fetched." -msgstr "" -"libloadorder não conseguiu obter a lista de plugins ativos. Os detalhes não " -"poderiam ser buscados." - -#: src/backend/game.cpp:530 -msgid "libloadorder failed to get the active plugins list. Details:" -msgstr "libloadorder não conseguiu obter a lista de plugins ativos. Detalhes:" - -#: src/backend/game.cpp:609 src/backend/game.cpp:698 -msgid "" -"libloadorder failed to set the load order. Details could not be fetched." -msgstr "" -"libloadorder não conseguiu definir a ordem de carregamento. Os detalhes não " -"poderiam ser buscados." - -#: src/backend/game.cpp:613 -msgid "libloadorder failed to get the load order. Details:" -msgstr "libloadorder não conseguiu obter a ordem de carregamento. Detalhes:" - -#: src/backend/game.cpp:702 -msgid "libloadorder failed to set the load order. Details:" -msgstr "libloadorder não conseguiu definir a ordem de carregamento. Detalhes:" - -#: src/backend/game.cpp:829 -msgid "Could not create LOOT folder for game. Details:" -msgstr "Não foi possível criar a pasta LOOT para o jogo. Detalhes:" - -#: src/backend/game.cpp:863 src/gui/handler.cpp:947 -msgid "\"%1%\" contains a condition that could not be evaluated. Details: %2%" -msgstr "" -"\"%1%\" contém uma condição que não podiam ser avaliados. Detalhes: %2%" - -#: src/backend/git.cpp:107 -msgid "Git operation failed. Error: %1%" -msgstr "Git operação falhou. Erro: %1%" - -#: src/backend/git.cpp:517 -msgid "Masterlist revision" -msgstr "Revisar Masterlist" - -#: src/backend/git.cpp:517 -msgid "Rolled back to the previous revision." -msgstr "Revertida para a revisão anterior." - -#: src/backend/graph.cpp:77 -msgid "" -"Cyclic interaction detected between plugins \"%1%\" and \"%2%\". Back cycle: " -"%3%" -msgstr "" -"Interação cíclica detectada entre plugins \"%1%\" e \"%2%\". Voltar ciclo: " -"%3%" - -#: src/backend/helpers.cpp:150 -msgid "Unable to open \"%1%\" for CRC calculation." -msgstr "Não é possível abrir \"%1%\" para cálculo do CRC." - -#: src/backend/metadata.cpp:143 src/backend/metadata.cpp:180 -msgid "Failed to parse condition \"%1%\": %2%" -msgstr "Falha ao analisar a condição \"%1%\": %2%" - -#: src/backend/metadata.cpp:148 src/backend/metadata.cpp:185 -msgid "Failed to parse condition \"%1%\"." -msgstr "Falha ao analisar a condição \"%1%\"" - -#: src/backend/metadata.cpp:429 -msgid "Cannot read \"%1%\". Details: %2%" -msgstr "Não é possível ler \"%1%\". Detalhes: %2%" - -#: src/backend/metadata.cpp:782 src/backend/metadata.cpp:793 -msgid "This plugin requires \"%1%\" to be installed, but it is missing." -msgstr "Este plugin requer \"%1%\", a ser instalado, mas está em falta." - -#: src/backend/metadata.cpp:786 -msgid "This plugin requires \"%1%\" to be active, but it is inactive." -msgstr "Este plugin requer \"%1%\" para ser ativo, mas está inativo." - -#: src/backend/metadata.cpp:801 -msgid "This plugin is incompatible with \"%1%\", but both are present." -msgstr "Este plugin é incompatível com \"%1%\", mas ambos estão presentes." - -#: src/backend/metadata.cpp:810 -msgid "" -"Contains %1% ITM records, %2% UDR records and %3% deleted navmeshes. Clean " -"with %4%." -msgstr "" -"Contém %1% registros ITM, %2% registros UDR e %3% navmeshes excluídos. Limpe " -"com %4%." - -#: src/backend/metadata.cpp:812 -msgid "Clean with %1%." -msgstr "Lipe com %1%." - -#: src/backend/metadata.cpp:815 -msgid "Contains %1% UDR records and %2% deleted navmeshes. Clean with %3%." -msgstr "Contém %1% registros UDR e %2% navmeshes excluídos. Limpe com a %3%." - -#: src/backend/metadata.cpp:817 -msgid "Contains %1% deleted navmeshes. Clean with %2%." -msgstr "Contém %1% navmeshes excluídos. Limpe com %2%." - -#: src/backend/metadata.cpp:819 -msgid "Contains %1% UDR records. Clean with %2%." -msgstr "Contém %1% registros UDR. Limpe com %2%." - -#: src/backend/metadata.cpp:822 -msgid "Contains %1% ITM records and %2% deleted navmeshes. Clean with %3%." -msgstr "Contém %1% registros ITM e %2% navmeshes excluídos. Limpe com a %3%." - -#: src/backend/metadata.cpp:824 -msgid "Contains %1% ITM records. Clean with %2%." -msgstr "Contém %1% registros ITM. Limpe com %2%." - -#: src/backend/metadata.cpp:827 -msgid "Contains %1% ITM records and %2% UDR records. Clean with %3%." -msgstr "Contém %1% registros ITM e %2% registros UDR. Limpe com a %3%." - -#: src/gui/app.cpp:146 -msgid "Error: Could not create LOOT settings file. %1%" -msgstr "Erro: Não foi possível criar arquivo de configurações de LOOT. %1%" - -#: src/gui/app.cpp:156 -msgid "Error: Settings parsing failed. %1%" -msgstr "Erro: Configurações de análise falhou. %1%" - -#: src/gui/app.cpp:221 -msgid "Error: Games' settings parsing failed. %1%" -msgstr "Erro: configurações de análise do jogo falhou. %1%" - -#: src/gui/app.cpp:240 -msgid "Error: Game-specific settings could not be initialised. %1%" -msgstr "" -"Erro: configurações específicas do jogo não poderia ser inicializado. %1%" - -#: src/gui/handler.cpp:733 src/gui/handler.cpp:833 -msgid "" -"A global message contains a condition that could not be evaluated. Details: " -"%1%" -msgstr "" -"Uma mensagem global contém uma condição que não poderia ser avaliada. " -"Detalhes: %1%" - -#: src/backend/parsers.h:490 src/backend/parsers.h:582 -msgid "Invalid file path:" -msgstr "Caminho de arquivo inválido:" - -#: src/backend/parsers.h:544 -msgid "Invalid folder path:" -msgstr "Caminho de pasta inválido:" - -#: src/backend/parsers.h:562 -msgid "Invalid regex string:" -msgstr "Inválido seqüência de expressão regular:" - -#: src/backend/parsers.h:664 -msgid "Expected \"%1%\" at \"%2%\"." -msgstr "Esperado \"% 1% \" em \"%2% \"." - -#: resources/report/js/custom.js:703 resources/report/js/l10n.js:216 -msgid "OK" -msgstr "OK" - -#: resources/report/js/custom.js:731 -msgid "Yes" -msgstr "Sim" - -#: resources/report/js/custom.js:736 resources/report/js/l10n.js:96 -#: resources/report/js/l10n.js:144 resources/report/js/l10n.js:207 -msgid "Cancel" -msgstr "Cancelar" - -#: resources/report/js/l10n.js:44 -msgid "Active Plugin" -msgstr "Ativar Plugin" - -#: resources/report/js/l10n.js:45 resources/report/js/l10n.js:100 -msgid "Dummy Plugin" -msgstr "Simular Plugin" - -#: resources/report/js/l10n.js:46 resources/report/js/l10n.js:101 -msgid "Loads BSA" -msgstr "Carregar BSA" - -#: resources/report/js/l10n.js:47 resources/report/js/l10n.js:102 -msgid "Has User Metadata" -msgstr "Editar Metadados" - -#: resources/report/js/l10n.js:48 -msgid "Click to open the plugin menu." -msgstr "Clique em abrir no menu do plugin" - -#: resources/report/js/l10n.js:50 -msgid "Enable Edits" -msgstr "Ativar edições" - -#: resources/report/js/l10n.js:51 -msgid "" -"Global priorities are compared against all other plugins. Normal priorities " -"are compared against only conflicting plugins." -msgstr "" -"Prioridades globais são comparados com todos os outros plugins. Prioridades " -"normais são comparados com plugins apenas conflitantes." - -#: resources/report/js/l10n.js:52 -msgid "Global Priority" -msgstr "Prioridade Global" - -#: resources/report/js/l10n.js:53 -msgid "Priority Value" -msgstr "Valor da Prioridade" - -#: resources/report/js/l10n.js:55 -msgid "Load After" -msgstr "Carregar Depois" - -#: resources/report/js/l10n.js:56 -msgid "Requirements" -msgstr "Requerimentos" - -#: resources/report/js/l10n.js:57 -msgid "Incompatibilities" -msgstr "Incompatibilidade" - -#: resources/report/js/l10n.js:58 -msgid "Messages" -msgstr "Mensagens" - -#: resources/report/js/l10n.js:59 -msgid "Bash Tags" -msgstr "Marcações Bash" - -#: resources/report/js/l10n.js:60 -msgid "Dirty Info" -msgstr "Informações suja" - -#: resources/report/js/l10n.js:62 resources/report/js/l10n.js:67 -#: resources/report/js/l10n.js:72 -msgid "Filename" -msgstr "Nome do arquivo" - -#: resources/report/js/l10n.js:63 resources/report/js/l10n.js:68 -#: resources/report/js/l10n.js:73 -msgid "Display Name" -msgstr "Exibir Nome" - -#: resources/report/js/l10n.js:64 resources/report/js/l10n.js:69 -#: resources/report/js/l10n.js:74 resources/report/js/l10n.js:79 -#: resources/report/js/l10n.js:85 -msgid "Condition" -msgstr "Condição" - -#: resources/report/js/l10n.js:65 resources/report/js/l10n.js:70 -#: resources/report/js/l10n.js:75 resources/report/js/l10n.js:81 -#: resources/report/js/l10n.js:86 resources/report/js/l10n.js:93 -#: resources/report/js/l10n.js:202 -msgid "Add new row..." -msgstr "Adicionar nova linha..." - -#: resources/report/js/l10n.js:77 -msgid "Type" -msgstr "Tipo" - -#: resources/report/js/l10n.js:78 -msgid "Content" -msgstr "Conteúdo" - -#: resources/report/js/l10n.js:80 resources/report/js/l10n.js:184 -msgid "Language" -msgstr "Idioma" - -#: resources/report/js/l10n.js:83 -msgid "Add/Remove" -msgstr "Adic/Excluir" - -#: resources/report/js/l10n.js:84 -msgid "Bash Tag" -msgstr "Marcação Bash" - -#: resources/report/js/l10n.js:88 -msgid "CRC" -msgstr "CRC" - -#: resources/report/js/l10n.js:89 -msgid "ITM Count" -msgstr "Contagem ITM" - -#: resources/report/js/l10n.js:90 -msgid "UDR Count" -msgstr "Contagem UDR" - -#: resources/report/js/l10n.js:91 -msgid "Deleted Navmeshes" -msgstr "Navmesh Excluídos" - -#: resources/report/js/l10n.js:92 -msgid "Cleaning Utility" -msgstr "Utilitário de Limpeza" - -#: resources/report/js/l10n.js:95 resources/report/js/l10n.js:143 -#: resources/report/js/l10n.js:206 -msgid "Apply" -msgstr "Aplicar" - -#: resources/report/js/l10n.js:103 -msgid "Priority Is Global" -msgstr "Prioridade é Global" - -#: resources/report/js/l10n.js:107 -msgid "Show Only Conflicts" -msgstr "Mostrar apenas Conflitos" - -#: resources/report/js/l10n.js:108 -msgid "Edit Metadata" -msgstr "Editar Metadata" - -#: resources/report/js/l10n.js:109 -msgid "Copy Metadata As Text" -msgstr "Copiar metadados como texto" - -#: resources/report/js/l10n.js:110 -msgid "Clear User Metadata" -msgstr "Remover metadados adicionados pelo usuário" - -#: resources/report/js/l10n.js:114 -msgid "Note" -msgstr "Nota" - -#: resources/report/js/l10n.js:115 -msgid "Warning" -msgstr "Aviso" - -#: resources/report/js/l10n.js:116 -msgid "Error" -msgstr "Erro" - -#: resources/report/js/l10n.js:120 -msgid "Add" -msgstr "Adicionar" - -#: resources/report/js/l10n.js:121 -msgid "Remove" -msgstr "Remover" - -#: resources/report/js/l10n.js:124 -msgid "File" -msgstr "Arquivo" - -#: resources/report/js/l10n.js:125 -msgid "Redate Plugins" -msgstr "Relatar Plugins" - -#: resources/report/js/l10n.js:126 -msgid "Open Debug Log Location" -msgstr "Abrir log de depuração" - -#: resources/report/js/l10n.js:127 -msgid "Clear All User Metadata" -msgstr "Remover todos os metadados adicionados pelo usuário" - -#: resources/report/js/l10n.js:128 -msgid "Copy Content As Text" -msgstr "Copiar o conteúdo como texto" - -#: resources/report/js/l10n.js:129 -msgid "Refresh Content" -msgstr "Refrescar Conteúdo" - -#: resources/report/js/l10n.js:132 -msgid "Game" -msgstr "Jogo" - -#: resources/report/js/l10n.js:135 -msgid "Help" -msgstr "Ajuda" - -#: resources/report/js/l10n.js:136 -msgid "View Documentation" -msgstr "Ver Documentação" - -#: resources/report/js/l10n.js:137 -msgid "About" -msgstr "Sobre" - -#: resources/report/js/l10n.js:140 resources/report/js/l10n.js:179 -msgid "Settings" -msgstr "Configurações..." - -#: resources/report/js/l10n.js:141 -msgid "Update Masterlist" -msgstr "Sem lista mestre" - -#: resources/report/js/l10n.js:142 -msgid "Sort" -msgstr "Organizar" - -#: resources/report/js/l10n.js:147 resources/report/js/l10n.js:165 -msgid "Summary" -msgstr "Sumário" - -#: resources/report/js/l10n.js:148 resources/report/js/l10n.js:176 -msgid "General Messages" -msgstr "Mensagens Gerais" - -#: resources/report/js/l10n.js:149 -msgid "Filters" -msgstr "Filtros" - -#: resources/report/js/l10n.js:150 -msgid "Press Enter when searching to select the next match." -msgstr "Pressione Enter quando a procura para selecionar o próximo jogo." - -#: resources/report/js/l10n.js:153 -msgid "Hide version numbers" -msgstr "Esconder Número da Versão" - -#: resources/report/js/l10n.js:154 -msgid "Hide CRCs" -msgstr "Esconder CRCs" - -#: resources/report/js/l10n.js:155 -msgid "Hide Bash Tags" -msgstr "Marcações Bash" - -#: resources/report/js/l10n.js:156 -msgid "Hide notes" -msgstr "Esconder Notas" - -#: resources/report/js/l10n.js:157 -msgid "Hide 'Do not clean' messages" -msgstr "Esconder Mensagem 'Não limpe'" - -#: resources/report/js/l10n.js:158 -msgid "Hide inactive plugin messages" -msgstr "Esconder as Mensagens do Plugin Inativo" - -#: resources/report/js/l10n.js:159 -msgid "Hide all plugin messages" -msgstr "Esconder todas as Mensagens do Plugin" - -#: resources/report/js/l10n.js:160 -msgid "Hide messageless plugins" -msgstr "Ocultar mensagem menos plugins" - -#: resources/report/js/l10n.js:161 -msgid "Hidden plugins" -msgstr "Esconder Plugins" - -#: resources/report/js/l10n.js:162 -msgid "Hidden messages" -msgstr "Esconder Mensagens" - -#: resources/report/js/l10n.js:166 -msgid "Masterlist Revision" -msgstr "Revisar Masterlist" - -#: resources/report/js/l10n.js:167 -msgid "Masterlist Date" -msgstr "Atualizar lista mestre" - -#: resources/report/js/l10n.js:168 -msgid "Warnings" -msgstr "Aviso" - -#: resources/report/js/l10n.js:169 -msgid "Errors" -msgstr "Erros" - -#: resources/report/js/l10n.js:170 -msgid "Total Messages" -msgstr "Número Total de Mensagens" - -#: resources/report/js/l10n.js:171 -msgid "Active Plugins" -msgstr "Plugins Ativos" - -#: resources/report/js/l10n.js:172 -msgid "Dirty Plugins" -msgstr "Plugins Sujos" - -#: resources/report/js/l10n.js:173 -msgid "Total Plugins" -msgstr "Total de Plugins" - -#: resources/report/js/l10n.js:181 -msgid "Default Game" -msgstr "Jogo Padrão" - -#: resources/report/js/l10n.js:182 -msgid "Autodetect" -msgstr "Detecção Automática" - -#: resources/report/js/l10n.js:186 -msgid "Enable debug logging" -msgstr "Ativar o log de depuração" - -#: resources/report/js/l10n.js:187 -msgid "The output is logged to the LOOTDebugLog.txt file." -msgstr "A saída é registrada no arquivo LOOTDebugLog.txt." - -#: resources/report/js/l10n.js:189 -msgid "Update masterlist before sorting" -msgstr "Atualize lista mestre antes da separação." - -#: resources/report/js/l10n.js:191 -msgid "Automatically refresh content on window refocus" -msgstr "Atualizar automaticamente o conteúdo na janela de reorientação" - -#: resources/report/js/l10n.js:194 -msgid "Name" -msgstr "Nome" - -#: resources/report/js/l10n.js:195 -msgid "Base Game" -msgstr "Jogo de Base" - -#: resources/report/js/l10n.js:196 -msgid "LOOT Folder" -msgstr "Pasta LOOT" - -#: resources/report/js/l10n.js:197 -msgid "Master File" -msgstr "Arquivo Mestre" - -#: resources/report/js/l10n.js:198 -msgid "Masterlist Repository URL" -msgstr "URL MasterList Repositório" - -#: resources/report/js/l10n.js:199 -msgid "Masterlist Repository Branch" -msgstr "MasterList Repositório Filial" - -#: resources/report/js/l10n.js:200 -msgid "Install Path" -msgstr "Caminho de Instalação" - -#: resources/report/js/l10n.js:201 -msgid "Install Path Registry Key" -msgstr "Caminho de Instalação da Chave do Registro" - -#: resources/report/js/l10n.js:204 -msgid "Language changes will be applied after LOOT is restarted." -msgstr "Idioma e jogos alterações serão aplicadas após LOOT ser reiniciado." - -#: resources/report/js/l10n.js:211 -msgid "First-Time Tips" -msgstr "Dicas de primeira viagem" - -#: resources/report/js/l10n.js:213 -msgid "" -"Multiple metadata editors can be opened at once, and the menu bar is " -"disabled while any editors are open." -msgstr "" -"Vários editores de metadados podem ser abertos ao mesmo tempo, e na barra de " -"menu é desativado enquanto quaisquer editores estão abertas." - -#: resources/report/js/l10n.js:214 -msgid "" -"Many interface elements have tooltips. If you don't know what something is, " -"try hovering your mouse over it to find out." -msgstr "" -"Muitos elementos da interface têm dicas. Se você não sabe o que é uma coisa, " -"tentar passar o mouse sobre ele para descobrir." - -#: resources/report/js/script.js:244 resources/report/js/script.js:249 -msgid "N/A" -msgstr "Nada" - -#: resources/report/js/script.js:520 -msgid "Do not clean." -msgstr "Não limpe." - -#~ msgid "None Specified" -#~ msgstr "Nenhum especificado" - -#~ msgid "" -#~ "Please submit any edits made for reasons other than personal preference " -#~ "to the BOSS team so that they may be included in the masterlist." -#~ msgstr "" -#~ "Por favor, envie quaisquer edições feitas para outros fins que " -#~ "preferência pessoal para a equipe BOSS razões para que possam ser " -#~ "incluídos na masterlist." - -#~ msgid "Remove Plugin" -#~ msgstr "Remover Plugin" - -#~ msgid "Enable User Changes" -#~ msgstr "Habilitar Mudanças do Usuário" - -#~ msgid "Add File" -#~ msgstr "Adicionar Arquivo" - -#~ msgid "Edit File" -#~ msgstr "Editar Arquivo" - -#~ msgid "Remove File" -#~ msgstr "Excluir Arquivo" - -#~ msgid "Save Changes" -#~ msgstr "Salvar Mudanças" - -#~ msgid "Plugins" -#~ msgstr "Plugins" - -#~ msgid "Copy Name" -#~ msgstr "Copiar Nome" - -#~ msgid "" -#~ "Are you sure you want to clear all existing user-added metadata from this " -#~ "plugin?" -#~ msgstr "" -#~ "Tem certeza de que deseja apagar todos os metadados adicionados pelo " -#~ "usuário existente a partir deste plugin?" - -#~ msgid "BOSS: Warning" -#~ msgstr "BOSS: Avisa" - -#~ msgid "Edit Plugin" -#~ msgstr "Editar Plugin" - -#~ msgid "Edit Message" -#~ msgstr "Editar Mensagem" - -#~ msgid "Remove Message" -#~ msgstr "Excluir Mensagem" - -#~ msgid "Add Bash Tag" -#~ msgstr "Adicionar Marcação Bash" - -#~ msgid "Edit Bash Tag" -#~ msgstr "Editar Marcação Bash" - -#~ msgid "Remove Bash Tag" -#~ msgstr "Excluir Marcação Bash" - -#~ msgid "Add Dirty Info" -#~ msgstr "Adicionar Informação Suja" - -#~ msgid "Edit Dirty Info" -#~ msgstr "Editar Informação Suja" - -#~ msgid "Remove Dirty Info" -#~ msgstr "Excluir Informação Suja" - -#~ msgid "BOSS: Add File/Plugin" -#~ msgstr "BOSS: Adicionar Arquivo/Plugin" - -#~ msgid "BOSS: Add Message" -#~ msgstr "BOSS: Adicionar Mensagem" - -#~ msgid "Error: No content specified. Row will not be added." -#~ msgstr "Erro: Nenhum conteúdo especificado. Linha não será adicionado." - -#~ msgid "BOSS: Error" -#~ msgstr "BOSS: Erro" - -#~ msgid "BOSS: Add Tag" -#~ msgstr "BOSS: Adicionar Marcação" - -#~ msgid "BOSS: Add Dirty Info" -#~ msgstr "BOSS: Adicionar Informação Suja" - -#~ msgid "BOSS: Edit File/Plugin" -#~ msgstr "BOSS: Editar Arquivo/Plugin" - -#~ msgid "BOSS: Edit Message" -#~ msgstr "BOSS: Editar Mensagem" - -#~ msgid "Error: No content specified. Row will not be edited." -#~ msgstr "Erro: Nenhum conteúdo especificado. Linha não será editado." - -#~ msgid "BOSS: Edit Tag" -#~ msgstr "BOSS: Editar Marcação" - -#~ msgid "BOSS: Edit Dirty Info" -#~ msgstr "BOSS: Editar Informação Suja" - -#~ msgid "Masterlist update failed. Details: %1%" -#~ msgstr "Atualização MasterList falhou. Detalhes: %1%" - -#~ msgid "Masterlist parsing failed. Details: %1%" -#~ msgstr "Análise MasterList falhou. Detalhes: %1%" - -#~ msgid "Unknown" -#~ msgstr "Desconhecido" - -#~ msgid "Error: BOSS is already running. This instance will now quit." -#~ msgstr "Erro: BOSS já está em execução. Essa instância será agora sair." - -#~ msgid "Error: Could not apply translation." -#~ msgstr "Erro: Não foi possível aplicar a tradução." - -#~ msgid "Error: The selected language is not available on this system." -#~ msgstr "Erro: O idioma selecionado não está disponível no sistema." - -#~ msgid "Error: None of the supported games were detected." -#~ msgstr "Erro: foram detectados Nenhum dos jogos suportados." - -#~ msgid "View Last Report" -#~ msgstr "Ver ùltimo Relatório" - -#~ msgid "&View Last Report" -#~ msgstr "&Ver ùltimo Relatório" - -#~ msgid "View &Debug Log" -#~ msgstr "Ver &Depurar Log" - -#~ msgid "&Sort Plugins" -#~ msgstr "&Organizar Plugins" - -#~ msgid "&Metadata..." -#~ msgstr "&Metadata..." - -#~ msgid "&Edit" -#~ msgstr "&Editar" - -#~ msgid "BOSS: Report Viewer" -#~ msgstr "BOSS: Ver Relatório" - -#~ msgid "BOSS: Settings" -#~ msgstr "BOSS: Configurações" - -#~ msgid "Error: \"%1%\" cannot be found." -#~ msgstr "Erro: \"%1%\" não pode ser encontrado." - -#~ msgid "" -#~ "Load order optimisation for Oblivion, Skyrim, Fallout 3 and Fallout: New " -#~ "Vegas." -#~ msgstr "" -#~ "Otimização de fim de carga para Oblivion, Skyrim, Fallout 3 e Fallout: " -#~ "New Vegas." - -#~ msgid "BOSS: Working..." -#~ msgstr "BOSS: Funcionando..." - -#~ msgid "BOSS working..." -#~ msgstr "BOSS: Funcionando..." - -#~ msgid "Userlist parsing failed. Details: %1%" -#~ msgstr "Lista de Usuários análise falhou. Detalhes: %1%" - -#~ msgid "Building plugin graph..." -#~ msgstr "Construindo Gráfico Plugin..." - -#~ msgid "BOSS: Calculated Load Order" -#~ msgstr "BOSS: Ordem de Carregamento Calculado" - -#~ msgid "Recalculating load order..." -#~ msgstr "Recalculando ordem de carregamento..." - -#~ msgid "Failed to set the load order. Details: %1%" -#~ msgstr "Falha ao definir a ordem de carregamento. Detalhes: %1%" - -#~ msgid "" -#~ "The load order displayed in the Details tab was not applied as sorting " -#~ "was canceled." -#~ msgstr "" -#~ "A ordem de carregamento exibido na guia Detalhes não foi aplicado como " -#~ "classificação foi cancelado." - -#~ msgid "Failed to calculate the load order. Details: %1%" -#~ msgstr "Falha ao calcular a ordem de carregamento. Detalhes: %1%" - -#~ msgid "Error: %1%" -#~ msgstr "Erro: %1%" - -#~ msgid "Error: Masterlist parsing failed. %1%" -#~ msgstr "Erro: MasterList análise falhou. %1%" - -#~ msgid "Error: Userlist parsing failed. %1%" -#~ msgstr "Erro: Lista de Usuários análise falhou. %1%" - -#~ msgid "BOSS: Metadata Editor" -#~ msgstr "BOSS: Editor Metadata" - -#~ msgid "" -#~ "This feature is provided so that modders using the Creation Kit may set " -#~ "the load order it uses. A side-effect is that any subscribed Steam " -#~ "Workshop mods will be re-downloaded by Steam. Do you wish to continue?" -#~ msgstr "" -#~ "Este recurso é fornecido para que modders utilizando o Kit de Criação " -#~ "pode definir a ordem de carga que utiliza. Um efeito colateral é que " -#~ "qualquer mods Steam Workshop subscritas serão re-baixado pelo Steam. Você " -#~ "deseja continuar?" - -#~ msgid "Error: Failed to get load order. %1%" -#~ msgstr "Erro: Falha ao obter o fim da carga. %1%" - -#~ msgid "Error: Failed to set plugin timestamps. %1%" -#~ msgstr "Erro: Falha ao definir timestamps plugin. %1%" - -#~ msgid "Plugins were successfully redated." -#~ msgstr "Plugins foram relatados com sucesso." - -#~ msgid "BOSS: Plugin Redate" -#~ msgstr "BOSS: Relatar Plugin" - -#~ msgid "Filename (required):" -#~ msgstr "Nome do arquivo (requerido):" - -#~ msgid "Displayed Name:" -#~ msgstr "Nome Exibido:" - -#~ msgid "Condition:" -#~ msgstr "Condição:" - -#~ msgid "Add Content" -#~ msgstr "Adicionar Conteúdo" - -#~ msgid "Edit Content" -#~ msgstr "Editar Conteúdo" - -#~ msgid "String" -#~ msgstr "Linha" - -#~ msgid "Type:" -#~ msgstr "Tipo" - -#~ msgid "Language:" -#~ msgstr "Idioma:" - -#~ msgid "Content:" -#~ msgstr "Conteúdo" - -#~ msgid "Error: No content row selected." -#~ msgstr "Erro: Nenhuma linha de conteúdo selecionado." - -#~ msgid "Add/Remove:" -#~ msgstr "Adicionar/Remover" - -#~ msgid "Name (required):" -#~ msgstr "Nome (requerido):" - -#~ msgid "CRC (required):" -#~ msgstr "CRC (requerido):" - -#~ msgid "ITM Count:" -#~ msgstr "Contagem ITM:" - -#~ msgid "UDR Count:" -#~ msgstr "Contagem UDR:" - -#~ msgid "Deleted Navmesh Count:" -#~ msgstr "Contagem Navmesh Excluido:" - -#~ msgid "Cleaning Utility (required):" -#~ msgstr "Utilitário de Limpeza (requerido):" - -#~ msgid "None" -#~ msgstr "Nenhum" - -#~ msgid "Low" -#~ msgstr "Baixo" - -#~ msgid "Medium" -#~ msgstr "Médio" - -#~ msgid "High" -#~ msgstr "Alto" - -#~ msgid "Add Game" -#~ msgstr "Adicionar Jogo" - -#~ msgid "Edit Game" -#~ msgstr "Editar Jogo" - -#~ msgid "Remove Game" -#~ msgstr "Remover Jogo" - -#~ msgid "View reports externally in default browser." -#~ msgstr "Exibir relatórios externamente no navegador padrão." - -#~ msgid "BOSS Folder Name" -#~ msgstr "Nome da Pasta BOSS" - -#~ msgid "Debug Verbosity:" -#~ msgstr "Depurar Verbozidade:" - -#~ msgid "BOSS: Add Game" -#~ msgstr "BOSS: Adicionar Jogo" - -#~ msgid "" -#~ "Error: A path and/or registry key is required. Row will not be added." -#~ msgstr "" -#~ "Erro: É necessário um caminho e/ou a chave de registro. Linha não será " -#~ "adicionado." - -#~ msgid "" -#~ "Error: A game with this name is already defined. Row will not be added." -#~ msgstr "" -#~ "Erro: Um jogo com este nome já está definido. Linha não será adicionado." - -#~ msgid "" -#~ "Error: A game with this folder name is already defined. Row will not be " -#~ "added." -#~ msgstr "" -#~ "Erro: Um jogo com este nome da pasta já está definido. Linha não será " -#~ "adicionado." - -#~ msgid "BOSS: Edit Game" -#~ msgstr "BOSS: Editar Jogo" - -#~ msgid "Error: Name is required. Row will not be added." -#~ msgstr "Erro: Nome é obrigatório. Linha não será adicionado." - -#~ msgid "Error: Folder is required. Row will not be added." -#~ msgstr "Erro: A pasta é necessária. Linha não será adicionado." - -#~ msgid "BOSS Folder Name (required):" -#~ msgstr "Nome da Pasta BOSS: (requerido):" - -#~ msgid "Master File:" -#~ msgstr "Arquivo Mestre:" - -#~ msgid "Masterlist Repository URL:" -#~ msgstr "URL MasterList Repositório:" - -#~ msgid "Masterlist Repository Branch:" -#~ msgstr "MasterList Repositório Filial:" - -#~ msgid "Install Path:" -#~ msgstr "Caminho de Instalação:" - -#~ msgid "Install Path Registry Key:" -#~ msgstr "Caminho de Instalação da chave do Registro:" - -#~ msgid "Note:" -#~ msgstr "Nota:" - -#~ msgid "Bash Tag Suggestion(s):" -#~ msgstr "Sugestões de Marcação Bash:" - -#~ msgid "Warning:" -#~ msgstr "Aviso:" - -#~ msgid "Error:" -#~ msgstr "Erro:" - -#~ msgid "BOSS Report" -#~ msgstr "Relatório BOSS" - -#~ msgid "Details" -#~ msgstr "Detalhes" - -#~ msgid "BOSS Version" -#~ msgstr "Versão BOSS" - -#~ msgid "Masterlist Version" -#~ msgstr "Versão Masterlist" - -#~ msgid "Disabled" -#~ msgstr "Desabilitado" - -#~ msgid "" -#~ "There have been no changes in the Details tab since BOSS was last run for " -#~ "this game." -#~ msgstr "" -#~ "Não houve mudanças na guia Detalhes desde BOSS foi executado pela última " -#~ "vez para este jogo." - -#~ msgid "Number of Warnings" -#~ msgstr "Número de Avisos" - -#~ msgid "Number of Errors" -#~ msgstr "Número de Erros" - -#~ msgid "Version:" -#~ msgstr "Versão:" - -#~ msgid "Add:" -#~ msgstr "Adicionar:" - -#~ msgid "Remove:" -#~ msgstr "Excluir:" - -#~ msgid "" -#~ "The BOSS Report requires Javascript to be enabled in order to function." -#~ msgstr "" -#~ "O Relatório BOSS requer que o Javascript esteja habilitado para funcionar." - -#~ msgid "Hide Bash Tag Suggestions" -#~ msgstr "Esconder Sugestões de Marcação Bash" - -#~ msgid "%1% of %2% plugins hidden." -#~ msgstr "%1% plugins escondidos do %2%." - -#~ msgid "%1% of %2% messages hidden." -#~ msgstr "%1% mensagens escondidos do %2%." diff --git a/resources/l10n/ru/LC_MESSAGES/loot.po b/resources/l10n/ru/LC_MESSAGES/loot.po deleted file mode 100644 index 36d8c84b..00000000 --- a/resources/l10n/ru/LC_MESSAGES/loot.po +++ /dev/null @@ -1,1976 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: LOOT\n" -"Report-Msgid-Bugs-To: https://github.com/loot/loot/issues\n" -"POT-Creation-Date: 2017-01-09 12:40+0500\n" -"PO-Revision-Date: 2017-01-09 12:52+0500\n" -"Last-Translator: Tokc.D.K. \n" -"Language-Team: Russian\n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.11\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#: src/gui/html/js/events.js:18 -msgid "Identifying conflicting plugins..." -msgstr "Определение конфликтующих плагинов..." - -#: src/gui/html/js/events.js:80 -msgid "Updating and parsing masterlist..." -msgstr "Обновление и обработка мастерлиста..." - -#: src/gui/html/js/events.js:97 -#, javascript-format -msgid "Masterlist updated to revision %s." -msgstr "Мастерлист обновлен до версии %s." - -#: src/gui/html/js/events.js:100 -msgid "No masterlist update was necessary." -msgstr "Обновление мастерлиста не требуется." - -#: src/gui/html/js/events.js:130 -#, javascript-format -msgid "Failed to sort plugins. Details: %s" -msgstr "Не удалось отсортировать плагины. Детали: %s" - -#: src/gui/html/js/events.js:150 -msgid "Sorting made no changes to the load order." -msgstr "В результате сортировки порядок загрузки изменен не был." - -#: src/gui/html/js/events.js:182 -msgid "Redate Plugins?" -msgstr "Редатировать плагины?" - -#: src/gui/html/js/events.js:182 -msgid "" -"This feature is provided so that modders using the Creation Kit may set the " -"load order it uses. A side-effect is that any subscribed Steam Workshop mods " -"will be re-downloaded by Steam (this does not affect Skyrim Special " -"Edition). Do you wish to continue?" -msgstr "" -"Эта возможность предоставлена для того, чтобы авторы модификаций, " -"использующие Creation Kit, могли задать тот порядок загрузки, который они " -"используют. Побочным эффектом является то, что любые моды с подпиской в " -"мастерской Steam будут загружены через Steam снова (это не относится к " -"Skyrim Special Edition). Продолжить?" - -#: src/gui/html/js/events.js:182 -msgid "Redate" -msgstr "Редатировать" - -#: src/gui/html/js/events.js:185 -msgid "Plugins were successfully redated." -msgstr "Плагины были успешно редатированы." - -#: src/gui/html/js/events.js:191 -msgid "" -"Are you sure you want to clear all existing user-added metadata from all " -"plugins?" -msgstr "" -"Вы уверены, что хотите очистить все существующие добавленные пользователем " -"метаданные для всех плагинов?" - -#: src/gui/html/js/events.js:191 src/gui/html/js/events.js:408 -msgid "Clear" -msgstr "Очистить" - -#: src/gui/html/js/events.js:202 -msgid "All user-added metadata has been cleared." -msgstr "Пользовательские метаданные были очищены." - -#: src/gui/html/js/events.js:225 -msgid "LOOT's content has been copied to the clipboard." -msgstr "Содержимое LOOT было скопировано в буфер обмена." - -#: src/gui/html/js/events.js:236 -msgid "The load order has been copied to the clipboard." -msgstr "Порядок загрузки был скопирован в буфер обмена." - -#: src/gui/html/js/events.js:267 -#, javascript-format -msgid "" -"You have not yet applied or cancelled your %s. Are you sure you want to quit?" -msgstr "" -"Вы все еще не применили или не отменили %s. Действительно хотите выйти?" - -#: src/gui/html/js/events.js:267 src/gui/html/js/translateStaticText.js:232 -msgid "Quit" -msgstr "Выход" - -#: src/gui/html/js/events.js:279 -msgid "sorted load order" -msgstr "отсортированный порядок загрузки" - -#: src/gui/html/js/events.js:281 -msgid "metadata edits" -msgstr "правки метаданных" - -#: src/gui/html/js/events.js:404 -#, javascript-format -msgid "The metadata for \"%s\" has been copied to the clipboard." -msgstr "Метаданные для \"%s\" были скопированы в буфер обмена." - -#: src/gui/html/js/events.js:408 -#, javascript-format -msgid "" -"Are you sure you want to clear all existing user-added metadata from \"%s\"?" -msgstr "" -"Вы уверены, что хотите очистить все существующие, добавленные пользователем " -"метаданные для \"%s\"?" - -#: src/gui/html/js/events.js:423 -#, javascript-format -msgid "The user-added metadata for \"%s\" has been cleared." -msgstr "Пользовательские метаданные для \"%s\" были очищены." - -#: src/gui/html/js/filters.js:28 -msgid "Do not clean" -msgstr "Не чистить" - -#: src/gui/html/js/game.js:22 -msgid "N/A" -msgstr "Нет" - -#: src/gui/html/js/handlePromiseError.js:15 -#: src/gui/html/js/translateStaticText.js:152 -msgid "Error" -msgstr "Ошибка" - -#: src/gui/html/js/initialise.js:257 -#, javascript-format -msgid "A [new release](%s) of LOOT is available." -msgstr "Доступна [Новая версия](%s) LOOT." - -#: src/gui/html/js/translateStaticText.js:33 -msgid "Active Plugin" -msgstr "Активный плагин" - -#: src/gui/html/js/translateStaticText.js:34 -#: src/gui/html/js/translateStaticText.js:308 -msgid "Master File" -msgstr "Мастерфайл" - -#: src/gui/html/js/translateStaticText.js:35 -msgid "Empty Plugin" -msgstr "Очистить плагин" - -#: src/gui/html/js/translateStaticText.js:36 -msgid "Loads Archive" -msgstr "Загружает архив" - -#: src/gui/html/js/translateStaticText.js:37 -#: src/gui/html/js/translateStaticText.js:114 -msgid "Has User Metadata" -msgstr "Имеет метаданные пользователя" - -#: src/gui/html/js/translateStaticText.js:39 -msgid "Edit Metadata" -msgstr "Править метаданные" - -#: src/gui/html/js/translateStaticText.js:40 -msgid "Copy Metadata" -msgstr "Скопировать метаданные" - -#: src/gui/html/js/translateStaticText.js:41 -msgid "Clear User Metadata" -msgstr "Очистить метаданные пользователя" - -#: src/gui/html/js/translateStaticText.js:60 -msgid "Enable Edits" -msgstr "Включить правки" - -#: src/gui/html/js/translateStaticText.js:61 -#: src/gui/html/js/translateStaticText.js:113 -msgid "Priority" -msgstr "Приоритет" - -#: src/gui/html/js/translateStaticText.js:62 -#: src/gui/html/js/translateStaticText.js:112 -msgid "Global Priority" -msgstr "Глобальный приоритет" - -#: src/gui/html/js/translateStaticText.js:64 -msgid "Main" -msgstr "Основные" - -#: src/gui/html/js/translateStaticText.js:65 -msgid "Load After" -msgstr "Грузить после" - -#: src/gui/html/js/translateStaticText.js:66 -msgid "Requirements" -msgstr "Требования" - -#: src/gui/html/js/translateStaticText.js:67 -msgid "Incompatibilities" -msgstr "Несовместимости" - -#: src/gui/html/js/translateStaticText.js:68 -msgid "Messages" -msgstr "Сообщения" - -#: src/gui/html/js/translateStaticText.js:69 -msgid "Bash Tags" -msgstr "Bash-теги" - -#: src/gui/html/js/translateStaticText.js:70 -msgid "Dirty Plugin Info" -msgstr "Информация о грязных правках" - -#: src/gui/html/js/translateStaticText.js:71 -msgid "Clean Plugin Info" -msgstr "Информация об очистке плагина" - -#: src/gui/html/js/translateStaticText.js:72 -msgid "Locations" -msgstr "Местоположения" - -#: src/gui/html/js/translateStaticText.js:74 -#: src/gui/html/js/translateStaticText.js:78 -#: src/gui/html/js/translateStaticText.js:82 -msgid "Filename" -msgstr "Имя файла" - -#: src/gui/html/js/translateStaticText.js:75 -#: src/gui/html/js/translateStaticText.js:79 -#: src/gui/html/js/translateStaticText.js:83 -msgid "Display Name" -msgstr "Отображаемое имя" - -#: src/gui/html/js/translateStaticText.js:76 -#: src/gui/html/js/translateStaticText.js:80 -#: src/gui/html/js/translateStaticText.js:84 -#: src/gui/html/js/translateStaticText.js:88 -#: src/gui/html/js/translateStaticText.js:93 -msgid "Condition" -msgstr "Выражение" - -#: src/gui/html/js/translateStaticText.js:86 -msgid "Type" -msgstr "Тип" - -#: src/gui/html/js/translateStaticText.js:87 -msgid "Content" -msgstr "Содержимое" - -#: src/gui/html/js/translateStaticText.js:89 -#: src/gui/html/js/translateStaticText.js:296 -msgid "Language" -msgstr "Язык" - -#: src/gui/html/js/translateStaticText.js:91 -msgid "Add/Remove" -msgstr "Добавить/удалить" - -#: src/gui/html/js/translateStaticText.js:92 -msgid "Bash Tag" -msgstr "Bash-тег" - -#: src/gui/html/js/translateStaticText.js:95 -#: src/gui/html/js/translateStaticText.js:101 -msgid "CRC" -msgstr "CRC" - -#: src/gui/html/js/translateStaticText.js:96 -msgid "ITM Count" -msgstr "Число ITM" - -#: src/gui/html/js/translateStaticText.js:97 -msgid "Deleted References" -msgstr "Удаленные ссылки" - -#: src/gui/html/js/translateStaticText.js:98 -msgid "Deleted Navmeshes" -msgstr "Удаленные Navmesh-записи" - -#: src/gui/html/js/translateStaticText.js:99 -#: src/gui/html/js/translateStaticText.js:102 -msgid "Cleaning Utility" -msgstr "Утилита для очистки" - -#: src/gui/html/js/translateStaticText.js:104 -msgid "URL" -msgstr "URL" - -#: src/gui/html/js/translateStaticText.js:105 -#: src/gui/html/js/translateStaticText.js:305 -msgid "Name" -msgstr "Имя" - -#: src/gui/html/js/translateStaticText.js:107 -msgid "Save Metadata" -msgstr "Сохранить метаданные" - -#: src/gui/html/js/translateStaticText.js:108 -#: src/gui/html/js/translateStaticText.js:135 -#: src/gui/html/js/translateStaticText.js:219 -#: src/gui/html/js/translateStaticText.js:319 -msgid "Cancel" -msgstr "Отмена" - -#: src/gui/html/js/translateStaticText.js:115 -msgid "Editor Is Open" -msgstr "Редактор открыт" - -#: src/gui/html/js/translateStaticText.js:134 -#: src/gui/html/js/translateStaticText.js:341 -msgid "OK" -msgstr "Принять" - -#: src/gui/html/js/translateStaticText.js:142 -msgid "A filename is required." -msgstr "Необходимо имя файла." - -#: src/gui/html/js/translateStaticText.js:143 -#: src/gui/html/js/translateStaticText.js:154 -#: src/gui/html/js/translateStaticText.js:164 -#: src/gui/html/js/translateStaticText.js:176 -#: src/gui/html/js/translateStaticText.js:185 -#: src/gui/html/js/translateStaticText.js:193 -#: src/gui/html/js/translateStaticText.js:202 -msgid "Delete Row" -msgstr "Удалить строку" - -#: src/gui/html/js/translateStaticText.js:150 -msgid "Note" -msgstr "Примечание" - -#: src/gui/html/js/translateStaticText.js:151 -msgid "Warning" -msgstr "Предупреждение" - -#: src/gui/html/js/translateStaticText.js:153 -msgid "A content string is required." -msgstr "Необходимо содержимое строки." - -#: src/gui/html/js/translateStaticText.js:161 -msgid "Add" -msgstr "Добавить" - -#: src/gui/html/js/translateStaticText.js:162 -msgid "Remove" -msgstr "Удалить" - -#: src/gui/html/js/translateStaticText.js:163 -#: src/gui/html/js/translateStaticText.js:200 -msgid "A name is required." -msgstr "Необходимо имя." - -#: src/gui/html/js/translateStaticText.js:171 -#: src/gui/html/js/translateStaticText.js:183 -msgid "A CRC is required." -msgstr "Необходима контрольная сумма (CRC)." - -#: src/gui/html/js/translateStaticText.js:172 -#: src/gui/html/js/translateStaticText.js:173 -#: src/gui/html/js/translateStaticText.js:174 -msgid "Values must be integers." -msgstr "Значениями должны быть целые числа." - -#: src/gui/html/js/translateStaticText.js:175 -#: src/gui/html/js/translateStaticText.js:184 -msgid "A utility name is required." -msgstr "Необходимо имя утилиты." - -#: src/gui/html/js/translateStaticText.js:192 -msgid "A link is required." -msgstr "Необходима ссылка." - -#: src/gui/html/js/translateStaticText.js:201 -msgid "A folder is required." -msgstr "Необходима папка." - -#: src/gui/html/js/translateStaticText.js:209 -#: src/gui/html/js/translateStaticText.js:316 -msgid "Add New Row" -msgstr "Добавить новую строку" - -#: src/gui/html/js/translateStaticText.js:215 -msgid "Jump To General Information" -msgstr "Перейти к основной информации" - -#: src/gui/html/js/translateStaticText.js:216 -msgid "Sort Plugins" -msgstr "Сортировать плагины" - -#: src/gui/html/js/translateStaticText.js:217 -msgid "Update Masterlist" -msgstr "Обновить мастерлист" - -#: src/gui/html/js/translateStaticText.js:218 -#: src/gui/html/js/translateStaticText.js:318 -msgid "Apply" -msgstr "Принять" - -#: src/gui/html/js/translateStaticText.js:220 -msgid "Search Cards" -msgstr "Найти карточки" - -#: src/gui/html/js/translateStaticText.js:223 -msgid "Redate Plugins" -msgstr "Редатировать плагины" - -#: src/gui/html/js/translateStaticText.js:224 -msgid "Open Debug Log Location" -msgstr "Открыть папку с логом отладки" - -#: src/gui/html/js/translateStaticText.js:225 -msgid "Clear All User Metadata" -msgstr "Очистить все пользовательские метаданные" - -#: src/gui/html/js/translateStaticText.js:226 -msgid "Copy Load Order" -msgstr "Скопировать порядок загрузки" - -#: src/gui/html/js/translateStaticText.js:227 -msgid "Copy Content" -msgstr "Скопировать содержимое" - -#: src/gui/html/js/translateStaticText.js:228 -msgid "Refresh Content" -msgstr "Обновить содержимое" - -#: src/gui/html/js/translateStaticText.js:229 -msgid "View Documentation" -msgstr "Смотреть документацию" - -#: src/gui/html/js/translateStaticText.js:230 -msgid "About" -msgstr "О программе" - -#: src/gui/html/js/translateStaticText.js:231 -#: src/gui/html/js/translateStaticText.js:288 -msgid "Settings" -msgstr "Настройки" - -#: src/gui/html/js/translateStaticText.js:235 -msgid "Search cards" -msgstr "Найти карточки" - -#: src/gui/html/js/translateStaticText.js:247 -msgid "Plugins" -msgstr "Плагины" - -#: src/gui/html/js/translateStaticText.js:248 -msgid "Filters" -msgstr "Фильтры" - -#: src/gui/html/js/translateStaticText.js:249 -msgid "Press Enter or click outside the input to set the filter." -msgstr "" -"Нажмите клавишу Ввод или кликните по по свободному месту, чтобы применить " -"фильтр." - -#: src/gui/html/js/translateStaticText.js:250 -msgid "Show only plugins with cards that contain" -msgstr "Показать только плагины, имя которых содержит содержит" - -#: src/gui/html/js/translateStaticText.js:251 -msgid "No text specified" -msgstr "Текст не определен" - -#: src/gui/html/js/translateStaticText.js:254 -msgid "Hide version numbers" -msgstr "Скрыть номера версии" - -#: src/gui/html/js/translateStaticText.js:255 -msgid "Hide CRCs" -msgstr "Скрыть CRC" - -#: src/gui/html/js/translateStaticText.js:256 -msgid "Hide Bash Tags" -msgstr "Скрыть bash-теги" - -#: src/gui/html/js/translateStaticText.js:257 -msgid "Hide notes" -msgstr "Скрыть примечания" - -#: src/gui/html/js/translateStaticText.js:258 -msgid "Hide 'Do not clean' messages" -msgstr "Скрыть сообщения 'Не чистить'" - -#: src/gui/html/js/translateStaticText.js:259 -msgid "Hide all plugin messages" -msgstr "Скрыть все сообщения плагинов" - -#: src/gui/html/js/translateStaticText.js:260 -msgid "Hide inactive plugins" -msgstr "Скрыть неактивные плагины" - -#: src/gui/html/js/translateStaticText.js:261 -msgid "Hide messageless plugins" -msgstr "Скрыть плагины без сообщений" - -#: src/gui/html/js/translateStaticText.js:264 -msgid "Show only conflicting plugins for" -msgstr "Показать конфликтующие плагины только для" - -#: src/gui/html/js/translateStaticText.js:265 -msgid "No plugin selected" -msgstr "Плагин не выбран" - -#: src/gui/html/js/translateStaticText.js:269 -msgid "Hidden plugins:" -msgstr "Скрытые плагины:" - -#: src/gui/html/js/translateStaticText.js:270 -msgid "Hidden messages:" -msgstr "Скрытые сообщения:" - -#: src/gui/html/js/translateStaticText.js:275 -msgid "General Information" -msgstr "Основная информация" - -#: src/gui/html/js/translateStaticText.js:276 -msgid "Masterlist Revision" -msgstr "Версия мастерлиста" - -#: src/gui/html/js/translateStaticText.js:277 -msgid "Masterlist Date" -msgstr "Дата мастерлиста" - -#: src/gui/html/js/translateStaticText.js:278 -msgid "Warnings" -msgstr "Предупреждений" - -#: src/gui/html/js/translateStaticText.js:279 -msgid "Errors" -msgstr "Ошибок" - -#: src/gui/html/js/translateStaticText.js:280 -msgid "Total Messages" -msgstr "Всего сообщений" - -#: src/gui/html/js/translateStaticText.js:281 -msgid "Active Plugins" -msgstr "Активных плагинов" - -#: src/gui/html/js/translateStaticText.js:282 -msgid "Dirty Plugins" -msgstr "Грязных плагинов" - -#: src/gui/html/js/translateStaticText.js:283 -msgid "Total Plugins" -msgstr "Плагинов всего" - -#: src/gui/html/js/translateStaticText.js:291 -msgid "Default Game" -msgstr "Игра по умолчанию" - -#: src/gui/html/js/translateStaticText.js:292 -msgid "Autodetect" -msgstr "Автообнаружение" - -#: src/gui/html/js/translateStaticText.js:297 -msgid "Language changes will be applied after LOOT is restarted." -msgstr "Установки языка будут применены после перезапуска LOOT." - -#: src/gui/html/js/translateStaticText.js:299 -msgid "Enable debug logging" -msgstr "Включить лог отладки" - -#: src/gui/html/js/translateStaticText.js:300 -msgid "The output is logged to the LOOTDebugLog.txt file." -msgstr "Выходной поток записан в файл LOOTDebugLog.txt." - -#: src/gui/html/js/translateStaticText.js:302 -msgid "Update masterlist before sorting" -msgstr "Обновить мастерлист перед сортировкой" - -#: src/gui/html/js/translateStaticText.js:306 -msgid "Base Game" -msgstr "Игра" - -#: src/gui/html/js/translateStaticText.js:307 -msgid "LOOT Folder" -msgstr "Папка LOOT" - -#: src/gui/html/js/translateStaticText.js:309 -msgid "Masterlist Repository URL" -msgstr "URL хранилища мастерлиста" - -#: src/gui/html/js/translateStaticText.js:310 -msgid "Masterlist Repository Branch" -msgstr "Ветка хранилища мастерлиста" - -#: src/gui/html/js/translateStaticText.js:311 -msgid "Install Path" -msgstr "Путь установки" - -#: src/gui/html/js/translateStaticText.js:312 -msgid "Install Path Registry Key" -msgstr "Ключ реестра для пути установки" - -#: src/gui/html/js/translateStaticText.js:325 -msgid "First-Time Tips" -msgstr "Советы для новичков" - -#: src/gui/html/js/translateStaticText.js:327 -#, javascript-format -msgid "" -"This appears to be the first time you have run LOOT v%s. Here are some tips " -"to help you get started with the interface." -msgstr "" -"Похоже, это первый раз, когда вы запустили LOOT %s. Вот некоторые " -"подсказки, которые помогут вам начать работу с интерфейсом." - -#: src/gui/html/js/translateStaticText.js:329 -msgid "Click %(menu_icon)s buttons to open menus." -msgstr "Нажмите на значок %(menu_icon)s для открытия меню." - -#: src/gui/html/js/translateStaticText.js:332 -msgid "" -"As well as messages, LOOT displays plugin version " -"numbers, CRCs and Bash Tag suggestions for " -"addition and removal." -msgstr "" -"Также, как и сообщения, LOOT отображает номера версий плагинов, CRC и рекомендуемые Bash-теги для " -"добавления и удаления." - -#: src/gui/html/js/translateStaticText.js:333 -msgid "" -"CRCs are only displayed after plugins have been loaded, either by conflict " -"filtering, or by sorting." -msgstr "" -"CRC отображаются только после загрузки плагинов, фильтрации конфликтов или " -"сортировки." - -#: src/gui/html/js/translateStaticText.js:334 -msgid "" -"Double-click a plugin in the sidebar to quickly open it in the metadata " -"editor." -msgstr "" -"Дважды кликните по плагину на боковой панели для быстрого открытия в " -"редакторе метаданных." - -#: src/gui/html/js/translateStaticText.js:335 -msgid "" -"Plugins can be drag and dropped from the sidebar into the metadata editor's " -"\"load after\", \"requirements\" and \"incompatibility\" tables." -msgstr "" -"Плагины могут быть перемещены путем перетаскивания из боковой панели в " -"редактор метаданных, в поля таблицы \"Грузить после\", \"Требования\" и " -"\"Несовместимости\"." - -#: src/gui/html/js/translateStaticText.js:336 -msgid "" -"Some features are disabled while the metadata editor is open, or while there " -"is a sorted load order that has not been applied or discarded." -msgstr "" -"Некоторые функции отключены, пока открыт редактор метаданных или пока " -"отсортированный порядок загрузки не был применен или отменен." - -#: src/gui/html/js/translateStaticText.js:337 -msgid "" -"Many interface elements have tooltips. If you don't know what something is, " -"try hovering your mouse over it to find out. Otherwise, LOOT's documentation " -"can be accessed through the main menu." -msgstr "" -"Большинство элементов интерфейса имеют подсказки. Если вы не знаете " -"назначение какого-то элемента, попробуйте навести на него курсор мышки. В " -"противном случае документация LOOT всегда доступна через главное меню." - -#: src/gui/html/js/translateStaticText.js:339 -#: src/gui/html/js/translateStaticText.js:351 -#, javascript-format -msgid "" -"LOOT is free, but if you want to show your appreciation with some money, " -"donations may be made to WrinklyNinja (LOOT's creator and main developer) " -"using %s or %s." -msgstr "" -"LOOT бесплатен, но если вы хотите оказать финансовую поддержку, " -"пожертвования могут быть направлены WrinklyNinja (создатель и основной " -"разработчик LOOT), через %s или %s." - -#: src/gui/html/js/translateStaticText.js:346 -msgid "About LOOT" -msgstr "О LOOT" - -#: src/gui/html/js/translateStaticText.js:348 -#, javascript-format -msgid "Version %s (build %s)" -msgstr "Версия %s (сборка %s)" - -#: src/gui/html/js/translateStaticText.js:349 -msgid "" -"Load order optimisation for Oblivion, Skyrim, Skyrim Special Edition, " -"Fallout 3, Fallout: New Vegas and Fallout 4." -msgstr "" -"Оптимизация порядка загрузки для Oblivion, Skyrim, Skyrim Special Edition, " -"Fallout 3, Fallout: New Vegas и Fallout 4." - -#: src/gui/query/get_game_data_query.h:44 -msgid "Parsing, merging and evaluating metadata..." -msgstr "Обработка, объединение и сверка с метаданными.." - -#: src/gui/query/get_game_data_query.h:80 -msgid "" -"An error occurred while parsing the masterlist: %1%. This probably happened " -"because an update to LOOT changed its metadata syntax support. Try updating " -"your masterlist to resolve the error." -msgstr "" -"Во время обработки мастерлиста произошла ошибка: %1%. Возможно это произошло " -"потому, что в обновлении LOOT изменена поддержка синтаксиса метаданных. " -"Попробуйте обновить мастерлист, чтобы исправить ошибку." - -#: src/gui/query/get_game_data_query.h:95 -msgid "" -"An error occurred while parsing the userlist: %1%. This probably happened " -"because an update to LOOT changed its metadata syntax support. Your user " -"metadata will have to be updated manually.\n" -"\n" -"To do so, use the 'Open Debug Log Location' in LOOT's main menu to open its " -"data folder, then open your 'userlist.yaml' file in the relevant game " -"folder. You can then edit the metadata it contains with reference to the " -"documentation, which is accessible through LOOT's main menu.\n" -"\n" -"You can also seek support on LOOT's forum thread, which is linked to on " -"[LOOT's website](https://loot.github.io/)." -msgstr "" -"Ошибка при обработке пользовательских правил: %1%. Возможно в обновлении " -"LOOT изменилась поддержка синтаксиса метеданных. Пользовательские правила " -"нужно обновить вручную.\n" -"\n" -"Чтобы это сделать, испольуйте опцию главного меню LOOT 'Открыть расположение " -"лога отладки', чтобы открыть папку с данными, потом откройте файл 'userlist." -"yaml' в папке соответствующей игры. Тогда вы сможете отредактировать " -"содержащиеся метаданные в соответствии с документацией, посмотреть которую " -"можно в главном меню LOOT.\n" -"\n" -"Также вы можете задать вопросы на форумах, в теме LOOT, ссылки на которые " -"есть на [сайте LOOT](https://loot.github.io/)." - -#: src/gui/query/metadata_query.h:91 src/gui/query/metadata_query.h:92 -msgid "N/A: No masterlist present" -msgstr "N/A: Мастерлист отсутствует" - -#: src/gui/query/metadata_query.h:95 src/gui/query/metadata_query.h:96 -msgid "Unknown: Git repository missing" -msgstr "Неизвестно: Отсутствует хранилище Git" - -#: src/gui/query/metadata_query.h:119 -msgid "" -"A global message contains a condition that could not be evaluated. Details: " -"%1%" -msgstr "" -"Глобальное сообщение включает выражение, которое не может быть оценено. " -"Детали: %1%" - -#: src/gui/query/metadata_query.h:145 src/backend/plugin/plugin_sorter.cpp:217 -msgid "\"%1%\" contains a condition that could not be evaluated. Details: %2%" -msgstr "\"%1%\" включает выражение, которое не может быть оценено. Детали: %2%" - -#: src/gui/query/metadata_query.h:176 src/gui/query/metadata_query.h:177 -msgid "(edited)" -msgstr "(изменено)" - -#: src/gui/query/query.h:40 -msgid "" -"Oh no, something went wrong! You can check your LOOTDebugLog.txt (you can " -"get to it through the main menu) for more information." -msgstr "" -"О нет, что-то пошло не так! Дополнительную информацию можно узнать в файле " -"LOOTDebugLog.txt (можно получить доступ к нему через главное меню)." - -#: src/gui/query/sort_plugins_query.h:48 -msgid "Loading plugin contents..." -msgstr "Загрузка содержимого плагинов..." - -#: src/gui/query/sort_plugins_query.h:75 -msgid "Sorting load order..." -msgstr "Сортировка порядка загрузки..." - -#: src/gui/query/sort_plugins_query.h:83 -msgid "" -"Cyclic interaction detected between plugins \"%1%\" and \"%2%\". Back cycle: " -"%3%" -msgstr "" -"Циклическое взаимодействие обнаружено между плагинами \"%1%\" и \"%2%\". " -"Обратный цикл: %3%" - -#: src/backend/app/loot_state.cpp:130 -msgid "Error: Could not create LOOT settings file. %1%" -msgstr "Ошибка: Невозможно создать файл настроек LOOT. %1%" - -#: src/backend/app/loot_state.cpp:137 -msgid "Error: Settings parsing failed. %1%" -msgstr "Ошибка: Обработка настроек не удалась. %1%" - -#: src/backend/app/loot_state.cpp:198 -msgid "Error: Game-specific settings could not be initialised. %1%" -msgstr "" -"Ошибка: Специфические для игры настройки не могут быть инициализированы. %1%" - -#: src/backend/game/game_cache.cpp:119 -msgid "You have not sorted your load order this session." -msgstr "В этой сессии порядок загрузки ещё не отсортирован!" - -#: src/backend/helpers/git_helper.cpp:145 -msgid "" -"An error occurred while trying to clone the remote masterlist repository." -msgstr "Ошибка при попытке клонировать удаленное хранилище мастерлиста." - -#: src/backend/helpers/git_helper.cpp:194 -msgid "" -"An error occurred while trying to update the masterlist. This could be due " -"to a server-side error. Try again in a few minutes." -msgstr "" -"Ошибка при попытке обновления мастерлиста. Это может быть из-за ошибка на " -"стороне сервера. Попробуйте через несколько минут." - -#: src/backend/metadata/plugin_cleaning_data.cpp:89 -msgid "%1% ITM record" -msgid_plural "%1% ITM records" -msgstr[0] "%1% ITM-запись" -msgstr[1] "%1% ITM-записей" -msgstr[2] "%1% ITM-записей" - -#: src/backend/metadata/plugin_cleaning_data.cpp:90 -msgid "%1% deleted reference" -msgid_plural "%1% deleted references" -msgstr[0] "%1% удаленную ссылку" -msgstr[1] "%1% удаленных ссылок" -msgstr[2] "%1% удаленных ссылок" - -#: src/backend/metadata/plugin_cleaning_data.cpp:91 -msgid "%1% deleted navmesh" -msgid_plural "%1% deleted navmeshes" -msgstr[0] "%1% удаленный navmesh" -msgstr[1] "%1% удаленных navmesh-ей" -msgstr[2] "%1% удаленных navmesh-ей" - -#: src/backend/metadata/plugin_cleaning_data.cpp:95 -msgid "%1% found %2%, %3% and %4%." -msgstr "%1% содержит %2%, %3% и %4%." - -#: src/backend/metadata/plugin_cleaning_data.cpp:97 -msgid "%1% found dirty edits." -msgstr "%1% содержит грязные правки." - -#: src/backend/metadata/plugin_cleaning_data.cpp:100 -#: src/backend/metadata/plugin_cleaning_data.cpp:102 -#: src/backend/metadata/plugin_cleaning_data.cpp:104 -msgid "%1% found %2% and %3%." -msgstr "%1% содержит %2% and %3%." - -#: src/backend/metadata/plugin_cleaning_data.cpp:107 -#: src/backend/metadata/plugin_cleaning_data.cpp:109 -#: src/backend/metadata/plugin_cleaning_data.cpp:111 -msgid "%1% found %2%." -msgstr "%1% содержит %2%." - -#: src/backend/plugin/plugin.cpp:115 -msgid "Cannot read \"%1%\". Details: %2%" -msgstr "Невозможно прочесть \"%1%\". Детали: %2%" - -#: src/backend/plugin/plugin.cpp:221 src/backend/plugin/plugin.cpp:232 -msgid "This plugin requires \"%1%\" to be installed, but it is missing." -msgstr "Этот плагин требует установленного плагина \"%1%\", но он отсутствует." - -#: src/backend/plugin/plugin.cpp:224 -msgid "This plugin requires \"%1%\" to be active, but it is inactive." -msgstr "Этот плагин требует подключенного плагина \"%1%\", но он не подключен." - -#: src/backend/plugin/plugin.cpp:238 -msgid "This plugin is incompatible with \"%1%\", but both are present." -msgstr "Этот плагин несовместим с \"%1%\", но они оба присутствуют." - -#: src/backend/masterlist.cpp:45 -msgid "" -"An error occurred while trying to read the local masterlist's version. If " -"this error happens again, try deleting the \".git\" folder in %1%." -msgstr "" -"Ошибка при попытке прочитать версию локального мастерлиста. Если эта ошибка " -"происходит повторно, попробуйте удалить папку \".git\" в %1%." - -#: src/backend/masterlist.cpp:117 src/backend/masterlist.cpp:131 -msgid "" -"An error occurred while trying to access the local masterlist repository. If " -"this error happens again, try deleting the \".git\" folder in %1%." -msgstr "" -"Ошибка при попытке доступа к локальному хранилищу мастерлиста. Если эта " -"ошибка происходит повторно, попробуйте удалить папку \".git\" в %1%." - -#: src/backend/masterlist.cpp:238 -msgid "" -"An error occurred while trying to read information on the updated " -"masterlist. If this error happens again, try deleting the \".git\" folder in " -"%1%." -msgstr "" -"Ошибка при попытке прочитать информацию об обновлении мастерлиста. Если эта " -"ошибка происходит повторно, попробуйте удалить папку \".git\" в %1%." - -#: src/backend/masterlist.cpp:252 -msgid "" -"Masterlist revision %1%: %2%. The latest masterlist revision contains a " -"syntax error, LOOT is using the most recent valid revision instead. Syntax " -"errors are usually minor and fixed within hours." -msgstr "" -"Версия мастерлиста %1%: %2%. Последняя версия мастерлиста содержит " -"синтаксическую ошибку, LOOT использует наиболее новую версию вместо этой. " -"Синтаксические ошибки обычно небольшие и исправляются в течение нескольких " -"часов." - -#~ msgid "Failed to get %LOCALAPPDATA% path." -#~ msgstr "Не удалось получить путь %LOCALAPPDATA%." - -#~ msgid "None of the supported games were detected." -#~ msgstr "Не удалось найти поддерживаемые игры." - -#~ msgid "Game path could not be detected." -#~ msgstr "Путь к игре найти не удалось." - -#~ msgid "Could not create LOOT folder for game. Details: %1%" -#~ msgstr "Невозможно создать папку LOOT для игры. Детали: %1%" - -#~ msgid "Game path is not initialised." -#~ msgstr "Путь к игре не инициализирован" - -#~ msgid "" -#~ "libloadorder failed to create a game handle. Details could not be fetched." -#~ msgstr "" -#~ "libloadorder не удалось создать дескриптор игры. Детали не могут быть " -#~ "получены." - -#~ msgid "libloadorder failed to create a game handle. Details: %1%" -#~ msgstr "libloadorder не удалось создать дескриптор игры. Детали: %1%" - -#~ msgid "" -#~ "libloadorder failed to check if a plugin is active. Details could not be " -#~ "fetched." -#~ msgstr "" -#~ "libloadorder не удалось проверить активен ли плагин. Детали не могут быть " -#~ "извлечены." - -#~ msgid "libloadorder failed to check if a plugin is active. Details: %1%" -#~ msgstr "libloadorder не удалось проверить активен ли плагин. Details: %1%" - -#~ msgid "" -#~ "libloadorder failed to get the load order. Details could not be fetched." -#~ msgstr "" -#~ "libloadorder не удалось получить порядок загрузки. Детали не могут быть " -#~ "извлечены." - -#~ msgid "libloadorder failed to get the load order. Details: %1%" -#~ msgstr "libloadorder не удалось получить порядок загрузки. Детали: %1%" - -#~ msgid "" -#~ "libloadorder failed to set the load order. Details could not be fetched." -#~ msgstr "" -#~ "libloadorder не удалось установить порядок загрузки. Детали не могут быть " -#~ "получены." - -#~ msgid "libloadorder failed to set the load order. Details: %1%" -#~ msgstr "libloadorder не удалось установить порядок загрузки. Детали: %1%" - -#~ msgid "Git operation failed. Error: %1%" -#~ msgstr "Не удалась операция с Git. Ошибка: %1%" - -#~ msgid "Unable to open \"%1%\" for CRC calculation." -#~ msgstr "Не удается открыть \"%1%\" для подсчета CRC." - -#~ msgid "Failed to open file in its default application." -#~ msgstr "Не удалось открыть файл в приложении по умолчанию." - -#~ msgid "Invalid file path: %1%" -#~ msgstr "Неверный путь к файлу: %1%" - -#~ msgid "Invalid regex string \"%1%\": %2%" -#~ msgstr "Неверная строка regex \"%1%\": %2%" - -#~ msgid "Failed to parse condition \"%1%\": expected \"%2%\" at \"%3%\"." -#~ msgstr "" -#~ "Не удалось обработать выражеие \"%1%\": ожидалось \"%2%\" на \"%3%\"." - -#~ msgid "" -#~ "Failed to parse condition \"%1%\": only partially matched expected syntax." -#~ msgstr "" -#~ "Не удалось обработать выражение \"%1%\": лишь частичное соответствиет " -#~ "ожидаемому синтаксису." - -#~ msgid "Could not create LOOT folder for game. Details:" -#~ msgstr "Не удалось создать папку LOOT для игры. Детали:" - -#~ msgid "libloadorder failed to create a game handle. Details:" -#~ msgstr "libloadorder не удалось создать дескриптор игры. Детали:" - -#~ msgid "libloadorder failed to check if a plugin is active. Details:" -#~ msgstr "libloadorder не удалось проверить активен ли плагин. Детали:" - -#~ msgid "libloadorder failed to get the load order. Details:" -#~ msgstr "libloadorder не удалось получить порядок загрузки. Детали:" - -#~ msgid "libloadorder failed to set the load order. Details:" -#~ msgstr "libloadorder не удалось установить порядок загрузки. Детали:" - -#~ msgid "Invalid file path:" -#~ msgstr "Неверный путь к файлу:" - -#~ msgid "" -#~ "%1% found %2% ITM records, %3% deleted references and %4% deleted " -#~ "navmeshes." -#~ msgstr "" -#~ "%1% содержит %2% ITM-записей, %3% удаленных ссылок и %4% удаленных " -#~ "навмешей." - -#~ msgid "%1% found %2% deleted references and %3% deleted navmeshes." -#~ msgstr "%1% содержит %2% удаленных ссылок и %3% удаленных навмешей." - -#~ msgid "%1% found %2% deleted navmeshes." -#~ msgstr "%1% содержит %2% удаленных навмешей." - -#~ msgid "%1% found %2% deleted references." -#~ msgstr "%1% содержит %2% удаленных ссылок." - -#~ msgid "%1% found %2% ITM records and %3% deleted navmeshes." -#~ msgstr "%1% содержит %2% ITM-записей и %3% удаленных навмешей." - -#~ msgid "%1% found %2% ITM records." -#~ msgstr "%1% содержит %2% ITM-записей." - -#~ msgid "%1% found %2% ITM records and %3% deleted references." -#~ msgstr "%1% содержит %2% ITM-записей и %3% удаленных ссылок." - -#~ msgid "Masterlist revision" -#~ msgstr "Версия мастерлиста" - -#~ msgid "" -#~ "The latest masterlist revision contains a syntax error, LOOT is using the " -#~ "most recent valid revision instead. Syntax errors are usually minor and " -#~ "fixed within hours." -#~ msgstr "" -#~ "Последняя версия мастерлиста содержит синтаксическую ошибку, вместо неё " -#~ "LOOT использует самую последнюю без ошибок. Синтаксические ошибки обычно " -#~ "небольшие и исправляются в считанные часы." - -#~ msgid "" -#~ "This feature is provided so that modders using the Creation Kit may set " -#~ "the load order it uses. A side-effect is that any subscribed Steam " -#~ "Workshop mods will be re-downloaded by Steam. Do you wish to continue?" -#~ msgstr "" -#~ "Эта возможность предоставлена для того, чтобы авторы модов, использующие " -#~ "Creation Kit, могли установить там используемый ими порядок загрузки. " -#~ "Обратная сторона этого то, что любые, подписанные в Steam Workshop моды, " -#~ "могут быть заново загружены с помощью Steam. Вы желаете продолжить?" - -#~ msgid "Invalid game ID supplied." -#~ msgstr "Предоставлен неверный идентификатор игры." - -#~ msgid "Unsupported game ID supplied." -#~ msgstr "Предоставлен неверный идентификатор игры." - -#~ msgid "Expected \"%1%\" at \"%2%\"." -#~ msgstr "Ожидалось \"%1%\" на \"%2%\"." - -#~ msgid "Failed to parse condition \"%1%\": %2%" -#~ msgstr "Не удалось обработать выражение \"%1%\": %2%" - -#~ msgid "Failed to parse condition \"%1%\"." -#~ msgstr "Не удалось обработать выражение \"%1%\"." - -#~ msgid "Failed to change game. Details: %1%" -#~ msgstr "Не удалось изменить игру. Детали: %1%" - -#~ msgid "Failed to copy plugin metadata. Details: %1%" -#~ msgstr "Не удалось скопировать метаданные. Детали: %1%" - -#~ msgid "Failed to apply plugin metadata. Details: %1%" -#~ msgstr "Не удалось применить метаданные плагина. Детали: %1%" - -#~ msgid "" -#~ "An error occurred while parsing the userlist: %1%. This probably happened " -#~ "because an update to LOOT changed its metadata syntax support. Your user " -#~ "metadata will have to be updated manually.\n" -#~ "\n" -#~ "To do so, use the 'Open Debug Log Location' in LOOT's main menu to open " -#~ "its data folder, then open your 'userlist.yaml' file in the relevant game " -#~ "folder. You can then edit the metadata it contains with reference to the " -#~ "[syntax documentation](https://loot.github.io/docs/%2%.%3%.%4%/LOOT%" -#~ "%20Metadata%%20Syntax.html).\n" -#~ "\n" -#~ "You can also seek support on LOOT's forum thread, which is linked to on " -#~ "[LOOT's website](https://loot.github.io/)." -#~ msgstr "" -#~ "Во время обработки мастерлиста произошла ошибка: %1%. Возможно это " -#~ "произошло потому, что в обновлении LOOT изменена поддержка синтаксиса " -#~ "метаданных. Пользовательские метаданные необходимо обновить вручную.\n" -#~ "\n" -#~ "Это делается так, используйте опцию 'Открыть расположение лога отладки' в " -#~ "главном меню LOOT, для открытия папки с данными, тогда откройте ваш файл " -#~ "'userlist.yaml' в соответствующей папке с игрой. Тогда вы сможете " -#~ "отредактировать метаданные, содержащиеся в файле в соовтетствии с " -#~ "[документацией по синтаксису](https://loot.github.io/docs/%2%.%3%.%4%/LOOT" -#~ "%%20Metadata%%20Syntax.html).\n" -#~ "\n" -#~ "Можете также поискать в официальной ветке форума по LOOT, ссылку на " -#~ "которую можно найти на [сайте LOOT](https://loot.github.io/)." - -#~ msgid "Failed to get game data. Details: %1%" -#~ msgstr "Не удалось получить данные игры. Детали: %1%" - -#~ msgid "Failed to update the masterlist. Details: %1%" -#~ msgstr "Не удалось обновить мастерлист. Детали: %1%" - -#~ msgid "Failed to sort plugins. Details: %1%" -#~ msgstr "Не удалось отсортировать плагины. Детали: %1%" - -#~ msgid "An exception occurred while loading this plugin. Details:" -#~ msgstr "Исключение при загрузке этого плагина. Детали:" - -#~ msgid "" -#~ "libloadorder failed to initialise game master file support. Details could " -#~ "not be fetched." -#~ msgstr "" -#~ "libloadorder не удалось инициализировать поддержку мастер-файла игры. " -#~ "Детали не могут быть получены." - -#~ msgid "libloadorder failed to initialise game master file support. Details:" -#~ msgstr "" -#~ "libloadorder не удалось инициализировать поддержку мастер-файла игры. " -#~ "Детали:" - -#~ msgid "" -#~ "libloadorder failed to get the active plugins list. Details could not be " -#~ "fetched." -#~ msgstr "" -#~ "libloadorder не удалось получить список активных плагинов. Детали не " -#~ "могут быть получены." - -#~ msgid "libloadorder failed to get the active plugins list. Details:" -#~ msgstr "libloadorder не удалось получить список активных плагинов. Детали:" - -#~ msgid "" -#~ "Contains %1% ITM records, %2% deleted references and %3% deleted " -#~ "navmeshes. Clean with %4%." -#~ msgstr "" -#~ "Включает %1% ITM записей, %2% удаленных ссылок и %3% удаленных навмешей. " -#~ "Очистить в %4%." - -#~ msgid "Clean with %1%." -#~ msgstr "Очистить с помощью %1%." - -#~ msgid "" -#~ "Contains %1% deleted references and %2% deleted navmeshes. Clean with %3%." -#~ msgstr "" -#~ "Включает %1% удаленных ссылок и %2% удаленных навмешей. Очистить в %3%." - -#~ msgid "Contains %1% deleted navmeshes. Clean with %2%." -#~ msgstr "Содержит %1% удаленных navmesh-записей. Очистить с помощью %2%." - -#~ msgid "Contains %1% deleted references. Clean with %2%." -#~ msgstr "Включает %1% удаленных ссылок. Очистить в %2%." - -#~ msgid "Contains %1% ITM records and %2% deleted navmeshes. Clean with %3%." -#~ msgstr "" -#~ "Содержит %1% ITM записей и %2% удаленных navmesh-записей. Очистить с " -#~ "помощью %3%." - -#~ msgid "Contains %1% ITM records. Clean with %2%." -#~ msgstr "Содержит %1% ITM записей. Очистить с помощью %2%." - -#~ msgid "Contains %1% ITM records and %2% deleted references. Clean with %3%." -#~ msgstr "Включает %1% ITM записей и %2% удаленных ссылок. Очистить в %3%." - -#~ msgid "Building plugin graph..." -#~ msgstr "Построение графика плагина..." - -#~ msgid "Adding edges to plugin graph and performing topological sort..." -#~ msgstr "" -#~ "Добавление страниц к графику плагина и выполнение топологической " -#~ "сортировки..." - -#~ msgid "Checking for conflicting plugins..." -#~ msgstr "Проверка на конфликтующие плагины..." - -#~ msgid "Shell execute failed." -#~ msgstr "Исполнение оболочки не удалось." - -#~ msgid "Loading plugin headers..." -#~ msgstr "Загрузка заголовков плагинов..." - -#~ msgid "Parsing masterlist..." -#~ msgstr "Обработка мастерлиста..." - -#~ msgid "Parsing userlist..." -#~ msgstr "Обработка списка пользовательских правил..." - -#~ msgid "Merging and evaluating plugin metadata..." -#~ msgstr "Объединение и обработка метаданных плагина..." - -#~ msgid "Loading general messages..." -#~ msgstr "Загрузка основных сообщений..." - -#~ msgid "Regenerating displayed content..." -#~ msgstr "Генерация отображаемого содержимого..." - -#~ msgid "Error: Games' settings parsing failed. %1%" -#~ msgstr "Ошибка: Обработка настроек игры не удалась. %1%" - -#~ msgid "Invalid folder path:" -#~ msgstr "Неверный путь к папке:" - -#~ msgid "Invalid regex string:" -#~ msgstr "Неверная строка regex:" - -#~ msgid "Loading game data..." -#~ msgstr "Загрузка данных игры..." - -#~ msgid "Updating masterlist..." -#~ msgstr "Обновление мастерлиста..." - -#~ msgid "Sorting plugins..." -#~ msgstr "Сортировка плагинов..." - -#~ msgid "Refreshing data..." -#~ msgstr "Обновление данных..." - -#~ msgid "Checking if plugins have been loaded..." -#~ msgstr "Проверка загруженности плагинов..." - -#~ msgid "unknown" -#~ msgstr "неизвестно" - -#~ msgid "Loads BSA" -#~ msgstr "Загружает BSA" - -#~ msgid "Show Only Conflicts" -#~ msgstr "Показать только конфликты" - -#~ msgid "" -#~ "Global priorities are compared against all other plugins. Normal " -#~ "priorities are compared against only conflicting plugins." -#~ msgstr "" -#~ "Глобальные приоритеты сравниваются со всеми прочими плагинами. Нормальные " -#~ "приоритеты сравниваются только с конфликтующими." - -#~ msgid "Priority Value" -#~ msgstr "Значение приоритета" - -#~ msgid "Dirty Info" -#~ msgstr "Инфо. о \"грязных\" правках" - -#~ msgid "Filter content" -#~ msgstr "Фильтр содержимого" - -#~ msgid "" -#~ "Double-click a plugin in the sidebar to quickly open its metadata editor. " -#~ "Multiple metadata editors can be opened at once." -#~ msgstr "" -#~ "Кликнете два раза на боковую панель для быстрого открытия редактора " -#~ "метаданных. Несколько редакторов могут быть открыты одновременно." - -#~ msgid "" -#~ "Plugins can be drag and dropped from the sidebar into editors' \"load " -#~ "after\", \"requirements\" and \"incompatibility\" tables." -#~ msgstr "" -#~ "Плагины можно перетащить из боковой панели в таблицы редакторов ' " -#~ "\"грузить после\", \"требования\" и \"несовместимости\"." - -#~ msgid "" -#~ "Some features are disabled while there is an editor open, or while there " -#~ "is a sorted load order that has not been applied or discarded." -#~ msgstr "" -#~ "Некоторые возможности отключены пока открыт редактор или пока не принята " -#~ "или пока порядок загрузки не был применен/отклонен." - -#~ msgid "An exception occurred while loading this plugin. Details: " -#~ msgstr "Исключение при загрузке этого плагина. Детали:" - -#~ msgid "Object memory already allocated!" -#~ msgstr "Память объекта уже выделена!" - -#~ msgid "Tree memory already allocated!" -#~ msgstr "Память древа уже выделена!" - -#~ msgid "Diff memory already allocated!" -#~ msgstr "Память Diff уже выделена!" - -#~ msgid "Repository handle not open!" -#~ msgstr "Обрабатываемое хранилище не открыть!" - -#~ msgid "Rolled back to the previous revision." -#~ msgstr "Выполнен откат к предыдущей версии." - -#~ msgid "An error occurred while parsing the masterlist: %1%" -#~ msgstr "Ошибка при обработке мастерлиста: %1%" - -#~ msgid "An error occurred while parsing the userlist: %1%" -#~ msgstr "Ошибка при обработке списка пользовательских правил: %1%" - -#~ msgid "Version" -#~ msgstr "Версия" - -#~ msgid "Filter content..." -#~ msgstr "Фильтр содержимого..." - -#~ msgid "" -#~ "Contains %1% ITM records, %2% UDR records and %3% deleted navmeshes. " -#~ "Clean with %4%." -#~ msgstr "" -#~ "Содержит %1% ITM записей, %2% UDR записей и %3% удаленных navmesh-" -#~ "записей. Очистить с помощью %1%." - -#~ msgid "Contains %1% UDR records and %2% deleted navmeshes. Clean with %3%." -#~ msgstr "" -#~ "Содержит %1% ITM записей и %2% удаленных navmesh-записей. Очистить с " -#~ "помощью %1%." - -#~ msgid "Contains %1% UDR records. Clean with %2%." -#~ msgstr "Содержит %1% UDR записей. Очистить с помощью %1%." - -#~ msgid "Contains %1% ITM records and %2% UDR records. Clean with %3%." -#~ msgstr "Содержит %1% ITM записей и %2% UDR записей. Очистить с помощью %1%." - -#~ msgid "Yes" -#~ msgstr "Да" - -#, fuzzy -#~ msgid "Dummy Plugin" -#~ msgstr "Грязных плагинов" - -#~ msgid "Click to open the plugin menu." -#~ msgstr "Нажать для открытия меню плагина" - -#~ msgid "Add new row..." -#~ msgstr "Добавить новую строку..." - -#~ msgid "UDR Count" -#~ msgstr "Число UDR" - -#, fuzzy -#~ msgid "Priority Is Global" -#~ msgstr "Глобальный приоритет" - -#~ msgid "Copy Metadata As Text" -#~ msgstr "Копировать метаданные как текст" - -#, fuzzy -#~ msgid "File" -#~ msgstr "&Файл" - -#, fuzzy -#~ msgid "Copy Content As Text" -#~ msgstr "Копировать метаданные как текст" - -#, fuzzy -#~ msgid "Game" -#~ msgstr "&Игра" - -#, fuzzy -#~ msgid "Help" -#~ msgstr "&Справка" - -#~ msgid "Sort" -#~ msgstr "Сортировать" - -#~ msgid "Summary" -#~ msgstr "Сводка" - -#~ msgid "General Messages" -#~ msgstr "Сообщения общего назначения" - -#~ msgid "Press Enter when searching to select the next match." -#~ msgstr "Нажмите Ввод во время поиска, чтобы перейти к следующему совпадению" - -#, fuzzy -#~ msgid "Hide inactive plugin messages" -#~ msgstr "Скрыть все сообщения" - -#, fuzzy -#~ msgid "Hidden plugins" -#~ msgstr "Добавить плагин" - -#, fuzzy -#~ msgid "Hidden messages" -#~ msgstr "Добавить сообщение" - -#~ msgid "Automatically refresh content on window refocus" -#~ msgstr "Автоматически обновлять содержимое при переключении на окно LOOT" - -#~ msgid "" -#~ "Multiple metadata editors can be opened at once, and the menu bar is " -#~ "disabled while any editors are open." -#~ msgstr "" -#~ "За раз может быть открыто сразу несколько редакторов метаданных. При " -#~ "открытых редакторах панель меню будет отключена" - -#~ msgid "" -#~ "Many interface elements have tooltips. If you don't know what something " -#~ "is, try hovering your mouse over it to find out." -#~ msgstr "" -#~ "Большинство элементов интерфейса имеют подсказки. Если вы что-то не " -#~ "знаете, попробуйте навести мышь на элемент." - -#~ msgid "Do not clean." -#~ msgstr "Не чистить." - -#~ msgid "None Specified" -#~ msgstr "Не определено" - -#~ msgid "Compare priority against all other plugins" -#~ msgstr "Сравнивать приоритет со всеми плагинами" - -#~ msgid "Plugin Name" -#~ msgstr "Имя плагина" - -#~ msgid "Copy Plugin Name" -#~ msgstr "Скопировать имя" - -#~ msgid "Copy Plugin Metadata As Text" -#~ msgstr "Скопировать метаданные" - -#~ msgid "Remove Plugin User-Added Metadata" -#~ msgstr "Удалить пользовательские метаданные плагина" - -#~ msgid "" -#~ "Please submit any edits made for reasons other than personal preference " -#~ "to the LOOT team so that they may be included in the masterlist." -#~ msgstr "" -#~ "Пожалуйста, сообщайте команде LOOT о любых сделанных изменениях (кроме " -#~ "личных предпочтений), для того, чтобы эти изменения могли быть внесены в " -#~ "мастерлист." - -#~ msgid "Remove Plugin" -#~ msgstr "Удалить плагин" - -#~ msgid "Plugin" -#~ msgstr "Плагин" - -#~ msgid "Otherwise, priorities are only compared between conflicting plugins." -#~ msgstr "" -#~ "Иначе приоритеты будут сравниваться только между конфликтующими плагинами." - -#~ msgid "Select a plugin to edit its load order metadata." -#~ msgstr "Выберете плагин для правки его метаданных порядка загрузки." - -#~ msgid "" -#~ "Drag and drop a plugin here to make the selected plugin load after it. " -#~ "The \"Show only conflicting plugins\" checkbox must be checked." -#~ msgstr "" -#~ "Перетащите сюда плагин, чтобы сделать его загружвемым после выбранного. " -#~ "Поле \"Показать только конфликтующие плагины\" должно быть отмечено." - -#~ msgid "" -#~ "Plugins with higher priorities will load after plugins with smaller " -#~ "priorities that they conflict with, unless one must explicitly load after " -#~ "the other." -#~ msgstr "" -#~ "Плагины с большим приоритетом будут загружены после конфликтующих " -#~ "плагинов с меньшим, если конечно какой-либо из них должен грузиться " -#~ "конкретно после определенного другого." - -#~ msgid "" -#~ "Filters the plugin list to only display plugins which can be loaded after " -#~ "the currently selected plugin, and which either conflict with it, or, if " -#~ "it loads a BSA, also load BSAs. Also enables drag and drop of plugins " -#~ "into the Load After box." -#~ msgstr "" -#~ "Фильтры для списка плагинов, для отображения только плагинов, которые " -#~ "могут быть загружены после выбранного плагина и которые имеют любой " -#~ "конфликт с ним или если он грузит BSA, также грузят BSA. Также включает " -#~ "перетаскивание плагинов в поле Грузить после." - -#~ msgid "" -#~ "Only newly-added plugins may be removed here. Use the metadata editor to " -#~ "remove other user-added plugins." -#~ msgstr "" -#~ "Только вновь добавленные плагины могут быть удалены отсюда. Используйте " -#~ "редактор метаданных, для удаления других, добавленных пользователем " -#~ "плагинов." - -#~ msgid "Enable User Changes" -#~ msgstr "Включить пользовательские правки" - -#~ msgid "Add File" -#~ msgstr "Добавить файл" - -#~ msgid "Edit File" -#~ msgstr "Править файл" - -#~ msgid "Remove File" -#~ msgstr "Удалить файл" - -#~ msgid "Save Changes" -#~ msgstr "Сохранить изменения" - -#~ msgid "Copy Name" -#~ msgstr "Скопировать имя" - -#~ msgid "" -#~ "If unchecked, any user-added metadata will be ignored during sorting." -#~ msgstr "" -#~ "Если не помечено, любые добавленные пользователем метаданные будут " -#~ "проигнорированы при сортировке." - -#~ msgid "Only user-added data may be removed." -#~ msgstr "Только добавленные пользователем данные могут быть удалены." - -#~ msgid "" -#~ "Are you sure you want to clear all existing user-added metadata from this " -#~ "plugin?" -#~ msgstr "" -#~ "Вы уверены, что хотите очистить все существующие пользовательские " -#~ "метаданные для этого плагина?" - -#~ msgid "LOOT: Warning" -#~ msgstr "LOOT: Предупреждение" - -#~ msgid "Edit Plugin" -#~ msgstr "Править плагин" - -#~ msgid "Edit Message" -#~ msgstr "Править сообщение" - -#~ msgid "Remove Message" -#~ msgstr "Удалить сообщение" - -#~ msgid "Add Bash Tag" -#~ msgstr "Добавить Bash-тег" - -#~ msgid "Edit Bash Tag" -#~ msgstr "Править Bash-тег" - -#~ msgid "Remove Bash Tag" -#~ msgstr "Удалить Bash-тег" - -#~ msgid "Add Dirty Info" -#~ msgstr "Добавить инфо. о \"грязных\" правках" - -#~ msgid "Edit Dirty Info" -#~ msgstr "Править инфо. о \"грязных\" правках" - -#~ msgid "Remove Dirty Info" -#~ msgstr "Удалить инфо. о \"грязных\" правках" - -#~ msgid "LOOT: Add File/Plugin" -#~ msgstr "LOOT: Добавить файл/плагин" - -#~ msgid "LOOT: Add Message" -#~ msgstr "LOOT: Добавить сообщение" - -#~ msgid "Error: No content specified. Row will not be added." -#~ msgstr "Ошибка: Не указано содержимое. Строка не будет добавлена." - -#~ msgid "LOOT: Error" -#~ msgstr "LOOT: Ошибка" - -#~ msgid "LOOT: Add Tag" -#~ msgstr "LOOT: Добавить тег" - -#~ msgid "LOOT: Add Dirty Info" -#~ msgstr "LOOT: Добавить инфо. о \"грязных\" правках" - -#~ msgid "LOOT: Edit File/Plugin" -#~ msgstr "LOOT: Править файл/плагин" - -#~ msgid "LOOT: Edit Message" -#~ msgstr "LOOT: Править сообщение" - -#~ msgid "Error: No content specified. Row will not be edited." -#~ msgstr "Ошибка: Не указано содержимое. Строка не будет добавлена." - -#~ msgid "LOOT: Edit Tag" -#~ msgstr "LOOT: Править тег" - -#~ msgid "LOOT: Edit Dirty Info" -#~ msgstr "LOOT: Править инфо. о \"грязных\" правках" - -#~ msgid "" -#~ "If LOOT has gotten something wrong, please let the team know. See the " -#~ "Contributing To LOOT section of the readme for details." -#~ msgstr "" -#~ "Если LOOT сделал что-то неправильно, пожалуйста, сообщите об этом " -#~ "команде. Подробнее в секции Contributing To LOOT, в документации." - -#~ msgid "Masterlist update failed. Details: %1%" -#~ msgstr "Проверка обновлений мастерлиста не удалась. Детали: %1%" - -#~ msgid "Masterlist revision check failed. Details: %1%" -#~ msgstr "Проверка версии мастерлиста не удалась. Детали: %1%" - -#~ msgid "Masterlist parsing failed. Details: %1%" -#~ msgstr "Обработка мастерлиста не удалась. Детали: %1%" - -#~ msgid "Unknown" -#~ msgstr "Неизвестно" - -#~ msgid "Error: LOOT is already running. This instance will now quit." -#~ msgstr "Ошибка: LOOT уже запущен. Этот экземпляр будет закрыт." - -#~ msgid "Error: Could not apply translation." -#~ msgstr "Ошибка: Невозможно применить перевод." - -#~ msgid "Error: The selected language is not available on this system." -#~ msgstr "Ошибка: Выбранный язык не доступен на этой системе." - -#~ msgid "Error: None of the supported games were detected." -#~ msgstr "Ошибка: Не найдено ни одной поддерживаемой игры." - -#~ msgid "View Last Report" -#~ msgstr "Просмотр последнего отчета" - -#~ msgid "&View Last Report" -#~ msgstr "&Просмотр последнего отчета" - -#~ msgid "View &Debug Log" -#~ msgstr "Просмотр лога &отладки" - -#~ msgid "&Sort Plugins" -#~ msgstr "&Сортировать плагины" - -#~ msgid "&Metadata..." -#~ msgstr "&Метаданные..." - -#~ msgid "&Edit" -#~ msgstr "&Правка" - -#~ msgid "" -#~ "Opens the Metadata Editor, where plugins' sorting metadata, messages, " -#~ "dirty info and Bash Tag suggestions can be edited." -#~ msgstr "" -#~ "Открывает редактор метаданных, где присутствуют метаданные сортировки " -#~ "плагинов: сообщения, инфо о грязных правках, теги для Wrye Bash, которые " -#~ "могут быть изменены." - -#~ msgid "Sorts your plugins, then displays a report of the results." -#~ msgstr "Сортирует ваши плагины, а после отображает отчет с результатами." - -#~ msgid "Opens the last report generated for the current game." -#~ msgstr "Открывает последний отчет, сгенерированный для текущей игры." - -#~ msgid "LOOT: Report Viewer" -#~ msgstr "LOOT: Просмотр отчета" - -#~ msgid "LOOT: Settings" -#~ msgstr "LOOT: Настройки" - -#~ msgid "Error: \"%1%\" cannot be found." -#~ msgstr "Ошибка: \"%1%\" не найден." - -#~ msgid "" -#~ "Load order optimisation for Oblivion, Skyrim, Fallout 3 and Fallout: New " -#~ "Vegas." -#~ msgstr "" -#~ "Оптимизация порядка загрузки для Oblivion, Skyrim, Fallout 3 и Fallout: " -#~ "New Vegas." - -#~ msgid "LOOT: Working..." -#~ msgstr "LOOT: Работает..." - -#~ msgid "LOOT working..." -#~ msgstr "LOOT работает..." - -#~ msgid "Userlist parsing failed. Details: %1%" -#~ msgstr "Обработка пользовательского списка не удалась. Детали: %1%" - -#~ msgid "LOOT: Calculated Load Order" -#~ msgstr "LOOT: Рассчитанный порядок загрузки" - -#~ msgid "Recalculating load order..." -#~ msgstr "Пересчет порядка загрузки..." - -#~ msgid "Failed to set the load order. Details: %1%" -#~ msgstr "Не удалось установить порядок загрузки. Детали: %1%" - -#~ msgid "" -#~ "The load order displayed in the Details tab was not applied as sorting " -#~ "was canceled." -#~ msgstr "" -#~ "Порядок загрузки, показанный на вкладке Детали не был применен, так как " -#~ "сортировка была отменена." - -#~ msgid "Failed to calculate the load order. Details: %1%" -#~ msgstr "Не удалось рассчитать порядок загрузки. Детали: %1%" - -#~ msgid "Error: %1%" -#~ msgstr "Ошибка: %1%" - -#~ msgid "Error: Masterlist parsing failed. %1%" -#~ msgstr "Ошибка: Обработка мастерлиста не удалась. %1%" - -#~ msgid "Error: Userlist parsing failed. %1%" -#~ msgstr "Ошибка: Обработка пользовательского списка не удалась. %1%" - -#~ msgid "LOOT: Metadata Editor" -#~ msgstr "LOOT: Редактор метаданных" - -#~ msgid "Error: Failed to get load order. %1%" -#~ msgstr "Ошибка: Не удалось получить порядок загрузки. %1%" - -#~ msgid "Error: Failed to set plugin timestamps. %1%" -#~ msgstr "Ошибка: Не удалось присвоить временные метки плагинам. %1%" - -#~ msgid "LOOT: Plugin Redate" -#~ msgstr "LOOT: Редатирование плагинов" - -#~ msgid "Filename (required):" -#~ msgstr "Имя файла (требуется):" - -#~ msgid "Displayed Name:" -#~ msgstr "Отображаемое имя:" - -#~ msgid "Condition:" -#~ msgstr "Выражение:" - -#~ msgid "Add Content" -#~ msgstr "Добавить содержимое" - -#~ msgid "Edit Content" -#~ msgstr "Править содержимое" - -#~ msgid "String" -#~ msgstr "Строка" - -#~ msgid "Type:" -#~ msgstr "Тип:" - -#~ msgid "Language:" -#~ msgstr "Язык:" - -#~ msgid "Content:" -#~ msgstr "Содержимое:" - -#~ msgid "Error: No content row selected." -#~ msgstr "Ошибка: Не выбрана строка с содержимым." - -#~ msgid "Add/Remove:" -#~ msgstr "Добавить/Удалить:" - -#~ msgid "Name (required):" -#~ msgstr "Имя (требуется):" - -#~ msgid "CRC (required):" -#~ msgstr "CRC (требуется):" - -#~ msgid "ITM Count:" -#~ msgstr "Число ITM:" - -#~ msgid "UDR Count:" -#~ msgstr "Число UDR:" - -#~ msgid "Deleted Navmesh Count:" -#~ msgstr "Число удаленных Navmesh-записей:" - -#~ msgid "Cleaning Utility (required):" -#~ msgstr "Утилита для очистки (требуется):" - -#~ msgid "None" -#~ msgstr "Нет" - -#~ msgid "Low" -#~ msgstr "Низкая" - -#~ msgid "Medium" -#~ msgstr "Средняя" - -#~ msgid "High" -#~ msgstr "Высокая" - -#~ msgid "Add Game" -#~ msgstr "Добавить игру" - -#~ msgid "Edit Game" -#~ msgstr "Редактировать игру" - -#~ msgid "Remove Game" -#~ msgstr "Удалить игру" - -#~ msgid "View reports externally in default browser." -#~ msgstr "Просмотреть отчет во внешнем браузере по умолчанию." - -#~ msgid "Debug Verbosity:" -#~ msgstr "Детализация отладки:" - -#~ msgid "LOOT: Add Game" -#~ msgstr "LOOT: Добавить игру" - -#~ msgid "" -#~ "Error: A path and/or registry key is required. Row will not be added." -#~ msgstr "" -#~ "Ошибка: Требуется путь и/или ключ реестра. Строка не будет добавлена." - -#~ msgid "" -#~ "Error: A game with this name is already defined. Row will not be added." -#~ msgstr "" -#~ "Ошибка: Игра с этим именем уже определена. Строка не будет добавлена." - -#~ msgid "" -#~ "Error: A game with this folder name is already defined. Row will not be " -#~ "added." -#~ msgstr "" -#~ "Ошибка: Игра с этим именем папки уже определена. Строка не будет " -#~ "добавлена." - -#~ msgid "LOOT: Edit Game" -#~ msgstr "LOOT: Править игру" - -#~ msgid "Error: Name is required. Row will not be added." -#~ msgstr "Ошибка: Требуется имя. Строка не будет добавлена." - -#~ msgid "Error: Folder is required. Row will not be added." -#~ msgstr "Ошибка: Требуется папка. Строка не будет добавлена." - -#~ msgid "LOOT Folder Name (required):" -#~ msgstr "LOOT: Имя папки (требуется):" - -#~ msgid "Master File:" -#~ msgstr "Мастерфайл:" - -#~ msgid "Masterlist Repository URL:" -#~ msgstr "URL хранилища мастерлиста:" - -#~ msgid "Masterlist Repository Branch:" -#~ msgstr "Ветка хранилища мастерлиста:" - -#~ msgid "Install Path:" -#~ msgstr "Путь установки:" - -#~ msgid "Install Path Registry Key:" -#~ msgstr "Ключ реестра для пути установки:" - -#~ msgid "Version Information" -#~ msgstr "Информация о версии" - -#~ msgid "Plugin & Message Counts" -#~ msgstr "Количество плагинов и сообщений" - -#~ msgid "Note:" -#~ msgstr "Примечание:" - -#~ msgid "Bash Tag Suggestion(s):" -#~ msgstr "Bash-теги:" - -#~ msgid "Warning:" -#~ msgstr "Предупреждение:" - -#~ msgid "Error:" -#~ msgstr "Ошибка:" - -#~ msgid "LOOT Report" -#~ msgstr "Отчет LOOT" - -#~ msgid "Details" -#~ msgstr "Детали" - -#~ msgid "LOOT Version" -#~ msgstr "Версия LOOT" - -#~ msgid "Masterlist Version" -#~ msgstr "Версия мастерлиста" - -#~ msgid "Masterlist Updating" -#~ msgstr "Обновление мастерлиста" - -#~ msgid "Disabled" -#~ msgstr "Отключено" - -#~ msgid "" -#~ "There have been no changes in the Details tab since LOOT was last run for " -#~ "this game." -#~ msgstr "" -#~ "Никаких изменений во вкладке Детали, со времени последнего запуска LOOT " -#~ "для этой игры." - -#~ msgid "Total Number of Messages" -#~ msgstr "Общее число сообщений" - -#~ msgid "Number of Warnings" -#~ msgstr "Количество предупреждений" - -#~ msgid "Number of Errors" -#~ msgstr "Количество ошибок" - -#~ msgid "Version:" -#~ msgstr "Версия:" - -#~ msgid "Add:" -#~ msgstr "Добавить:" - -#~ msgid "Remove:" -#~ msgstr "Удалить:" - -#~ msgid "" -#~ "The LOOT Report requires Javascript to be enabled in order to function." -#~ msgstr "Для работы всех функций отчета LOOT требуется включить JavaScript" - -#~ msgid "Hide Bash Tag Suggestions" -#~ msgstr "Скрыть Bash-теги" - -#~ msgid "%1% of %2% plugins hidden." -#~ msgstr "%1% из %2% плагинов скрыто." - -#~ msgid "%1% of %2% messages hidden." -#~ msgstr "%1% из %2% сообщений скрыто." - -#~ msgid "\"%1%\" is required by \"%2%\" but is missing." -#~ msgstr "\"%1%\" требуется для \"%2%\", но отсутствует." - -#~ msgid "Could not create pipe for process." -#~ msgstr "Невозможно создать канал для процесса." - -#~ msgid "Could not create process." -#~ msgstr "Невозможно создать процесс." - -#~ msgid "Could not get process exit code." -#~ msgstr "Не удалось получить код выхода процесса." - -#~ msgid "Could not read process output." -#~ msgstr "Не удалось прочесть выходной поток процесса." - -#~ msgid "Failed to generate graph image. Details: %1%" -#~ msgstr "Не удалось сгенерировать изображение графика. Детали: %1%" - -#~ msgid "" -#~ "A load order optimisation tool for games using the Elder Scrolls Plugin/" -#~ "Master system." -#~ msgstr "" -#~ "Инструмент для оптимизации порядка загрузки, для игр, использующих " -#~ "систему плагин/мастер Elder Scrolls." - -#~ msgid "Up" -#~ msgstr "Выше" - -#~ msgid "Down" -#~ msgstr "Ниже" - -#~ msgid "Load Order" -#~ msgstr "Порядок загрузки" - -#~ msgid "Generate and display plugin graph images." -#~ msgstr "Сгенерировать и отобразить изображения графиков плагинов" - -#~ msgid "Online Masterlist URL" -#~ msgstr "URL онлайн-мастерлиста" - -#~ msgid "Graph" -#~ msgstr "График" - -#~ msgid "No change in details since last run." -#~ msgstr "Никаких изменений в деталях с последнего запуска." - -#~ msgid "Could not write BOSS report." -#~ msgstr "Не удалось записать отчет BOSS." - -#~ msgid "Name:" -#~ msgstr "Имя:" - -#~ msgid "Error: No filename specified. Row will not be added." -#~ msgstr "Ошибка: Не указано имя файла. Строка не будет добавлена." - -#~ msgid "Error: No Bash Tag specified. Row will not be added." -#~ msgstr "Ошибка: Не указан Bash-тег. Строка не будет добавлена." - -#~ msgid "Error: No filename specified. Row will not be edited." -#~ msgstr "Ошибка: Не указано имя файла. Строка не будет добавлена." - -#~ msgid "Error: No Bash Tag specified. Row will not be edited." -#~ msgstr "Ошибка: Не указан Bash-тег. Строка не будет добавлена." - -#~ msgid "Add %1%." -#~ msgstr "Добавить %1%." diff --git a/resources/l10n/sv/LC_MESSAGES/loot.po b/resources/l10n/sv/LC_MESSAGES/loot.po deleted file mode 100644 index 0345269e..00000000 --- a/resources/l10n/sv/LC_MESSAGES/loot.po +++ /dev/null @@ -1,954 +0,0 @@ -# LOOT - translation into Swedish (sv). -# Copyright (C) YEAR WrinklyNinja -# This file is distributed under the same license as the LOOT package. -# Mikael Hiort af Ornäs , 2016. -msgid "" -msgstr "" -"Project-Id-Version: LOOT 0.9.2\n" -"Report-Msgid-Bugs-To: https://github.com/loot/loot/issues\n" -"POT-Creation-Date: 2016-07-28 16:31+0200\n" -"PO-Revision-Date: 2016-10-10 15:34+0200\n" -"Last-Translator: Mikael Hiort af Ornäs \n" -"Language-Team: Svenska\n" -"Language: sv\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 1.8.9\n" - -#: src/gui/html/js/events.js:16 -msgid "Identifying conflicting plugins..." -msgstr "Identifierar insticksmoduler i konflikt..." - -#: src/gui/html/js/events.js:96 -msgid "No masterlist update was necessary." -msgstr "Huvudlistan behövde inte uppdateras." - -#: src/gui/html/js/events.js:146 -msgid "Sorting made no changes to the load order." -msgstr "Sorteringen innebar inga ändringar av inläsningsordningen." - -#: src/gui/html/js/events.js:178 -msgid "Redate Plugins?" -msgstr "Ändra datum på insticksmoduler?" - -#: src/gui/html/js/events.js:178 -msgid "" -"This feature is provided so that modders using the Creation Kit may set the " -"load order it uses. A side-effect is that any subscribed Steam Workshop mods " -"will be re-downloaded by Steam. Do you wish to continue?" -msgstr "" -"Denna funktion tillhandahålls för att ge moddare som använder Creation Kit " -"möjlighet att ange inläsningsordningen som det använder. En bieffekt är att " -"alla prenumererade Steam Workshop-moddar kommer att hämtas på nytt av Steam. " -"Vill du fortsätta?" - -#: src/gui/html/js/events.js:178 -msgid "Redate" -msgstr "Ändra datum" - -#: src/gui/html/js/events.js:187 -msgid "" -"Are you sure you want to clear all existing user-added metadata from all " -"plugins?" -msgstr "" -"Är du säker på att du vill rensa all befintlig användartillagd metadata från " -"samtliga insticksmoduler?" - -#: src/gui/html/js/events.js:187 src/gui/html/js/events.js:395 -msgid "Clear" -msgstr "Rensa" - -#: src/gui/html/js/events.js:198 -msgid "All user-added metadata has been cleared." -msgstr "All användartillagd metadata har tagits bort." - -#: src/gui/html/js/events.js:221 -msgid "LOOT's content has been copied to the clipboard." -msgstr "LOOT:s innehåll har kopierats till Urklipp." - -#: src/gui/html/js/events.js:232 -msgid "The load order has been copied to the clipboard." -msgstr "Inläsningsordningen har kopierats till Urklipp." - -#: src/gui/html/js/events.js:263 src/gui/html/js/translateStaticText.js:182 -msgid "Quit" -msgstr "Avsluta" - -#: src/gui/html/js/events.js:275 -msgid "sorted load order" -msgstr "sorterade inläsningsordning" - -#: src/gui/html/js/events.js:277 -msgid "metadata edits" -msgstr "redigeringar av metadata" - -#: src/gui/html/js/filters.js:28 -msgid "Do not clean" -msgstr "Rensa inte" - -#: src/gui/html/js/game.js:22 -msgid "N/A" -msgstr "i.u." - -#: src/gui/html/js/handlePromiseError.js:15 -#: src/gui/html/js/translateStaticText.js:111 -msgid "Error" -msgstr "Fel" - -#: src/gui/html/js/translateStaticText.js:17 -msgid "Active Plugin" -msgstr "Aktiverad insticksmodul" - -#: src/gui/html/js/translateStaticText.js:18 -#: src/gui/html/js/translateStaticText.js:251 -msgid "Master File" -msgstr "Huvudfil" - -#: src/gui/html/js/translateStaticText.js:19 -msgid "Empty Plugin" -msgstr "Tom insticksmodul" - -#: src/gui/html/js/translateStaticText.js:20 -msgid "Loads Archive" -msgstr "Läser in arkiv" - -#: src/gui/html/js/translateStaticText.js:21 -#: src/gui/html/js/translateStaticText.js:85 -msgid "Has User Metadata" -msgstr "Har användarmetadata" - -#: src/gui/html/js/translateStaticText.js:23 -msgid "Edit Metadata" -msgstr "Redigera metadata" - -#: src/gui/html/js/translateStaticText.js:24 -msgid "Copy Metadata" -msgstr "Kopiera metadata" - -#: src/gui/html/js/translateStaticText.js:25 -msgid "Clear User Metadata" -msgstr "Rensa användarmetadata" - -#: src/gui/html/js/translateStaticText.js:32 -msgid "Enable Edits" -msgstr "Aktivera redigering" - -#: src/gui/html/js/translateStaticText.js:33 -#: src/gui/html/js/translateStaticText.js:84 -msgid "Global Priority" -msgstr "Global prioritering" - -#: src/gui/html/js/translateStaticText.js:34 -msgid "" -"Global priorities are compared against all other plugins. Normal priorities " -"are compared against only conflicting plugins." -msgstr "" -"Globalt prioriterade insticksmoduler jämförs med alla andra insticksmoduler. " -"Normalt prioriterade insticksmoduler jämförs endast med insticksmoduler i " -"konflikt." - -#: src/gui/html/js/translateStaticText.js:35 -msgid "Priority Value" -msgstr "Prioritetsvärde" - -#: src/gui/html/js/translateStaticText.js:37 -msgid "Main" -msgstr "Grundläggande" - -#: src/gui/html/js/translateStaticText.js:38 -msgid "Load After" -msgstr "Läs in efter" - -#: src/gui/html/js/translateStaticText.js:39 -msgid "Requirements" -msgstr "Krav" - -#: src/gui/html/js/translateStaticText.js:40 -msgid "Incompatibilities" -msgstr "Kompatibilitetsproblem" - -#: src/gui/html/js/translateStaticText.js:41 -msgid "Messages" -msgstr "Meddelanden" - -#: src/gui/html/js/translateStaticText.js:42 -msgid "Bash Tags" -msgstr "Bashtaggar" - -#: src/gui/html/js/translateStaticText.js:43 -msgid "Dirty Info" -msgstr "Ändringsinfo" - -#: src/gui/html/js/translateStaticText.js:44 -msgid "Locations" -msgstr "Platser" - -#: src/gui/html/js/translateStaticText.js:46 -#: src/gui/html/js/translateStaticText.js:50 -#: src/gui/html/js/translateStaticText.js:54 -msgid "Filename" -msgstr "Filnamn" - -#: src/gui/html/js/translateStaticText.js:47 -#: src/gui/html/js/translateStaticText.js:51 -#: src/gui/html/js/translateStaticText.js:55 -msgid "Display Name" -msgstr "Visningsnamn" - -#: src/gui/html/js/translateStaticText.js:48 -#: src/gui/html/js/translateStaticText.js:52 -#: src/gui/html/js/translateStaticText.js:56 -#: src/gui/html/js/translateStaticText.js:60 -#: src/gui/html/js/translateStaticText.js:65 -msgid "Condition" -msgstr "Villkor" - -#: src/gui/html/js/translateStaticText.js:58 -msgid "Type" -msgstr "Typ" - -#: src/gui/html/js/translateStaticText.js:59 -msgid "Content" -msgstr "Innehåll" - -#: src/gui/html/js/translateStaticText.js:61 -#: src/gui/html/js/translateStaticText.js:239 -msgid "Language" -msgstr "Språk" - -#: src/gui/html/js/translateStaticText.js:63 -msgid "Add/Remove" -msgstr "Lägg till/Ta bort" - -#: src/gui/html/js/translateStaticText.js:64 -msgid "Bash Tag" -msgstr "Bashtagg" - -#: src/gui/html/js/translateStaticText.js:67 -msgid "CRC" -msgstr "CRC" - -#: src/gui/html/js/translateStaticText.js:68 -msgid "ITM Count" -msgstr "Antal ITM" - -#: src/gui/html/js/translateStaticText.js:69 -msgid "Deleted References" -msgstr "Borttagna referenser" - -#: src/gui/html/js/translateStaticText.js:70 -msgid "Deleted Navmeshes" -msgstr "Borttagna navigeringsytor" - -#: src/gui/html/js/translateStaticText.js:71 -msgid "Cleaning Utility" -msgstr "Rensningsverktyg" - -#: src/gui/html/js/translateStaticText.js:73 -msgid "URL" -msgstr "URL" - -#: src/gui/html/js/translateStaticText.js:74 -#: src/gui/html/js/translateStaticText.js:248 -msgid "Name" -msgstr "Namn" - -#: src/gui/html/js/translateStaticText.js:76 -msgid "Save Metadata" -msgstr "Spara metadata" - -#: src/gui/html/js/translateStaticText.js:77 -#: src/gui/html/js/translateStaticText.js:94 -#: src/gui/html/js/translateStaticText.js:169 -#: src/gui/html/js/translateStaticText.js:262 -msgid "Cancel" -msgstr "Avbryt" - -#: src/gui/html/js/translateStaticText.js:86 -msgid "Editor Is Open" -msgstr "Redigeraren är öppen" - -#: src/gui/html/js/translateStaticText.js:93 -#: src/gui/html/js/translateStaticText.js:276 -msgid "OK" -msgstr "OK" - -#: src/gui/html/js/translateStaticText.js:101 -msgid "A filename is required." -msgstr "Du måste ange ett filnamn." - -#: src/gui/html/js/translateStaticText.js:102 -#: src/gui/html/js/translateStaticText.js:113 -#: src/gui/html/js/translateStaticText.js:123 -#: src/gui/html/js/translateStaticText.js:135 -#: src/gui/html/js/translateStaticText.js:143 -#: src/gui/html/js/translateStaticText.js:152 -msgid "Delete Row" -msgstr "Ta bort rad" - -#: src/gui/html/js/translateStaticText.js:109 -msgid "Note" -msgstr "Anteckning" - -#: src/gui/html/js/translateStaticText.js:110 -msgid "Warning" -msgstr "Varning" - -#: src/gui/html/js/translateStaticText.js:112 -msgid "A content string is required." -msgstr "Du måste ange en innehållssträng." - -#: src/gui/html/js/translateStaticText.js:120 -msgid "Add" -msgstr "Lägg till" - -#: src/gui/html/js/translateStaticText.js:121 -msgid "Remove" -msgstr "Ta bort" - -#: src/gui/html/js/translateStaticText.js:122 -#: src/gui/html/js/translateStaticText.js:150 -msgid "A name is required." -msgstr "Du måste ange ett namn." - -#: src/gui/html/js/translateStaticText.js:130 -msgid "A CRC is required." -msgstr "Du måste ange ett CRC." - -#: src/gui/html/js/translateStaticText.js:131 -#: src/gui/html/js/translateStaticText.js:132 -#: src/gui/html/js/translateStaticText.js:133 -msgid "Values must be integers." -msgstr "Angivna värden måste vara heltal." - -#: src/gui/html/js/translateStaticText.js:134 -msgid "A utility name is required." -msgstr "Du måste ange ett verktygsnamn." - -#: src/gui/html/js/translateStaticText.js:142 -msgid "A link is required." -msgstr "Du måste ange en länk." - -#: src/gui/html/js/translateStaticText.js:151 -msgid "A folder is required." -msgstr "Du måste ange en mapp." - -#: src/gui/html/js/translateStaticText.js:159 -#: src/gui/html/js/translateStaticText.js:259 -msgid "Add New Row" -msgstr "Lägg till ny rad" - -#: src/gui/html/js/translateStaticText.js:165 -msgid "Jump To General Information" -msgstr "Hoppa till allmän information" - -#: src/gui/html/js/translateStaticText.js:166 -msgid "Sort Plugins" -msgstr "Sortera insticksmoduler" - -#: src/gui/html/js/translateStaticText.js:167 -msgid "Update Masterlist" -msgstr "Uppdatera huvudlista" - -#: src/gui/html/js/translateStaticText.js:168 -#: src/gui/html/js/translateStaticText.js:261 -msgid "Apply" -msgstr "Verkställ" - -#: src/gui/html/js/translateStaticText.js:170 -msgid "Search Cards" -msgstr "Sökkort" - -#: src/gui/html/js/translateStaticText.js:173 -msgid "Redate Plugins" -msgstr "Ändra insticksmoduldatum" - -#: src/gui/html/js/translateStaticText.js:174 -msgid "Open Debug Log Location" -msgstr "Öppna felsökningsloggens mapp" - -#: src/gui/html/js/translateStaticText.js:175 -msgid "Clear All User Metadata" -msgstr "Rensa all användarmetadata" - -#: src/gui/html/js/translateStaticText.js:176 -msgid "Copy Load Order" -msgstr "Kopiera inläsningsordning" - -#: src/gui/html/js/translateStaticText.js:177 -msgid "Copy Content" -msgstr "Kopiera innehåll" - -#: src/gui/html/js/translateStaticText.js:178 -msgid "Refresh Content" -msgstr "Uppdatera innehåll" - -#: src/gui/html/js/translateStaticText.js:179 -msgid "View Documentation" -msgstr "Visa hjälpdokumentation" - -#: src/gui/html/js/translateStaticText.js:180 -msgid "About" -msgstr "Om" - -#: src/gui/html/js/translateStaticText.js:181 -#: src/gui/html/js/translateStaticText.js:231 -msgid "Settings" -msgstr "Inställningar" - -#: src/gui/html/js/translateStaticText.js:185 -msgid "Search cards" -msgstr "Sökkort" - -#: src/gui/html/js/translateStaticText.js:190 -msgid "Plugins" -msgstr "Insticksmoduler" - -#: src/gui/html/js/translateStaticText.js:191 -msgid "Filters" -msgstr "Filter" - -#: src/gui/html/js/translateStaticText.js:192 -msgid "Press Enter or click outside the input to set the filter." -msgstr "" -"Tryck på Retur eller klicka utanför inmatningsrutan för att ställa in " -"filtret." - -#: src/gui/html/js/translateStaticText.js:193 -msgid "Show only plugins with cards that contain" -msgstr "Visa endast insticksmoduler med kort som innehåller" - -#: src/gui/html/js/translateStaticText.js:194 -msgid "No text specified" -msgstr "Ingen text har angivits" - -#: src/gui/html/js/translateStaticText.js:197 -msgid "Hide version numbers" -msgstr "Dölj versionsnummer" - -#: src/gui/html/js/translateStaticText.js:198 -msgid "Hide CRCs" -msgstr "Dölj CRC:er" - -#: src/gui/html/js/translateStaticText.js:199 -msgid "Hide Bash Tags" -msgstr "Dölj bashtaggar" - -#: src/gui/html/js/translateStaticText.js:200 -msgid "Hide notes" -msgstr "Dölj anteckningar" - -#: src/gui/html/js/translateStaticText.js:201 -msgid "Hide 'Do not clean' messages" -msgstr "Dölj meddelandet \"Rensa inte\"" - -#: src/gui/html/js/translateStaticText.js:202 -msgid "Hide all plugin messages" -msgstr "Dölj alla insticksmodulmeddelanden" - -#: src/gui/html/js/translateStaticText.js:203 -msgid "Hide inactive plugins" -msgstr "Dölj inaktiverade insticksmoduler" - -#: src/gui/html/js/translateStaticText.js:204 -msgid "Hide messageless plugins" -msgstr "Dölj insticksmoduler som saknar meddelanden" - -#: src/gui/html/js/translateStaticText.js:207 -msgid "Show only conflicting plugins for" -msgstr "Visa endast insticksmoduler i konflikt för" - -#: src/gui/html/js/translateStaticText.js:208 -msgid "No plugin selected" -msgstr "Inga insticksmoduler har markerats" - -#: src/gui/html/js/translateStaticText.js:212 -msgid "Hidden plugins:" -msgstr "Dolda insticksmoduler:" - -#: src/gui/html/js/translateStaticText.js:213 -msgid "Hidden messages:" -msgstr "Dolda meddelanden:" - -#: src/gui/html/js/translateStaticText.js:218 -msgid "General Information" -msgstr "Allmän information" - -#: src/gui/html/js/translateStaticText.js:219 -msgid "Masterlist Revision" -msgstr "Huvudlistans revision" - -#: src/gui/html/js/translateStaticText.js:220 -msgid "Masterlist Date" -msgstr "Huvudlistans datum" - -#: src/gui/html/js/translateStaticText.js:221 -msgid "Warnings" -msgstr "Varningar" - -#: src/gui/html/js/translateStaticText.js:222 -msgid "Errors" -msgstr "Fel" - -#: src/gui/html/js/translateStaticText.js:223 -msgid "Total Messages" -msgstr "Totalt antal meddelanden" - -#: src/gui/html/js/translateStaticText.js:224 -msgid "Active Plugins" -msgstr "Aktiverade insticksmoduler" - -#: src/gui/html/js/translateStaticText.js:225 -msgid "Dirty Plugins" -msgstr "Ändrade insticksmoduler" - -#: src/gui/html/js/translateStaticText.js:226 -msgid "Total Plugins" -msgstr "Totalt antal insticksmoduler" - -#: src/gui/html/js/translateStaticText.js:234 -msgid "Default Game" -msgstr "Standardspel" - -#: src/gui/html/js/translateStaticText.js:235 -msgid "Autodetect" -msgstr "Identifiera automatiskt" - -#: src/gui/html/js/translateStaticText.js:240 -msgid "Language changes will be applied after LOOT is restarted." -msgstr "Byte av språk kommer att verkställas efter omstart av LOOT." - -#: src/gui/html/js/translateStaticText.js:242 -msgid "Enable debug logging" -msgstr "Aktivera felsökningsloggning" - -#: src/gui/html/js/translateStaticText.js:243 -msgid "The output is logged to the LOOTDebugLog.txt file." -msgstr "Utdata loggas i filen LOOTDebugLog.txt." - -#: src/gui/html/js/translateStaticText.js:245 -msgid "Update masterlist before sorting" -msgstr "Uppdatera huvudlistan innan sortering" - -#: src/gui/html/js/translateStaticText.js:249 -msgid "Base Game" -msgstr "Basspel" - -#: src/gui/html/js/translateStaticText.js:250 -msgid "LOOT Folder" -msgstr "LOOT-mapp" - -#: src/gui/html/js/translateStaticText.js:252 -msgid "Masterlist Repository URL" -msgstr "Huvudlistans databas-URL" - -#: src/gui/html/js/translateStaticText.js:253 -msgid "Masterlist Repository Branch" -msgstr "Huvudlistans databasgren" - -#: src/gui/html/js/translateStaticText.js:254 -msgid "Install Path" -msgstr "Installationssökväg" - -#: src/gui/html/js/translateStaticText.js:255 -msgid "Install Path Registry Key" -msgstr "Installationssökvägens registernyckel" - -#: src/gui/html/js/translateStaticText.js:268 -msgid "First-Time Tips" -msgstr "Förstagångstips" - -#: src/gui/html/js/translateStaticText.js:270 -msgid "" -"CRCs are only displayed after plugins have been loaded, either by conflict " -"filtering, or by sorting." -msgstr "" -"CRC:er visas endast efter att insticksmodulerna här lästs in, antingen genom " -"konfliktfiltrering eller genom sortering." - -#: src/gui/html/js/translateStaticText.js:271 -msgid "" -"Double-click a plugin in the sidebar to quickly open it in the metadata " -"editor." -msgstr "" -"Dubbelklicka på en insticksmodul i sidopanelen för att snabbt öppna den i " -"metadataredigeraren." - -#: src/gui/html/js/translateStaticText.js:272 -msgid "" -"Plugins can be drag and dropped from the sidebar into the metadata editor's " -"\"load after\", \"requirements\" and \"incompatibility\" tables." -msgstr "" -"Insticksmoduler kan dras och släppas från sidopanelen till " -"metadataredigerarens tabeller \"Läs in efter\", \"Krav\" och " -"\"Kompatibilitetsproblem\"." - -#: src/gui/html/js/translateStaticText.js:273 -msgid "" -"Some features are disabled while the metadata editor is open, or while there " -"is a sorted load order that has not been applied or discarded." -msgstr "" -"Vissa funktioner är inaktiverade när metadataredigeraren är öppen, eller när " -"den finns en sorterad inläsningsordning som inte har verkställts eller " -"förkastats." - -#: src/gui/html/js/translateStaticText.js:274 -msgid "" -"Many interface elements have tooltips. If you don't know what something is, " -"try hovering your mouse over it to find out. Otherwise, LOOT's documentation " -"can be accessed through the main menu." -msgstr "" -"Många gränssnittselement har verktygstips. Vill du veta vad något är, kan du " -"testa att hovra med muspekaren över elementet. Om det inte hjälper kan du " -"öppna LOOT:s hjälpdokumentation via huvudmenyn." - -#: src/gui/query_handler.cpp:111 -msgid "Parsing, merging and evaluating metadata..." -msgstr "Parsar, slår samman och utvärderar metadata..." - -#: src/gui/query_handler.cpp:203 src/gui/query_handler.cpp:206 -msgid "Failed to change game. Details: %1%" -msgstr "Det gick inte att byta spel. Information: %1%" - -#: src/gui/query_handler.cpp:220 src/gui/query_handler.cpp:223 -#: src/gui/query_handler.cpp:298 src/gui/query_handler.cpp:301 -#: src/gui/query_handler.cpp:329 src/gui/query_handler.cpp:332 -msgid "Failed to copy plugin metadata. Details: %1%" -msgstr "Det gick inte att kopiera insticksmodulmetadata. Information: %1%" - -#: src/gui/query_handler.cpp:238 src/gui/query_handler.cpp:248 -msgid "Failed to apply plugin metadata. Details: %1%" -msgstr "Det gick inte att tillämpa insticksmodulmetadata. Information: %1%" - -#: src/gui/query_handler.cpp:596 -msgid "" -"An error occurred while parsing the masterlist: %1%. This probably happened " -"because an update to LOOT changed its metadata syntax support. Try updating " -"your masterlist to resolve the error." -msgstr "" -"Ett fel uppstod när huvudlistan parsades: %1%. Det beror troligtvis på att " -"en uppdatering av LOOT ändrade dess syntaxstöd för metadata. Försök att " -"uppdatera din huvudlista för att åtgärda felet." - -#: src/gui/query_handler.cpp:611 -msgid "" -"An error occurred while parsing the userlist: %1%. This probably happened " -"because an update to LOOT changed its metadata syntax support. Your user " -"metadata will have to be updated manually.\n" -"\n" -"To do so, use the 'Open Debug Log Location' in LOOT's main menu to open its " -"data folder, then open your 'userlist.yaml' file in the relevant game " -"folder. You can then edit the metadata it contains with reference to the " -"[syntax documentation](https://loot.github.io/docs/%2%.%3%.%4%/LOOT%" -"%20Metadata%%20Syntax.html).\n" -"\n" -"You can also seek support on LOOT's forum thread, which is linked to on " -"[LOOT's website](https://loot.github.io/)." -msgstr "" -"Ett fel uppstod när användarlistan parsades: %1%. Det beror troligtvis på " -"att en uppdatering av LOOT ändrade dess syntaxstöd för metadata. Din " -"användarmetadata måste uppdateras manuellt.\n" -"\n" -"För att göra det, välj \"Öppna felsökningsloggens mapp\" i LOOT:s huvudmeny " -"för att öppna dess datamapp och öppna därefter filen \"userlist.yaml\" i den " -"relevanta spelmappen. Du kan därefter redigera den metadata den innehåller i " -"enlighet med [syntaxhjälpdokumentationen](http://loot.github.io/docs/%2%.%3%." -"%4%/LOOT%%20Metadata%%20Syntax.html).\n" -"\n" -"Du kan även söka hjälp via LOOT:s forumtråd, till vilken du finner en länk " -"på [LOOT:s webbplats](http://loot.github.io/)." - -#: src/gui/query_handler.cpp:719 src/gui/query_handler.cpp:722 -msgid "Failed to get game data. Details: %1%" -msgstr "Det gick inte att hämta speldata. Information: %1%" - -#: src/gui/query_handler.cpp:803 src/gui/query_handler.cpp:806 -msgid "Failed to update the masterlist. Details: %1%" -msgstr "Det gick inte att uppdatera huvudlistan. Information: %1%" - -#: src/gui/query_handler.cpp:845 -msgid "Loading plugin contents..." -msgstr "Läser in insticksmodulinnehåll..." - -#: src/gui/query_handler.cpp:849 -msgid "Sorting load order..." -msgstr "Sorterar inläsningsordning..." - -#: src/gui/query_handler.cpp:906 -msgid "Failed to sort plugins. Details: %1%" -msgstr "Det gick inte att sortera insticksmodulerna. Information: %1%" - -#: src/gui/query_handler.cpp:936 -msgid "" -"A global message contains a condition that could not be evaluated. Details: " -"%1%" -msgstr "" -"Ett globalt meddelande innehåller ett villkor som inte kunde utvärderas. " -"Information: %1%" - -#: src/gui/query_handler.cpp:958 src/backend/plugin/plugin_sorter.cpp:216 -msgid "\"%1%\" contains a condition that could not be evaluated. Details: %2%" -msgstr "" -"\"%1%\" innehåller ett villkor som inte kunde utvärderas. Information: %2%" - -#: src/backend/app/loot_paths.cpp:85 -msgid "Failed to get %LOCALAPPDATA% path." -msgstr "Det gick inte att hämta sökvägen för %LOCALAPPDATA%." - -#: src/backend/app/loot_state.cpp:124 -msgid "Error: Could not create LOOT settings file. %1%" -msgstr "Fel: Det gick inte att skapa en inställningsfil för LOOT. %1%" - -#: src/backend/app/loot_state.cpp:131 -msgid "Error: Settings parsing failed. %1%" -msgstr "Fel: Parsningen av inställningarna misslyckades. %1%" - -#: src/backend/app/loot_state.cpp:194 -msgid "Error: Game-specific settings could not be initialised. %1%" -msgstr "Fel: Det gick inte att initiera spelspecifika inställningar. %1%" - -#: src/backend/app/loot_state.cpp:272 -msgid "None of the supported games were detected." -msgstr "Inget av de spel som stöds hittades." - -#: src/backend/game/game.cpp:62 -msgid "Invalid game ID supplied." -msgstr "Ett ogiltigt spel-id angavs." - -#: src/backend/game/game.cpp:69 -msgid "Game path could not be detected." -msgstr "Det gick inte att hitta spelets sökväg." - -#: src/backend/game/game.cpp:79 -msgid "Could not create LOOT folder for game. Details:" -msgstr "Det gick inte att skapa en LOOT-mapp för spelet. Information:" - -#: src/backend/game/load_order_handler.cpp:49 -msgid "Unsupported game ID supplied." -msgstr "Ett spel-id som inte stöds angavs." - -#: src/backend/game/load_order_handler.cpp:54 -msgid "Game path is not initialised." -msgstr "Spelets sökväg har inte initierats." - -#: src/backend/game/load_order_handler.cpp:88 -msgid "" -"libloadorder failed to create a game handle. Details could not be fetched." -msgstr "" -"libloadorder kunde inte skapa en spelreferens. Felinformation kunde inte " -"hämtas." - -#: src/backend/game/load_order_handler.cpp:91 -msgid "libloadorder failed to create a game handle. Details:" -msgstr "libloadorder kunde inte skapa en spelreferens. Information:" - -#: src/backend/game/load_order_handler.cpp:109 -msgid "" -"libloadorder failed to check if a plugin is active. Details could not be " -"fetched." -msgstr "" -"libloadorder kunde inte kontrollera om en insticksmodul är aktiverad. " -"Felinformation kunde inte hämtas." - -#: src/backend/game/load_order_handler.cpp:112 -msgid "libloadorder failed to check if a plugin is active. Details:" -msgstr "" -"libloadorder kunde inte kontrollera om en insticksmodul är aktiverad. " -"Information:" - -#: src/backend/game/load_order_handler.cpp:134 -msgid "" -"libloadorder failed to get the load order. Details could not be fetched." -msgstr "" -"libloadorder kunde inte hämta inläsningsordningen. Felinformation kunde inte " -"hämtas." - -#: src/backend/game/load_order_handler.cpp:137 -msgid "libloadorder failed to get the load order. Details:" -msgstr "libloadorder kunde inte hämta inläsningsordningen. Information:" - -#: src/backend/game/load_order_handler.cpp:160 -msgid "" -"libloadorder failed to set the load order. Details could not be fetched." -msgstr "" -"libloadorder kunde inte ange inläsningsordningen. Felinformation kunde inte " -"hämtas." - -#: src/backend/game/load_order_handler.cpp:163 -msgid "libloadorder failed to set the load order. Details:" -msgstr "libloadorder kunde inte ange inläsningsordningen. Information:" - -#: src/backend/helpers/git_helper.cpp:104 -msgid "Git operation failed. Error: %1%" -msgstr "Det gick inte att utföra git-åtgärden. Fel: %1%" - -#: src/backend/helpers/git_helper.cpp:145 -msgid "" -"An error occurred while trying to clone the remote masterlist repository." -msgstr "Ett fel uppstod när databasen för fjärrhuvudlistan skulle klonas." - -#: src/backend/helpers/git_helper.cpp:197 -msgid "" -"An error occurred while trying to update the masterlist. This could be due " -"to a server-side error. Try again in a few minutes." -msgstr "" -"Ett fel uppstod när huvudlistan skulle uppdateras. Detta kan bero på ett fel " -"på serversidan. Försök igen om några minuter." - -#: src/backend/helpers/git_helper.cpp:311 src/backend/masterlist.cpp:50 -msgid "Unknown: Git repository missing" -msgstr "Okänd: Git-databas saknas" - -#: src/backend/helpers/helpers.cpp:81 -msgid "Unable to open \"%1%\" for CRC calculation." -msgstr "Det gick inte att öppna \"%1%\" för CRC-beräkning." - -#: src/backend/helpers/helpers.cpp:122 src/backend/helpers/helpers.cpp:125 -msgid "Failed to open file in its default application." -msgstr "Det gick inte att öppna filen i dess standardprogram." - -#: src/backend/masterlist.cpp:43 -msgid "" -"An error occurred while trying to read the local masterlist's version. If " -"this error happens again, try deleting the \".git\" folder in %1%." -msgstr "" -"Ett fel uppstod när den lokala versionen av huvudlistan skulle läsas. Om " -"felet inträffar igen, försök att ta bort mappen \".git\" i %1%." - -#: src/backend/masterlist.cpp:47 -msgid "N/A: No masterlist present" -msgstr "Ej tillämpligt: Det finns ingen huvudlista" - -#: src/backend/masterlist.cpp:80 src/backend/masterlist.cpp:81 -msgid "(edited)" -msgstr "(redigerad)" - -#: src/backend/masterlist.cpp:118 src/backend/masterlist.cpp:132 -msgid "" -"An error occurred while trying to access the local masterlist repository. If " -"this error happens again, try deleting the \".git\" folder in %1%." -msgstr "" -"Ett fel uppstod under försök att få åtkomst till den lokala versionen av " -"huvudlistan. Om felet inträffar igen, försök att ta bort mappen \".git\" i " -"%1%." - -#: src/backend/masterlist.cpp:239 -msgid "" -"An error occurred while trying to read information on the updated " -"masterlist. If this error happens again, try deleting the \".git\" folder in " -"%1%." -msgstr "" -"Ett fel uppstod när information i den uppdaterade huvudlistan skulle läsas. " -"Om felet inträffar igen, försök att ta bort mappen \".git\" i %1%." - -#: src/backend/masterlist.cpp:253 -msgid "Masterlist revision" -msgstr "Huvudlistans revision" - -#: src/backend/masterlist.cpp:257 -msgid "" -"The latest masterlist revision contains a syntax error, LOOT is using the " -"most recent valid revision instead. Syntax errors are usually minor and " -"fixed within hours." -msgstr "" -"Den senaste revisionen av huvudlistan innehåller ett syntaxfel. LOOT " -"använder istället den senaste giltiga revisionen. Syntaxfel är vanligtvis " -"mindre och åtgärdade inom några timmar." - -#: src/backend/metadata/condition_grammar.h:146 -#: src/backend/metadata/condition_grammar.h:281 -#: src/backend/metadata/condition_grammar.h:365 -msgid "Invalid file path:" -msgstr "Ogiltig filsökväg:" - -#: src/backend/metadata/condition_grammar.h:187 -#: src/backend/metadata/condition_grammar.h:213 -msgid "Invalid regex string \"%1%\": %2%" -msgstr "Ogiltigt RegEx-uttryck \"%1%\": %2%" - -#: src/backend/metadata/condition_grammar.h:205 -msgid "Invalid folder path:" -msgstr "Ogiltig mappsökväg:" - -#: src/backend/metadata/condition_grammar.h:385 -msgid "Expected \"%1%\" at \"%2%\"." -msgstr "\"%1%\" förväntades för \"%2%\"." - -#: src/backend/metadata/conditional_metadata.cpp:73 -#: src/backend/metadata/conditional_metadata.cpp:104 -msgid "Failed to parse condition \"%1%\": %2%" -msgstr "Det gick inte att parsa villkoret \"%1%\": %2%" - -#: src/backend/metadata/conditional_metadata.cpp:78 -#: src/backend/metadata/conditional_metadata.cpp:109 -msgid "Failed to parse condition \"%1%\"." -msgstr "Det gick inte att parsa villkoret \"%1%\"." - -#: src/backend/metadata/plugin_dirty_info.cpp:69 -msgid "" -"Contains %1% ITM records, %2% deleted references and %3% deleted navmeshes. " -"Clean with %4%." -msgstr "" -"Innehåller %1% ITM-poster, %2% borttagna referenser och %3% borttagna " -"navigeringsytor. Städa med %4%." - -#: src/backend/metadata/plugin_dirty_info.cpp:71 -msgid "Clean with %1%." -msgstr "Städa med %1%." - -#: src/backend/metadata/plugin_dirty_info.cpp:74 -msgid "" -"Contains %1% deleted references and %2% deleted navmeshes. Clean with %3%." -msgstr "" -"Innehåller %1% borttagna referenser och %2% borttagna navigeringsytor. Städa " -"med %3%." - -#: src/backend/metadata/plugin_dirty_info.cpp:76 -msgid "Contains %1% deleted navmeshes. Clean with %2%." -msgstr "Innehåller %1% borttagna navigeringsytor. Städa med %2%." - -#: src/backend/metadata/plugin_dirty_info.cpp:78 -msgid "Contains %1% deleted references. Clean with %2%." -msgstr "Innehåller %1% borttagna referenser. Städa med %2%." - -#: src/backend/metadata/plugin_dirty_info.cpp:81 -msgid "Contains %1% ITM records and %2% deleted navmeshes. Clean with %3%." -msgstr "" -"Innehåller %1% ITM-poster och %2% borttagna navigeringsytor. Städa med %3%." - -#: src/backend/metadata/plugin_dirty_info.cpp:83 -msgid "Contains %1% ITM records. Clean with %2%." -msgstr "Innehåller %1% ITM-poster. Städa med %2%." - -#: src/backend/metadata/plugin_dirty_info.cpp:86 -msgid "Contains %1% ITM records and %2% deleted references. Clean with %3%." -msgstr "Innehåller %1% ITM-poster och %2% borttagna referenser. Städa med %3%." - -#: src/backend/plugin/plugin.cpp:115 -msgid "Cannot read \"%1%\". Details: %2%" -msgstr "Det gick inte att läsa \"%1%\". Information: %2%" - -#: src/backend/plugin/plugin.cpp:213 src/backend/plugin/plugin.cpp:224 -msgid "This plugin requires \"%1%\" to be installed, but it is missing." -msgstr "Denna insticksmodul kräver att \"%1%\" är installerad, men den saknas." - -#: src/backend/plugin/plugin.cpp:216 -msgid "This plugin requires \"%1%\" to be active, but it is inactive." -msgstr "" -"Denna insticksmodul kräver att \"%1%\" är aktiverad, men den är inaktiverad." - -#: src/backend/plugin/plugin.cpp:230 -msgid "This plugin is incompatible with \"%1%\", but both are present." -msgstr "" -"Denna insticksmodul är inkompatibel med \"%1%\", men bägge finns " -"installerade." - -#: src/backend/plugin/plugin_sorter.cpp:81 -msgid "" -"Cyclic interaction detected between plugins \"%1%\" and \"%2%\". Back cycle: " -"%3%" -msgstr "" -"Cyklisk interaktion har identifierats mellan insticksmodulerna \"%1%\" och " -"\"%2%\". Återgångscykel: %3%" diff --git a/resources/l10n/template.pot b/resources/l10n/template.pot deleted file mode 100644 index a18c6be0..00000000 --- a/resources/l10n/template.pot +++ /dev/null @@ -1,836 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR WrinklyNinja -# This file is distributed under the same license as the LOOT package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: LOOT 0.10.3\n" -"Report-Msgid-Bugs-To: https://github.com/loot/loot/issues\n" -"POT-Creation-Date: 2017-02-08 20:47+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" - -#: src/gui/html/js/events.js:18 -msgid "Identifying conflicting plugins..." -msgstr "" - -#: src/gui/html/js/events.js:80 -msgid "Updating and parsing masterlist..." -msgstr "" - -#: src/gui/html/js/events.js:97 -#, javascript-format -msgid "Masterlist updated to revision %s." -msgstr "" - -#: src/gui/html/js/events.js:100 -msgid "No masterlist update was necessary." -msgstr "" - -#: src/gui/html/js/events.js:130 -#, javascript-format -msgid "Failed to sort plugins. Details: %s" -msgstr "" - -#: src/gui/html/js/events.js:150 -msgid "Sorting made no changes to the load order." -msgstr "" - -#: src/gui/html/js/events.js:182 -msgid "Redate Plugins?" -msgstr "" - -#: src/gui/html/js/events.js:182 -msgid "" -"This feature is provided so that modders using the Creation Kit may set the " -"load order it uses. A side-effect is that any subscribed Steam Workshop mods " -"will be re-downloaded by Steam (this does not affect Skyrim Special " -"Edition). Do you wish to continue?" -msgstr "" - -#: src/gui/html/js/events.js:182 -msgid "Redate" -msgstr "" - -#: src/gui/html/js/events.js:185 -msgid "Plugins were successfully redated." -msgstr "" - -#: src/gui/html/js/events.js:191 -msgid "" -"Are you sure you want to clear all existing user-added metadata from all " -"plugins?" -msgstr "" - -#: src/gui/html/js/events.js:191 src/gui/html/js/events.js:408 -msgid "Clear" -msgstr "" - -#: src/gui/html/js/events.js:202 -msgid "All user-added metadata has been cleared." -msgstr "" - -#: src/gui/html/js/events.js:225 -msgid "LOOT's content has been copied to the clipboard." -msgstr "" - -#: src/gui/html/js/events.js:236 -msgid "The load order has been copied to the clipboard." -msgstr "" - -#: src/gui/html/js/events.js:267 -#, javascript-format -msgid "" -"You have not yet applied or cancelled your %s. Are you sure you want to quit?" -msgstr "" - -#: src/gui/html/js/events.js:267 src/gui/html/js/translateStaticText.js:232 -msgid "Quit" -msgstr "" - -#: src/gui/html/js/events.js:279 -msgid "sorted load order" -msgstr "" - -#: src/gui/html/js/events.js:281 -msgid "metadata edits" -msgstr "" - -#: src/gui/html/js/events.js:404 -#, javascript-format -msgid "The metadata for \"%s\" has been copied to the clipboard." -msgstr "" - -#: src/gui/html/js/events.js:408 -#, javascript-format -msgid "" -"Are you sure you want to clear all existing user-added metadata from \"%s\"?" -msgstr "" - -#: src/gui/html/js/events.js:423 -#, javascript-format -msgid "The user-added metadata for \"%s\" has been cleared." -msgstr "" - -#: src/gui/html/js/filters.js:28 -msgid "Do not clean" -msgstr "" - -#: src/gui/html/js/game.js:22 -msgid "N/A" -msgstr "" - -#: src/gui/html/js/handlePromiseError.js:15 -#: src/gui/html/js/translateStaticText.js:152 -msgid "Error" -msgstr "" - -#: src/gui/html/js/initialise.js:257 -#, javascript-format -msgid "A [new release](%s) of LOOT is available." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:33 -msgid "Active Plugin" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:34 -#: src/gui/html/js/translateStaticText.js:308 -msgid "Master File" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:35 -msgid "Empty Plugin" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:36 -msgid "Loads Archive" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:37 -#: src/gui/html/js/translateStaticText.js:114 -msgid "Has User Metadata" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:39 -msgid "Edit Metadata" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:40 -msgid "Copy Metadata" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:41 -msgid "Clear User Metadata" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:60 -msgid "Enable Edits" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:61 -#: src/gui/html/js/translateStaticText.js:113 -msgid "Priority" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:62 -#: src/gui/html/js/translateStaticText.js:112 -msgid "Global Priority" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:64 -msgid "Main" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:65 -msgid "Load After" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:66 -msgid "Requirements" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:67 -msgid "Incompatibilities" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:68 -msgid "Messages" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:69 -msgid "Bash Tags" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:70 -msgid "Dirty Plugin Info" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:71 -msgid "Clean Plugin Info" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:72 -msgid "Locations" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:74 -#: src/gui/html/js/translateStaticText.js:78 -#: src/gui/html/js/translateStaticText.js:82 -msgid "Filename" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:75 -#: src/gui/html/js/translateStaticText.js:79 -#: src/gui/html/js/translateStaticText.js:83 -msgid "Display Name" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:76 -#: src/gui/html/js/translateStaticText.js:80 -#: src/gui/html/js/translateStaticText.js:84 -#: src/gui/html/js/translateStaticText.js:88 -#: src/gui/html/js/translateStaticText.js:93 -msgid "Condition" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:86 -msgid "Type" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:87 -msgid "Content" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:89 -#: src/gui/html/js/translateStaticText.js:296 -msgid "Language" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:91 -msgid "Add/Remove" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:92 -msgid "Bash Tag" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:95 -#: src/gui/html/js/translateStaticText.js:101 -msgid "CRC" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:96 -msgid "ITM Count" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:97 -msgid "Deleted References" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:98 -msgid "Deleted Navmeshes" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:99 -#: src/gui/html/js/translateStaticText.js:102 -msgid "Cleaning Utility" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:104 -msgid "URL" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:105 -#: src/gui/html/js/translateStaticText.js:305 -msgid "Name" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:107 -msgid "Save Metadata" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:108 -#: src/gui/html/js/translateStaticText.js:135 -#: src/gui/html/js/translateStaticText.js:219 -#: src/gui/html/js/translateStaticText.js:319 -msgid "Cancel" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:115 -msgid "Editor Is Open" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:134 -#: src/gui/html/js/translateStaticText.js:341 -msgid "OK" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:142 -msgid "A filename is required." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:143 -#: src/gui/html/js/translateStaticText.js:154 -#: src/gui/html/js/translateStaticText.js:164 -#: src/gui/html/js/translateStaticText.js:176 -#: src/gui/html/js/translateStaticText.js:185 -#: src/gui/html/js/translateStaticText.js:193 -#: src/gui/html/js/translateStaticText.js:202 -msgid "Delete Row" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:150 -msgid "Note" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:151 -msgid "Warning" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:153 -msgid "A content string is required." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:161 -msgid "Add" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:162 -msgid "Remove" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:163 -#: src/gui/html/js/translateStaticText.js:200 -msgid "A name is required." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:171 -#: src/gui/html/js/translateStaticText.js:183 -msgid "A CRC is required." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:172 -#: src/gui/html/js/translateStaticText.js:173 -#: src/gui/html/js/translateStaticText.js:174 -msgid "Values must be integers." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:175 -#: src/gui/html/js/translateStaticText.js:184 -msgid "A utility name is required." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:192 -msgid "A link is required." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:201 -msgid "A folder is required." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:209 -#: src/gui/html/js/translateStaticText.js:316 -msgid "Add New Row" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:215 -msgid "Jump To General Information" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:216 -msgid "Sort Plugins" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:217 -msgid "Update Masterlist" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:218 -#: src/gui/html/js/translateStaticText.js:318 -msgid "Apply" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:220 -msgid "Search Cards" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:223 -msgid "Redate Plugins" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:224 -msgid "Open Debug Log Location" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:225 -msgid "Clear All User Metadata" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:226 -msgid "Copy Load Order" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:227 -msgid "Copy Content" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:228 -msgid "Refresh Content" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:229 -msgid "View Documentation" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:230 -msgid "About" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:231 -#: src/gui/html/js/translateStaticText.js:288 -msgid "Settings" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:235 -msgid "Search cards" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:247 -msgid "Plugins" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:248 -msgid "Filters" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:249 -msgid "Press Enter or click outside the input to set the filter." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:250 -msgid "Show only plugins with cards that contain" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:251 -msgid "No text specified" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:254 -msgid "Hide version numbers" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:255 -msgid "Hide CRCs" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:256 -msgid "Hide Bash Tags" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:257 -msgid "Hide notes" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:258 -msgid "Hide 'Do not clean' messages" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:259 -msgid "Hide all plugin messages" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:260 -msgid "Hide inactive plugins" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:261 -msgid "Hide messageless plugins" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:264 -msgid "Show only conflicting plugins for" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:265 -msgid "No plugin selected" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:269 -msgid "Hidden plugins:" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:270 -msgid "Hidden messages:" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:275 -msgid "General Information" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:276 -msgid "Masterlist Revision" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:277 -msgid "Masterlist Date" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:278 -msgid "Warnings" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:279 -msgid "Errors" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:280 -msgid "Total Messages" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:281 -msgid "Active Plugins" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:282 -msgid "Dirty Plugins" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:283 -msgid "Total Plugins" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:291 -msgid "Default Game" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:292 -msgid "Autodetect" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:297 -msgid "Language changes will be applied after LOOT is restarted." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:299 -msgid "Enable debug logging" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:300 -msgid "The output is logged to the LOOTDebugLog.txt file." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:302 -msgid "Update masterlist before sorting" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:306 -msgid "Base Game" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:307 -msgid "LOOT Folder" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:309 -msgid "Masterlist Repository URL" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:310 -msgid "Masterlist Repository Branch" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:311 -msgid "Install Path" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:312 -msgid "Install Path Registry Key" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:325 -msgid "First-Time Tips" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:327 -#, javascript-format -msgid "" -"This appears to be the first time you have run LOOT v%s. Here are some tips " -"to help you get started with the interface." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:329 -msgid "Click %(menu_icon)s buttons to open menus." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:332 -msgid "" -"As well as messages, LOOT displays plugin version " -"numbers, CRCs and Bash Tag suggestions for " -"addition and removal." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:333 -msgid "" -"CRCs are only displayed after plugins have been loaded, either by conflict " -"filtering, or by sorting." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:334 -msgid "" -"Double-click a plugin in the sidebar to quickly open it in the metadata " -"editor." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:335 -msgid "" -"Plugins can be drag and dropped from the sidebar into the metadata editor's " -"\"load after\", \"requirements\" and \"incompatibility\" tables." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:336 -msgid "" -"Some features are disabled while the metadata editor is open, or while there " -"is a sorted load order that has not been applied or discarded." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:337 -msgid "" -"Many interface elements have tooltips. If you don't know what something is, " -"try hovering your mouse over it to find out. Otherwise, LOOT's documentation " -"can be accessed through the main menu." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:339 -#: src/gui/html/js/translateStaticText.js:351 -#, javascript-format -msgid "" -"LOOT is free, but if you want to show your appreciation with some money, " -"donations may be made to WrinklyNinja (LOOT's creator and main developer) " -"using %s or %s." -msgstr "" - -#: src/gui/html/js/translateStaticText.js:346 -msgid "About LOOT" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:348 -#, javascript-format -msgid "Version %s (build %s)" -msgstr "" - -#: src/gui/html/js/translateStaticText.js:349 -msgid "" -"Load order optimisation for Oblivion, Skyrim, Skyrim Special Edition, " -"Fallout 3, Fallout: New Vegas and Fallout 4." -msgstr "" - -#: src/gui/query/get_game_data_query.h:45 -msgid "Parsing, merging and evaluating metadata..." -msgstr "" - -#: src/gui/query/metadata_query.h:82 src/gui/query/metadata_query.h:92 -msgid "\"%1%\" contains a condition that could not be evaluated. Details: %2%" -msgstr "" - -#: src/gui/query/metadata_query.h:111 src/gui/query/metadata_query.h:112 -msgid "N/A: No masterlist present" -msgstr "" - -#: src/gui/query/metadata_query.h:115 src/gui/query/metadata_query.h:116 -msgid "Unknown: Git repository missing" -msgstr "" - -#: src/gui/query/metadata_query.h:169 src/gui/query/metadata_query.h:170 -msgid "(edited)" -msgstr "" - -#: src/gui/query/query.h:40 -msgid "" -"Oh no, something went wrong! You can check your LOOTDebugLog.txt (you can " -"get to it through the main menu) for more information." -msgstr "" - -#: src/gui/query/sort_plugins_query.h:48 -msgid "Sorting load order..." -msgstr "" - -#: src/gui/state/game.cpp:144 src/gui/state/game.cpp:155 -msgid "This plugin requires \"%1%\" to be installed, but it is missing." -msgstr "" - -#: src/gui/state/game.cpp:147 -msgid "This plugin requires \"%1%\" to be active, but it is inactive." -msgstr "" - -#: src/gui/state/game.cpp:161 -msgid "This plugin is incompatible with \"%1%\", but both are present." -msgstr "" - -#: src/gui/state/game.cpp:280 -msgid "" -"Cyclic interaction detected between plugins \"%1%\" and \"%2%\". Back cycle: " -"%3%" -msgstr "" - -#: src/gui/state/game.cpp:309 -msgid "You have not sorted your load order this session." -msgstr "" - -#: src/gui/state/game.cpp:353 -msgid "" -"An error occurred while parsing the metadata list(s): %1%.\n" -"\n" -"Try updating your masterlist to resolve the error. If the error is with your " -"user metadata, this probably happened because an update to LOOT changed its " -"metadata syntax support. Your user metadata will have to be updated " -"manually.\n" -"\n" -"To do so, use the 'Open Debug Log Location' in LOOT's main menu to open its " -"data folder, then open your 'userlist.yaml' file in the relevant game " -"folder. You can then edit the metadata it contains with reference to the " -"documentation, which is accessible through LOOT's main menu.\n" -"\n" -"You can also seek support on LOOT's forum thread, which is linked to on " -"[LOOT's website](https://loot.github.io/)." -msgstr "" - -#: src/gui/state/loot_state.cpp:133 -msgid "Error: Could not create LOOT settings file. %1%" -msgstr "" - -#: src/gui/state/loot_state.cpp:140 -msgid "Error: Settings parsing failed. %1%" -msgstr "" - -#: src/gui/state/loot_state.cpp:207 -msgid "Error: Game-specific settings could not be initialised. %1%" -msgstr "" - -#: src/api/helpers/git_helper.cpp:147 -msgid "" -"An error occurred while trying to clone the remote masterlist repository." -msgstr "" - -#: src/api/helpers/git_helper.cpp:196 -msgid "" -"An error occurred while trying to update the masterlist. This could be due " -"to a server-side error. Try again in a few minutes." -msgstr "" - -#: src/api/metadata/plugin_cleaning_data.cpp:89 -msgid "%1% ITM record" -msgid_plural "%1% ITM records" -msgstr[0] "" -msgstr[1] "" - -#: src/api/metadata/plugin_cleaning_data.cpp:90 -msgid "%1% deleted reference" -msgid_plural "%1% deleted references" -msgstr[0] "" -msgstr[1] "" - -#: src/api/metadata/plugin_cleaning_data.cpp:91 -msgid "%1% deleted navmesh" -msgid_plural "%1% deleted navmeshes" -msgstr[0] "" -msgstr[1] "" - -#: src/api/metadata/plugin_cleaning_data.cpp:95 -msgid "%1% found %2%, %3% and %4%." -msgstr "" - -#: src/api/metadata/plugin_cleaning_data.cpp:97 -msgid "%1% found dirty edits." -msgstr "" - -#: src/api/metadata/plugin_cleaning_data.cpp:100 -#: src/api/metadata/plugin_cleaning_data.cpp:102 -#: src/api/metadata/plugin_cleaning_data.cpp:104 -msgid "%1% found %2% and %3%." -msgstr "" - -#: src/api/metadata/plugin_cleaning_data.cpp:107 -#: src/api/metadata/plugin_cleaning_data.cpp:109 -#: src/api/metadata/plugin_cleaning_data.cpp:111 -msgid "%1% found %2%." -msgstr "" - -#: src/api/plugin/plugin.cpp:116 -msgid "Cannot read \"%1%\". Details: %2%" -msgstr "" - -#: src/api/masterlist.cpp:46 -msgid "" -"An error occurred while trying to read the local masterlist's version. If " -"this error happens again, try deleting the \".git\" folder in %1%." -msgstr "" - -#: src/api/masterlist.cpp:114 src/api/masterlist.cpp:128 -msgid "" -"An error occurred while trying to access the local masterlist repository. If " -"this error happens again, try deleting the \".git\" folder in %1%." -msgstr "" - -#: src/api/masterlist.cpp:235 -msgid "" -"An error occurred while trying to read information on the updated " -"masterlist. If this error happens again, try deleting the \".git\" folder in " -"%1%." -msgstr "" - -#: src/api/masterlist.cpp:249 -msgid "" -"Masterlist revision %1%: %2%. The latest masterlist revision contains a " -"syntax error, LOOT is using the most recent valid revision instead. Syntax " -"errors are usually minor and fixed within hours." -msgstr "" diff --git a/resources/l10n/zh_CN/LC_MESSAGES/loot.po b/resources/l10n/zh_CN/LC_MESSAGES/loot.po deleted file mode 100644 index 057c2285..00000000 --- a/resources/l10n/zh_CN/LC_MESSAGES/loot.po +++ /dev/null @@ -1,1036 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: LOOT v0.7\n" -"Report-Msgid-Bugs-To: https://github.com/loot/loot/issues\n" -"POT-Creation-Date: 2016-11-25 21:52+0800\n" -"PO-Revision-Date: 2016-11-25 22:00+0800\n" -"Last-Translator: S猫 \n" -"Language-Team: S猫 \n" -"Language: zh_CN\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.11\n" -"X-Poedit-KeywordsList: translate:1,1t;translate:1c,2,t\n" -"X-Poedit-Basepath: ../..\n" -"X-Poedit-SourceCharset: UTF-8\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Poedit-SearchPath-0: src/backend\n" -"X-Poedit-SearchPath-1: src/gui\n" -"X-Poedit-SearchPath-2: resources/report/js\n" - -#: src/gui/html/js/events.js:18 -msgid "Identifying conflicting plugins..." -msgstr "识别冲突插件..." - -#: src/gui/html/js/events.js:80 -msgid "Updating and parsing masterlist..." -msgstr "更新并解析主列表..." - -#: src/gui/html/js/events.js:97 -#, javascript-format -msgid "Masterlist updated to revision %s." -msgstr "主列表已更新到版次%s。" - -#: src/gui/html/js/events.js:100 -msgid "No masterlist update was necessary." -msgstr "主列表无需更新。" - -#: src/gui/html/js/events.js:130 -#, javascript-format -msgid "Failed to sort plugins. Details: %s" -msgstr "无法调整排序,详细信息:%s" - -#: src/gui/html/js/events.js:150 -msgid "Sorting made no changes to the load order." -msgstr "加载顺序没有变化。" - -#: src/gui/html/js/events.js:182 -msgid "Redate Plugins?" -msgstr "修改插件时间?" - -#: src/gui/html/js/events.js:182 -msgid "" -"This feature is provided so that modders using the Creation Kit may set the " -"load order it uses. A side-effect is that any subscribed Steam Workshop mods " -"will be re-downloaded by Steam (this does not affect Skyrim Special " -"Edition). Do you wish to continue?" -msgstr "" -"此功能方便使用Creation Kit的modder可以设定个人顺序。副作用是所有在Steam " -"Workshop订阅的mod都会被Steam重新下载(这不影响天际特别版)。您确定要继续吗?" - -#: src/gui/html/js/events.js:182 -msgid "Redate" -msgstr "修改时间" - -#: src/gui/html/js/events.js:185 -msgid "Plugins were successfully redated." -msgstr "修改插件日期已完成。" - -#: src/gui/html/js/events.js:191 -msgid "" -"Are you sure you want to clear all existing user-added metadata from all " -"plugins?" -msgstr "你确定要清除所有插件里用户添加的元数据?" - -#: src/gui/html/js/events.js:191 src/gui/html/js/events.js:399 -msgid "Clear" -msgstr "清除" - -#: src/gui/html/js/events.js:202 -msgid "All user-added metadata has been cleared." -msgstr "所有用户添加的元数据已被清除。" - -#: src/gui/html/js/events.js:225 -msgid "LOOT's content has been copied to the clipboard." -msgstr "LOOT 的内容已被复制到剪贴板。" - -#: src/gui/html/js/events.js:236 -msgid "The load order has been copied to the clipboard." -msgstr "加载顺序已被复制到剪贴板。" - -#: src/gui/html/js/events.js:267 -#, javascript-format -msgid "" -"You have not yet applied or cancelled your %s. Are you sure you want to quit?" -msgstr "你还没用应用或取消你的%s。确定要退出吗?" - -#: src/gui/html/js/events.js:267 src/gui/html/js/translateStaticText.js:214 -msgid "Quit" -msgstr "退出" - -#: src/gui/html/js/events.js:279 -msgid "sorted load order" -msgstr "已调整的加载顺序" - -#: src/gui/html/js/events.js:281 -msgid "metadata edits" -msgstr "元数据编辑" - -#: src/gui/html/js/events.js:395 -#, javascript-format -msgid "The metadata for \"%s\" has been copied to the clipboard." -msgstr "\"%s\"的元数据已被复制到剪贴板。" - -#: src/gui/html/js/events.js:399 -#, javascript-format -msgid "" -"Are you sure you want to clear all existing user-added metadata from \"%s\"?" -msgstr "你确定要清除从\"%s\"清除所有用户添加的元数据?" - -#: src/gui/html/js/events.js:414 -#, javascript-format -msgid "The user-added metadata for \"%s\" has been cleared." -msgstr "\"%s\"中用户添加的元数据已被清除。" - -#: src/gui/html/js/filters.js:28 -msgid "Do not clean" -msgstr "不要清理" - -#: src/gui/html/js/game.js:22 -msgid "N/A" -msgstr "不可用" - -#: src/gui/html/js/handlePromiseError.js:15 -#: src/gui/html/js/translateStaticText.js:134 -msgid "Error" -msgstr "错误" - -#: src/gui/html/js/initialise.js:250 -#, javascript-format -msgid "A [new release](%s) of LOOT is available." -msgstr "一个[新版本](%s)的LOOT发行了。" - -#: src/gui/html/js/translateStaticText.js:36 -msgid "Active Plugin" -msgstr "激活插件" - -#: src/gui/html/js/translateStaticText.js:37 -#: src/gui/html/js/translateStaticText.js:283 -msgid "Master File" -msgstr "Master文件" - -#: src/gui/html/js/translateStaticText.js:38 -msgid "Empty Plugin" -msgstr "空插件" - -#: src/gui/html/js/translateStaticText.js:39 -msgid "Loads Archive" -msgstr "加载档案" - -#: src/gui/html/js/translateStaticText.js:40 -#: src/gui/html/js/translateStaticText.js:108 -msgid "Has User Metadata" -msgstr "有用户元数据" - -#: src/gui/html/js/translateStaticText.js:42 -msgid "Edit Metadata" -msgstr "编辑元数据" - -#: src/gui/html/js/translateStaticText.js:43 -msgid "Copy Metadata" -msgstr "复制元数据" - -#: src/gui/html/js/translateStaticText.js:44 -msgid "Clear User Metadata" -msgstr "清除用户元数据" - -#: src/gui/html/js/translateStaticText.js:51 -msgid "Enable Edits" -msgstr "启用编辑" - -#: src/gui/html/js/translateStaticText.js:52 -#: src/gui/html/js/translateStaticText.js:107 -msgid "Priority" -msgstr "优先值" - -#: src/gui/html/js/translateStaticText.js:53 -#: src/gui/html/js/translateStaticText.js:106 -msgid "Global Priority" -msgstr "全局优先级" - -#: src/gui/html/js/translateStaticText.js:55 -msgid "Main" -msgstr "主要" - -#: src/gui/html/js/translateStaticText.js:56 -msgid "Load After" -msgstr "加载在后面" - -#: src/gui/html/js/translateStaticText.js:57 -msgid "Requirements" -msgstr "需求信息" - -#: src/gui/html/js/translateStaticText.js:58 -msgid "Incompatibilities" -msgstr "不兼容信息" - -#: src/gui/html/js/translateStaticText.js:59 -msgid "Messages" -msgstr "信息" - -#: src/gui/html/js/translateStaticText.js:60 -msgid "Bash Tags" -msgstr "Bash 标签" - -#: src/gui/html/js/translateStaticText.js:61 -msgid "Dirty Plugin Info" -msgstr "Dirty 插件信息" - -#: src/gui/html/js/translateStaticText.js:62 -msgid "Clean Plugin Info" -msgstr "清除插件信息" - -#: src/gui/html/js/translateStaticText.js:63 -msgid "Locations" -msgstr "地址" - -#: src/gui/html/js/translateStaticText.js:65 -#: src/gui/html/js/translateStaticText.js:69 -#: src/gui/html/js/translateStaticText.js:73 -msgid "Filename" -msgstr "文件" - -#: src/gui/html/js/translateStaticText.js:66 -#: src/gui/html/js/translateStaticText.js:70 -#: src/gui/html/js/translateStaticText.js:74 -msgid "Display Name" -msgstr "显示名字" - -#: src/gui/html/js/translateStaticText.js:67 -#: src/gui/html/js/translateStaticText.js:71 -#: src/gui/html/js/translateStaticText.js:75 -#: src/gui/html/js/translateStaticText.js:79 -#: src/gui/html/js/translateStaticText.js:84 -msgid "Condition" -msgstr "条件" - -#: src/gui/html/js/translateStaticText.js:77 -msgid "Type" -msgstr "类型" - -#: src/gui/html/js/translateStaticText.js:78 -msgid "Content" -msgstr "内容" - -#: src/gui/html/js/translateStaticText.js:80 -#: src/gui/html/js/translateStaticText.js:271 -msgid "Language" -msgstr "界面语言" - -#: src/gui/html/js/translateStaticText.js:82 -msgid "Add/Remove" -msgstr "添加/移除" - -#: src/gui/html/js/translateStaticText.js:83 -msgid "Bash Tag" -msgstr "Bash 标签" - -#: src/gui/html/js/translateStaticText.js:86 -#: src/gui/html/js/translateStaticText.js:92 -msgid "CRC" -msgstr "CRC" - -#: src/gui/html/js/translateStaticText.js:87 -msgid "ITM Count" -msgstr "ITM 数量" - -#: src/gui/html/js/translateStaticText.js:88 -msgid "Deleted References" -msgstr "已删除的引用" - -#: src/gui/html/js/translateStaticText.js:89 -msgid "Deleted Navmeshes" -msgstr "已删除的导航" - -#: src/gui/html/js/translateStaticText.js:90 -#: src/gui/html/js/translateStaticText.js:93 -msgid "Cleaning Utility" -msgstr "清除工具" - -#: src/gui/html/js/translateStaticText.js:95 -msgid "URL" -msgstr "链接" - -#: src/gui/html/js/translateStaticText.js:96 -#: src/gui/html/js/translateStaticText.js:280 -msgid "Name" -msgstr "名字" - -#: src/gui/html/js/translateStaticText.js:98 -msgid "Save Metadata" -msgstr "保存元数据" - -#: src/gui/html/js/translateStaticText.js:99 -#: src/gui/html/js/translateStaticText.js:117 -#: src/gui/html/js/translateStaticText.js:201 -#: src/gui/html/js/translateStaticText.js:294 -msgid "Cancel" -msgstr "取消" - -#: src/gui/html/js/translateStaticText.js:109 -msgid "Editor Is Open" -msgstr "编辑器已打开" - -#: src/gui/html/js/translateStaticText.js:116 -#: src/gui/html/js/translateStaticText.js:308 -msgid "OK" -msgstr "确定" - -#: src/gui/html/js/translateStaticText.js:124 -msgid "A filename is required." -msgstr "需要一个文件名。" - -#: src/gui/html/js/translateStaticText.js:125 -#: src/gui/html/js/translateStaticText.js:136 -#: src/gui/html/js/translateStaticText.js:146 -#: src/gui/html/js/translateStaticText.js:158 -#: src/gui/html/js/translateStaticText.js:167 -#: src/gui/html/js/translateStaticText.js:175 -#: src/gui/html/js/translateStaticText.js:184 -msgid "Delete Row" -msgstr "删除行" - -#: src/gui/html/js/translateStaticText.js:132 -msgid "Note" -msgstr "注意" - -#: src/gui/html/js/translateStaticText.js:133 -msgid "Warning" -msgstr "警告" - -#: src/gui/html/js/translateStaticText.js:135 -msgid "A content string is required." -msgstr "需要一个有内容的字符串。" - -#: src/gui/html/js/translateStaticText.js:143 -msgid "Add" -msgstr "添加" - -#: src/gui/html/js/translateStaticText.js:144 -msgid "Remove" -msgstr "移除" - -#: src/gui/html/js/translateStaticText.js:145 -#: src/gui/html/js/translateStaticText.js:182 -msgid "A name is required." -msgstr "需要一个名字。" - -#: src/gui/html/js/translateStaticText.js:153 -#: src/gui/html/js/translateStaticText.js:165 -msgid "A CRC is required." -msgstr "需要一个CRC。" - -#: src/gui/html/js/translateStaticText.js:154 -#: src/gui/html/js/translateStaticText.js:155 -#: src/gui/html/js/translateStaticText.js:156 -msgid "Values must be integers." -msgstr "值必须是整数。" - -#: src/gui/html/js/translateStaticText.js:157 -#: src/gui/html/js/translateStaticText.js:166 -msgid "A utility name is required." -msgstr "需要一个实用名。" - -#: src/gui/html/js/translateStaticText.js:174 -msgid "A link is required." -msgstr "需要一个链接。" - -#: src/gui/html/js/translateStaticText.js:183 -msgid "A folder is required." -msgstr "需要一个文件夹。" - -#: src/gui/html/js/translateStaticText.js:191 -#: src/gui/html/js/translateStaticText.js:291 -msgid "Add New Row" -msgstr "添加行" - -#: src/gui/html/js/translateStaticText.js:197 -msgid "Jump To General Information" -msgstr "跳转到综合信息" - -#: src/gui/html/js/translateStaticText.js:198 -msgid "Sort Plugins" -msgstr "调整排序" - -#: src/gui/html/js/translateStaticText.js:199 -msgid "Update Masterlist" -msgstr "更新主列表" - -#: src/gui/html/js/translateStaticText.js:200 -#: src/gui/html/js/translateStaticText.js:293 -msgid "Apply" -msgstr "应用" - -#: src/gui/html/js/translateStaticText.js:202 -msgid "Search Cards" -msgstr "搜索卡片" - -#: src/gui/html/js/translateStaticText.js:205 -msgid "Redate Plugins" -msgstr "修改插件时间" - -#: src/gui/html/js/translateStaticText.js:206 -msgid "Open Debug Log Location" -msgstr "打开本地调试日志" - -#: src/gui/html/js/translateStaticText.js:207 -msgid "Clear All User Metadata" -msgstr "清除所有用户元数据" - -#: src/gui/html/js/translateStaticText.js:208 -msgid "Copy Load Order" -msgstr "复制加载顺序" - -#: src/gui/html/js/translateStaticText.js:209 -msgid "Copy Content" -msgstr "复制内容" - -#: src/gui/html/js/translateStaticText.js:210 -msgid "Refresh Content" -msgstr "刷新内容" - -#: src/gui/html/js/translateStaticText.js:211 -msgid "View Documentation" -msgstr "查看文档" - -#: src/gui/html/js/translateStaticText.js:212 -msgid "About" -msgstr "关于" - -#: src/gui/html/js/translateStaticText.js:213 -#: src/gui/html/js/translateStaticText.js:263 -msgid "Settings" -msgstr "设置" - -#: src/gui/html/js/translateStaticText.js:217 -msgid "Search cards" -msgstr "搜索卡片" - -#: src/gui/html/js/translateStaticText.js:222 -msgid "Plugins" -msgstr "插件" - -#: src/gui/html/js/translateStaticText.js:223 -msgid "Filters" -msgstr "筛选" - -#: src/gui/html/js/translateStaticText.js:224 -msgid "Press Enter or click outside the input to set the filter." -msgstr "按下回车键或点击输入框以外设置筛选。" - -#: src/gui/html/js/translateStaticText.js:225 -msgid "Show only plugins with cards that contain" -msgstr "只显示包含该卡片的插件" - -#: src/gui/html/js/translateStaticText.js:226 -msgid "No text specified" -msgstr "没有文本被指定" - -#: src/gui/html/js/translateStaticText.js:229 -msgid "Hide version numbers" -msgstr "隐藏版次号" - -#: src/gui/html/js/translateStaticText.js:230 -msgid "Hide CRCs" -msgstr "隐藏CRC" - -#: src/gui/html/js/translateStaticText.js:231 -msgid "Hide Bash Tags" -msgstr "隐藏Bash标签" - -#: src/gui/html/js/translateStaticText.js:232 -msgid "Hide notes" -msgstr "隐藏注释" - -#: src/gui/html/js/translateStaticText.js:233 -msgid "Hide 'Do not clean' messages" -msgstr "隐藏 '不要清理' 信息" - -#: src/gui/html/js/translateStaticText.js:234 -msgid "Hide all plugin messages" -msgstr "隐藏所有插件信息" - -#: src/gui/html/js/translateStaticText.js:235 -msgid "Hide inactive plugins" -msgstr "隐藏未激活插件" - -#: src/gui/html/js/translateStaticText.js:236 -msgid "Hide messageless plugins" -msgstr "隐藏无信息的插件" - -#: src/gui/html/js/translateStaticText.js:239 -msgid "Show only conflicting plugins for" -msgstr "只显示与之冲突的插件" - -#: src/gui/html/js/translateStaticText.js:240 -msgid "No plugin selected" -msgstr "没有插件被选中" - -#: src/gui/html/js/translateStaticText.js:244 -msgid "Hidden plugins:" -msgstr "已隐藏插件:" - -#: src/gui/html/js/translateStaticText.js:245 -msgid "Hidden messages:" -msgstr "已隐藏信息:" - -#: src/gui/html/js/translateStaticText.js:250 -msgid "General Information" -msgstr "综合信息" - -#: src/gui/html/js/translateStaticText.js:251 -msgid "Masterlist Revision" -msgstr "主列表版次" - -#: src/gui/html/js/translateStaticText.js:252 -msgid "Masterlist Date" -msgstr "主列表日期" - -#: src/gui/html/js/translateStaticText.js:253 -msgid "Warnings" -msgstr "警告" - -#: src/gui/html/js/translateStaticText.js:254 -msgid "Errors" -msgstr "错误" - -#: src/gui/html/js/translateStaticText.js:255 -msgid "Total Messages" -msgstr "信息总计" - -#: src/gui/html/js/translateStaticText.js:256 -msgid "Active Plugins" -msgstr "激活插件" - -#: src/gui/html/js/translateStaticText.js:257 -msgid "Dirty Plugins" -msgstr "Dirty 插件" - -#: src/gui/html/js/translateStaticText.js:258 -msgid "Total Plugins" -msgstr "插件总计" - -#: src/gui/html/js/translateStaticText.js:266 -msgid "Default Game" -msgstr "默认游戏" - -#: src/gui/html/js/translateStaticText.js:267 -msgid "Autodetect" -msgstr "自动检测" - -#: src/gui/html/js/translateStaticText.js:272 -msgid "Language changes will be applied after LOOT is restarted." -msgstr "语言会在 LOOT 重启后应用。" - -#: src/gui/html/js/translateStaticText.js:274 -msgid "Enable debug logging" -msgstr "启用调试日志" - -#: src/gui/html/js/translateStaticText.js:275 -msgid "The output is logged to the LOOTDebugLog.txt file." -msgstr "输出被记录在 LOOTDebugLog.txt 文件中。" - -#: src/gui/html/js/translateStaticText.js:277 -msgid "Update masterlist before sorting" -msgstr "在排序前更新主列表" - -#: src/gui/html/js/translateStaticText.js:281 -msgid "Base Game" -msgstr "基于游戏" - -#: src/gui/html/js/translateStaticText.js:282 -msgid "LOOT Folder" -msgstr "LOOT 文件夹" - -#: src/gui/html/js/translateStaticText.js:284 -msgid "Masterlist Repository URL" -msgstr "主列表库链接" - -#: src/gui/html/js/translateStaticText.js:285 -msgid "Masterlist Repository Branch" -msgstr "主列表库分支" - -#: src/gui/html/js/translateStaticText.js:286 -msgid "Install Path" -msgstr "安装路径" - -#: src/gui/html/js/translateStaticText.js:287 -msgid "Install Path Registry Key" -msgstr "注册表键安装路径键值" - -#: src/gui/html/js/translateStaticText.js:300 -msgid "First-Time Tips" -msgstr "首次运行小贴士" - -#: src/gui/html/js/translateStaticText.js:302 -msgid "" -"CRCs are only displayed after plugins have been loaded, either by conflict " -"filtering, or by sorting." -msgstr "CRC只在插件被载入后,通过冲突筛选或者排序来显示。" - -#: src/gui/html/js/translateStaticText.js:303 -msgid "" -"Double-click a plugin in the sidebar to quickly open it in the metadata " -"editor." -msgstr "在侧边栏双击一个插件可以快速打开它的元数据编辑器。" - -#: src/gui/html/js/translateStaticText.js:304 -msgid "" -"Plugins can be drag and dropped from the sidebar into the metadata editor's " -"\"load after\", \"requirements\" and \"incompatibility\" tables." -msgstr "" -"插件可以从侧边栏拖动进入编辑器的\"加载在后面,\"需求\"和\"不兼容\"表格。" - -#: src/gui/html/js/translateStaticText.js:305 -msgid "" -"Some features are disabled while the metadata editor is open, or while there " -"is a sorted load order that has not been applied or discarded." -msgstr "在编辑器打开,或者排序未应用和取消时,有些功能会被禁用。" - -#: src/gui/html/js/translateStaticText.js:306 -msgid "" -"Many interface elements have tooltips. If you don't know what something is, " -"try hovering your mouse over it to find out. Otherwise, LOOT's documentation " -"can be accessed through the main menu." -msgstr "" -"许多界面元素都有使用提示。如果你不知道某些功能什么,试着将鼠标停在它上。另" -"外,LOOT的帮助文档可以从主菜单进入。" - -#: src/gui/query/get_game_data_query.h:44 -msgid "Parsing, merging and evaluating metadata..." -msgstr "解析、融合并评估插件元数据..." - -#: src/gui/query/get_game_data_query.h:79 -msgid "" -"An error occurred while parsing the masterlist: %1%. This probably happened " -"because an update to LOOT changed its metadata syntax support. Try updating " -"your masterlist to resolve the error." -msgstr "" -"解析主列表时发生错误:%1%。这可能由于升级 LOOT 时改变了元数据的语法支持。尝试" -"更新你的主列表来解决这个错误。" - -#: src/gui/query/get_game_data_query.h:93 -msgid "" -"An error occurred while parsing the userlist: %1%. This probably happened " -"because an update to LOOT changed its metadata syntax support. Your user " -"metadata will have to be updated manually.\n" -"\n" -"To do so, use the 'Open Debug Log Location' in LOOT's main menu to open its " -"data folder, then open your 'userlist.yaml' file in the relevant game " -"folder. You can then edit the metadata it contains with reference to the " -"documentation, which is accessible through LOOT's main menu.\n" -"\n" -"You can also seek support on LOOT's forum thread, which is linked to on " -"[LOOT's website](https://loot.github.io/)." -msgstr "" -"解析用户列表时发生错误:%1%。这可能由于升级 LOOT 时改变了元数据的语法支持。你" -"的用户数据必须手动更新。\n" -"\n" -"要完成更新,请使用 LOOT 主菜单中的 '打开本地调试日志' 功能打开数据目录,然后" -"在相关目录打开你的 'userlist.yaml' 文件。你可以编辑这个元数据,请参考 LOOT 主" -"菜单中的文档。\n" -"\n" -"你也可以在 LOOT 论坛寻求支持,链接为 [LOOT官方网站](https://loot.github." -"io/)。" - -#: src/gui/query/metadata_query.h:79 src/gui/query/metadata_query.h:80 -msgid "(edited)" -msgstr "(已修改)" - -#: src/gui/query/metadata_query.h:101 -msgid "" -"A global message contains a condition that could not be evaluated. Details: " -"%1%" -msgstr "一条全局信息包含的条件无法被解析,详细信息:%1%" - -#: src/gui/query/metadata_query.h:127 src/backend/plugin/plugin_sorter.cpp:219 -msgid "\"%1%\" contains a condition that could not be evaluated. Details: %2%" -msgstr "\"%1%\"包含一条无法被解析的条件。详细信息:%2%" - -#: src/gui/query/sort_plugins_query.h:48 -msgid "Loading plugin contents..." -msgstr "加载插件内容..." - -#: src/gui/query/sort_plugins_query.h:75 -msgid "Sorting load order..." -msgstr "排序加载顺序..." - -#: src/backend/app/loot_paths.cpp:88 -msgid "Failed to get %LOCALAPPDATA% path." -msgstr "无法获取%LOCALAPPDATA%路径。" - -#: src/backend/app/loot_state.cpp:124 -msgid "Error: Could not create LOOT settings file. %1%" -msgstr "错误:无法创建LOOT配置文件。%1%" - -#: src/backend/app/loot_state.cpp:131 -msgid "Error: Settings parsing failed. %1%" -msgstr "错误:设置解析失败。%1%" - -#: src/backend/app/loot_state.cpp:193 -msgid "Error: Game-specific settings could not be initialised. %1%" -msgstr "错误:游戏专属设置无法初始化。%1%" - -#: src/backend/app/loot_state.cpp:272 -msgid "None of the supported games were detected." -msgstr "没有支持的游戏被选中。" - -#: src/backend/game/game.cpp:64 -msgid "Game path could not be detected." -msgstr "无法检测到游戏路径。" - -#: src/backend/game/game.cpp:74 -msgid "Could not create LOOT folder for game. Details: %1%" -msgstr "无法创建 LOOT 文件夹。详细信息:%1%" - -#: src/backend/game/game_cache.cpp:119 -msgid "You have not sorted your load order this session." -msgstr "你还没有在这个会话中整理你的加载顺序。" - -#: src/backend/game/load_order_handler.cpp:48 -msgid "Game path is not initialised." -msgstr "游戏路径未初始化。" - -#: src/backend/game/load_order_handler.cpp:84 -msgid "" -"libloadorder failed to create a game handle. Details could not be fetched." -msgstr "libloadorder 无法创建游戏处理器,详细信息无法获取。" - -#: src/backend/game/load_order_handler.cpp:87 -msgid "libloadorder failed to create a game handle. Details: %1%" -msgstr "libloadorder 无法创建游戏处理器,详细信息:%1%" - -#: src/backend/game/load_order_handler.cpp:105 -msgid "" -"libloadorder failed to check if a plugin is active. Details could not be " -"fetched." -msgstr "libloadorder 无法检查插件是否处于活动状态,详细信息无法获取。" - -#: src/backend/game/load_order_handler.cpp:108 -msgid "libloadorder failed to check if a plugin is active. Details: %1%" -msgstr "libloadorder 无法检查插件是否处于活动状态。详细信息︰%1%" - -#: src/backend/game/load_order_handler.cpp:130 -msgid "" -"libloadorder failed to get the load order. Details could not be fetched." -msgstr "libloadorder 无法获取加载顺序,详细信息无法获取。" - -#: src/backend/game/load_order_handler.cpp:133 -msgid "libloadorder failed to get the load order. Details: %1%" -msgstr "libloadorder 无法获取加载顺序,详细信息:%1%" - -#: src/backend/game/load_order_handler.cpp:170 -msgid "" -"libloadorder failed to set the load order. Details could not be fetched." -msgstr "libloadorder 无法设置加载顺序,详细信息无法获取。" - -#: src/backend/game/load_order_handler.cpp:173 -msgid "libloadorder failed to set the load order. Details: %1%" -msgstr "libloadorder 无法设置加载顺序,详细信息:%1%" - -#: src/backend/helpers/git_helper.cpp:105 -msgid "Git operation failed. Error: %1%" -msgstr "Git 操作失败。错误:%1%" - -#: src/backend/helpers/git_helper.cpp:146 -msgid "" -"An error occurred while trying to clone the remote masterlist repository." -msgstr "试图复制远程主列表库时发生错误。" - -#: src/backend/helpers/git_helper.cpp:195 -msgid "" -"An error occurred while trying to update the masterlist. This could be due " -"to a server-side error. Try again in a few minutes." -msgstr "更新主列表时发生错误。这可能是由于服务器端故障。过几分钟后再进行尝试。" - -#: src/backend/helpers/helpers.cpp:81 -msgid "Unable to open \"%1%\" for CRC calculation." -msgstr "无法打开\"%1%\"进行CRC计算。" - -#: src/backend/helpers/helpers.cpp:103 src/backend/helpers/helpers.cpp:106 -msgid "Failed to open file in its default application." -msgstr "无法使用它的默认程序来打开这个文件。" - -#: src/backend/metadata/condition_evaluator.cpp:173 -msgid "Invalid file path: %1%" -msgstr "无效文件路径:%1%" - -#: src/backend/metadata/condition_evaluator.cpp:183 -#: src/backend/metadata/condition_evaluator.cpp:223 -msgid "Invalid regex string \"%1%\": %2%" -msgstr "无效表达式\"%1%\":%2%" - -#: src/backend/metadata/condition_grammar.h:203 -msgid "Failed to parse condition \"%1%\": expected \"%2%\" at \"%3%\"." -msgstr "无法解析条件 \"%1%\":预期 %2% 在 \"%3%\"。" - -#: src/backend/metadata/conditional_metadata.cpp:91 -msgid "" -"Failed to parse condition \"%1%\": only partially matched expected syntax." -msgstr "无法解析条件 \"%1%\": 只是部分匹配预期的语法。" - -#: src/backend/metadata/plugin_cleaning_data.cpp:89 -msgid "%1% ITM record" -msgid_plural "%1% ITM records" -msgstr[0] "%1%个ITM记录。" - -#: src/backend/metadata/plugin_cleaning_data.cpp:90 -msgid "%1% deleted reference" -msgid_plural "%1% deleted references" -msgstr[0] "%1%个已删除的引用" - -#: src/backend/metadata/plugin_cleaning_data.cpp:91 -msgid "%1% deleted navmesh" -msgid_plural "%1% deleted navmeshes" -msgstr[0] "%1%个已删除的导航" - -#: src/backend/metadata/plugin_cleaning_data.cpp:95 -msgid "%1% found %2%, %3% and %4%." -msgstr "%1%发现%2%,%3%和%4%。" - -#: src/backend/metadata/plugin_cleaning_data.cpp:97 -msgid "%1% found dirty edits." -msgstr "%1%发现dirty编辑器。" - -#: src/backend/metadata/plugin_cleaning_data.cpp:100 -#: src/backend/metadata/plugin_cleaning_data.cpp:102 -#: src/backend/metadata/plugin_cleaning_data.cpp:104 -msgid "%1% found %2% and %3%." -msgstr "%1%发现%2%和%3%。" - -#: src/backend/metadata/plugin_cleaning_data.cpp:107 -#: src/backend/metadata/plugin_cleaning_data.cpp:109 -#: src/backend/metadata/plugin_cleaning_data.cpp:111 -msgid "%1% found %2%." -msgstr "%1%发现%2%。" - -#: src/backend/plugin/plugin.cpp:115 -msgid "Cannot read \"%1%\". Details: %2%" -msgstr "无法读取\"%1%\"。详细信息:%2%" - -#: src/backend/plugin/plugin.cpp:221 src/backend/plugin/plugin.cpp:232 -msgid "This plugin requires \"%1%\" to be installed, but it is missing." -msgstr "这个插件需要安装\"%1%\"。" - -#: src/backend/plugin/plugin.cpp:224 -msgid "This plugin requires \"%1%\" to be active, but it is inactive." -msgstr "这个插件激活\"%1%\"。" - -#: src/backend/plugin/plugin.cpp:238 -msgid "This plugin is incompatible with \"%1%\", but both are present." -msgstr "这个插件与\"%1%\"不兼容,但是两者都存在。" - -#: src/backend/plugin/plugin_sorter.cpp:84 -msgid "" -"Cyclic interaction detected between plugins \"%1%\" and \"%2%\". Back cycle: " -"%3%" -msgstr "插件\"%1%\"和 \"%2%\"之间产生循环。回环:%3%" - -#: src/backend/masterlist.cpp:45 -msgid "" -"An error occurred while trying to read the local masterlist's version. If " -"this error happens again, try deleting the \".git\" folder in %1%." -msgstr "" -"读取本地主列表版本时发生错误。如果错误再次发生,请尝试删除%1%里的\".git\"文件" -"夹。" - -#: src/backend/masterlist.cpp:49 -msgid "N/A: No masterlist present" -msgstr "不可用:没有主列表" - -#: src/backend/masterlist.cpp:52 -msgid "Unknown: Git repository missing" -msgstr "未知:Git 库缺失" - -#: src/backend/masterlist.cpp:117 src/backend/masterlist.cpp:131 -msgid "" -"An error occurred while trying to access the local masterlist repository. If " -"this error happens again, try deleting the \".git\" folder in %1%." -msgstr "" -"存取本地主列表库时发生错误。如果错误再次发生,请尝试删除%1%里的\".git\"文件" -"夹。" - -#: src/backend/masterlist.cpp:238 -msgid "" -"An error occurred while trying to read information on the updated " -"masterlist. If this error happens again, try deleting the \".git\" folder in " -"%1%." -msgstr "" -"更新主列表时读取信息发生错误。如果错误再次发生,请尝试删除%1%里的\".git\"文件" -"夹。" - -#: src/backend/masterlist.cpp:252 -msgid "" -"Masterlist revision %1%: %2%. The latest masterlist revision contains a " -"syntax error, LOOT is using the most recent valid revision instead. Syntax " -"errors are usually minor and fixed within hours." -msgstr "" -"主列表版次%1%:%2%。最新的主列表版次包含一个语法错误,LOOT 将使用最近的正常版" -"次替代。语法错误通常是小问题,一般在数小时内修正。" - -#~ msgid "" -#~ "%1% found %2% ITM records, %3% deleted references and %4% deleted " -#~ "navmeshes." -#~ msgstr "%1%发现%2%个ITM记录,%3%个已删除引用和%4%已删除导航。" - -#~ msgid "%1% found %2% deleted references and %3% deleted navmeshes." -#~ msgstr "%1%发现%2%个已删除引用和%3%个已删除导航。" - -#~ msgid "%1% found %2% ITM records and %3% deleted navmeshes." -#~ msgstr "%1%发现%2%个ITM记录和%3%个已删除导航。" - -#~ msgid "%1% found %2% ITM records and %3% deleted references." -#~ msgstr "%1%发现%2%个ITM记录和%3%个已删除引用。" - -#~ msgid "Masterlist revision" -#~ msgstr "主列表版次" - -#~ msgid "Invalid game ID supplied." -#~ msgstr "无效的游戏ID" - -#~ msgid "Unsupported game ID supplied." -#~ msgstr "不支持的游戏ID" - -#~ msgid "Expected \"%1%\" at \"%2%\"." -#~ msgstr "预期\"%1%\"在\"%2%\"。" - -#~ msgid "Failed to change game. Details: %1%" -#~ msgstr "无法更换游戏,详细信息:%1%" - -#~ msgid "Failed to copy plugin metadata. Details: %1%" -#~ msgstr "无法复制插件元数据,详细信息:%1%" - -#~ msgid "Failed to apply plugin metadata. Details: %1%" -#~ msgstr "无法应用插件元数据,详细信息:%1%" - -#~ msgid "Failed to get game data. Details: %1%" -#~ msgstr "无法获取游戏数据,详细信息:%1%" - -#~ msgid "Failed to update the masterlist. Details: %1%" -#~ msgstr "无法更新主列表,详细信息:%1%" - -#~ msgid "An exception occurred while loading this plugin. Details:" -#~ msgstr "载入这个插件时发生意外,详细信息:" - -#~ msgid "" -#~ "libloadorder failed to initialise game master file support. Details could " -#~ "not be fetched." -#~ msgstr "libloadorder 无法初始化游戏master文件支持,详细信息无法获取。" - -#~ msgid "libloadorder failed to initialise game master file support. Details:" -#~ msgstr "libloadorder 无法初始化游戏master文件支持,详细信息:" - -#~ msgid "Clean with %1%." -#~ msgstr "使用%1%清理。" - -#~ msgid "Contains %1% deleted navmeshes. Clean with %2%." -#~ msgstr "包含%1%个已删除导航。使用%2%清理。" - -#~ msgid "Contains %1% deleted references. Clean with %2%." -#~ msgstr "包含%1%个已删除引用。使用%2%清理。" - -#~ msgid "Contains %1% ITM records. Clean with %2%." -#~ msgstr "包含%1%个ITM记录。使用%2%清理。" - -#~ msgid "Building plugin graph..." -#~ msgstr "构建插件图表..." - -#~ msgid "Adding edges to plugin graph and performing topological sort..." -#~ msgstr "添加插件图表路段并执行拓扑排序..." - -#~ msgid "Shell execute failed." -#~ msgstr "Shell 执行失败。" - -#~ msgid "Loading plugin headers..." -#~ msgstr "加载插件信息..." - -#~ msgid "Parsing masterlist..." -#~ msgstr "解析主列表..." - -#~ msgid "Parsing userlist..." -#~ msgstr "解析用户列表..." - -#~ msgid "Loading general messages..." -#~ msgstr "载入综合信息..." - -#~ msgid "Regenerating displayed content..." -#~ msgstr "重建显示内容..." - -#~ msgid "Error: Games' settings parsing failed. %1%" -#~ msgstr "错误:游戏设置解析失败。%1%" - -#~ msgid "Invalid folder path:" -#~ msgstr "无效文件夹路径:" - -#~ msgid "Loading game data..." -#~ msgstr "载入游戏数据..." - -#~ msgid "Updating masterlist..." -#~ msgstr "更新主列表..." - -#~ msgid "Sorting plugins..." -#~ msgstr "排序插件..." - -#~ msgid "Refreshing data..." -#~ msgstr "刷新数据..." - -#~ msgid "Checking if plugins have been loaded..." -#~ msgstr "检查插件是否被加载..." - -#~ msgid "unknown" -#~ msgstr "未知" - -#~ msgid "Show Only Conflicts" -#~ msgstr "只显示冲突" - -#~ msgid "" -#~ "Global priorities are compared against all other plugins. Normal " -#~ "priorities are compared against only conflicting plugins." -#~ msgstr "全局优先级相对于所有其他插件。普通优先级只相对于冲突的插件。" - -#~ msgid "Dirty Info" -#~ msgstr "Dirty 信息" - -#~ msgid "Filter content" -#~ msgstr "筛选内容" diff --git a/resources/ui/css/dark-theme.css b/resources/ui/css/dark-theme.css deleted file mode 100644 index 84009941..00000000 --- a/resources/ui/css/dark-theme.css +++ /dev/null @@ -1,55 +0,0 @@ -/* Dark theme CSS overrides. */ - -/* CSS Custom Variables */ -:root { - /* --primary-color is used for the main toolbar background, floating input - labels and dialog buttons. */ - --primary-color: var(--paper-blue-600); - - /* --light-primary-color is used for the editor toolbar background. */ - --light-primary-color: var(--paper-grey-900); - - /* --accent-color is used for underlines and ripples */ - --accent-color: var(--paper-blue-600); - - /* --dark-accent-color is used for links, the Apply sorting button, and the - Save editor icon button. */ - --dark-accent-color: var(--paper-blue-500); - - /* --primary-background-color is use for sidebar, dialog and card backgrounds. */ - --primary-background-color: var(--paper-grey-800); - --primary-text-color: var(--dark-theme-text-color); - --secondary-text-color: var(--dark-theme-secondary-color); - --disabled-text-color: var(--dark-theme-disabled-color); - --divider-color: var(--dark-theme-divider-color); - - /* --paper-toolbar-background can be used to override the --primary-color defined - above for the main toolbar. */ - --paper-toolbar-background: var(--paper-grey-900); - - /* --secondary-background-color is used for the progress bar background and - the background behind cards. */ - --secondary-background-color: #303030; - --paper-progress-container-color: var(--secondary-background-color); - - /* --loot-plugin-item-index-border-color is used to control the colour of the - border around load order indices in the sidebar. */ - --loot-plugin-item-index-border-color: var(--paper-color-300); -} - -#main { - background: var(--secondary-background-color); -} - -li.error > p, -li.warn > p { - color: black; -} - -.version { - color: #78909C; -} - -.crc { - color: #8D6E63; -} diff --git a/scripts/appveyor/build_installer.ps1 b/scripts/appveyor/build_installer.ps1 deleted file mode 100644 index bab6cebd..00000000 --- a/scripts/appveyor/build_installer.ps1 +++ /dev/null @@ -1,22 +0,0 @@ -function DownloadLanguageFile($languageFile, $innoPath) { - $url = 'https://raw.github.com/jrsoftware/issrc/master/Files/Languages/Unofficial/' + $languageFile - $installPath = $innoPath + '\Languages\' + $languageFile - - (New-Object System.Net.WebClient).DownloadFile($url, $installPath) -} - -$innoInstallPath = 'C:\Program Files (x86)\Inno Setup 5' - -# Install the Inno Download Plugin -$url = 'https://bitbucket.org/mitrich_k/inno-download-plugin/downloads/idpsetup-1.5.1.exe' -(New-Object System.Net.WebClient).DownloadFile($url, (pwd).path + '/idpsetup-1.5.1.exe') -./idpsetup-1.5.1.exe /verysilent - -# Also install the unofficial Korean and Simplified Chinese translation -# files for Inno Setup. -DownloadLanguageFile '\Korean.isl' $innoInstallPath -DownloadLanguageFile '\ChineseSimplified.isl' $innoInstallPath - -$env:PATH += ';' + $innoInstallPath - -iscc scripts\installer.iss diff --git a/scripts/appveyor/update_masterlist_branches.ps1 b/scripts/appveyor/update_masterlist_branches.ps1 deleted file mode 100644 index dd9c980d..00000000 --- a/scripts/appveyor/update_masterlist_branches.ps1 +++ /dev/null @@ -1,23 +0,0 @@ -function Get-BranchName() { - $numbers = $env:APPVEYOR_REPO_TAG_NAME.Split('.') - - if ($numbers[0] -eq 0) { - $numbers = $numbers[0..($numbers.length - 2)] - } else { - $numbers = @($numbers[0]) - } - - return "v" + ($numbers -join '.') -} - -if ($env:APPVEYOR_REPO_TAG -eq 'true') { - npm install -g lomad - $branchName = Get-BranchName - - Write-Output "`nUpdating masterlists' default branch to $branchName..." - lomad -t $env:github_auth_token -a -d $branchName - - if ($lastexitcode -eq 0) { - Write-Output "Masterlists' default branches have been updated." - } -} diff --git a/scripts/archive.js b/scripts/archive.js deleted file mode 100644 index c55aa3f4..00000000 --- a/scripts/archive.js +++ /dev/null @@ -1,248 +0,0 @@ -#!/usr/bin/env node -// Archive packaging script. Takes one argument, which is the path to the -// repository's root. Requires 7-zip and Git to be installed, and Git to be -// available on the system path. -'use strict'; -const childProcess = require('child_process'); -const path = require('path'); -const fs = require('fs-extra'); -const os = require('os'); -const helpers = require('./helpers'); - -function getGitDescription() { - const describe = String(helpers.safeExecFileSync('git', [ - 'describe', - '--tags', - '--long', - '--abbrev=7', - ])).slice(0, -1); - let branch = String(helpers.safeExecFileSync('git', [ - 'rev-parse', - '--abbrev-ref', - 'HEAD', - ])).slice(0, -1); - - /* On AppVeyor and Travis CI, a specific commit is checked out, so the branch - is HEAD. Use their stored branch value instead. */ - if (branch === 'HEAD') { - if (process.env.APPVEYOR_REPO_BRANCH) { - branch = process.env.APPVEYOR_REPO_BRANCH; - } else if (process.env.TRAVIS_BRANCH) { - branch = process.env.TRAVIS_BRANCH; - } - } - - return `${describe}_${branch}`; -} - -function getLanguageFolders() { - return [ - 'es', - 'ru', - 'fr', - 'zh_CN', - 'pl', - 'pt_BR', - 'fi', - 'de', - 'da', - 'ko', - 'sv', - ]; -} - -function compress(sourcePath, destPath) { - // First remove any existing archive. - fs.removeSync(destPath); - - const filename = path.basename(destPath); - const rootFolder = path.basename(sourcePath); - const workingDirectory = path.dirname(sourcePath); - - if (os.platform() === 'win32') { - let sevenzipPath = path.join('C:\\', 'Program Files', '7-Zip', '7z.exe'); - if (!helpers.fileExists(sevenzipPath)) { - sevenzipPath = '7z'; - } - - // The last argument must have a leading dot for the subdirectory not to - // be present in the archive, but path.join removes it, so it's prefixed. - return helpers.safeExecFileSync(sevenzipPath, [ - 'a', - '-r', - filename, - rootFolder, - ], { - cwd: workingDirectory, - }); - } - - return childProcess.execSync(`tar -cJf ${filename} ${rootFolder}`, { - cwd: workingDirectory, - }); -} - -function createAppArchive(rootPath, releasePath, tempPath, destPath) { - // Ensure that the output directory is empty. - fs.emptyDirSync(tempPath); - - // Copy LOOT exectuable and CEF files. - let binaries = []; - if (os.platform() === 'win32') { - binaries = [ - 'LOOT.exe', - 'loot_api.dll', - 'chrome_elf.dll', - 'd3dcompiler_47.dll', - 'libEGL.dll', - 'libGLESv2.dll', - 'libcef.dll', - 'natives_blob.bin', - 'snapshot_blob.bin', - 'cef.pak', - 'cef_100_percent.pak', - 'cef_200_percent.pak', - 'devtools_resources.pak', - 'icudtl.dat', - ]; - } else { - binaries = [ - 'LOOT', - 'libloot_api.so', - 'chrome-sandbox', - 'libcef.so', - 'natives_blob.bin', - 'snapshot_blob.bin', - 'cef.pak', - 'cef_100_percent.pak', - 'cef_200_percent.pak', - 'devtools_resources.pak', - 'icudtl.dat', - ]; - } - binaries.forEach((file) => { - fs.copySync( - path.join(releasePath, file), - path.join(tempPath, file) - ); - }); - - // CEF locale file. - fs.mkdirsSync(path.join(tempPath, 'resources', 'l10n')); - fs.copySync( - path.join(releasePath, 'resources', 'l10n', 'en-US.pak'), - path.join(tempPath, 'resources', 'l10n', 'en-US.pak') - ); - - // Translation files. - getLanguageFolders().forEach((lang) => { - fs.mkdirsSync(path.join(tempPath, 'resources', 'l10n', lang, 'LC_MESSAGES')); - fs.copySync( - path.join(rootPath, 'resources', 'l10n', lang, 'LC_MESSAGES', 'loot.mo'), - path.join(tempPath, 'resources', 'l10n', lang, 'LC_MESSAGES', 'loot.mo') - ); - }); - - // UI files. - fs.copySync( - path.join(releasePath, 'resources', 'ui'), - path.join(tempPath, 'resources', 'ui') - ); - - // Documentation. - fs.copySync( - path.join(rootPath, 'build', 'docs', 'html'), - path.join(tempPath, 'docs') - ); - - // Now compress the folder to a 7-zip archive. - compress(tempPath, destPath); - - // Finally, delete the temporary folder. - fs.removeSync(tempPath); -} - -function createApiArchive(rootPath, releasePath, tempPath, destPath) { - // Ensure that the output directory is empty. - fs.emptyDirSync(tempPath); - - // API binary/binaries. - let binaries = []; - if (os.platform() === 'win32') { - binaries = [ - 'loot_api.dll', - 'loot_api.lib', - ]; - } else { - binaries = [ - 'libloot_api.so', - ]; - } - binaries.forEach((file) => { - fs.copySync( - path.join(releasePath, file), - path.join(tempPath, file) - ); - }); - - // API header files. - fs.mkdirsSync(path.join(tempPath, 'include')); - fs.copySync( - path.join(rootPath, 'include', 'loot'), - path.join(tempPath, 'include', 'loot') - ); - - // Documentation. - fs.copySync( - path.join(rootPath, 'build', 'docs', 'html'), - path.join(tempPath, 'docs') - ); - - // Now compress the folder to a 7-zip archive. - compress(tempPath, destPath); - - // Finally, delete the temporary folder. - fs.removeSync(tempPath); -} - -function getFilenameSuffix(label, gitDescription) { - if (label) { - return `${gitDescription}_${label}`; - } else if (process.env.APPVEYOR) { - return `${gitDescription}_${process.env.PLATFORM}`; - } - - return `${gitDescription}`; -} - -function getArchiveFileExtension() { - if (os.platform() === 'win32') { - return '.7z'; - } - - return '.tar.xz'; -} - -let rootPath = '.'; -if (process.argv.length > 2) { - rootPath = process.argv[2]; -} - -const gitDesc = getGitDescription(); -const fileExtension = getArchiveFileExtension(); - -helpers.getAppReleasePaths(rootPath).forEach(releasePath => { - const filename = `loot_${getFilenameSuffix(releasePath.label, gitDesc)}`; - createAppArchive(rootPath, - releasePath.path, - path.join(rootPath, 'build', filename), - path.join(rootPath, 'build', filename + fileExtension)); -}); - -helpers.getApiBinaryPaths(rootPath).forEach(binaryPath => { - const filename = `loot-api_${getFilenameSuffix(binaryPath.label, gitDesc)}`; - createApiArchive(rootPath, - binaryPath.path, - path.join(rootPath, 'build', filename), - path.join(rootPath, 'build', filename + fileExtension)); -}); diff --git a/scripts/build_ui.js b/scripts/build_ui.js deleted file mode 100644 index 512ee17d..00000000 --- a/scripts/build_ui.js +++ /dev/null @@ -1,121 +0,0 @@ -'use strict'; -const helpers = require('./helpers'); -const hyd = require('hydrolysis'); -const fs = require('fs-extra'); -const path = require('path'); -const getRobotoFiles = require('./get_roboto_files').getRobotoFiles; - -function handleError(error) { - console.error(error); - process.exit(1); -} - -function getHtmlImports(filePath) { - return hyd.Analyzer.analyze(filePath).then((analyzer) => - analyzer._getDependencies(filePath) - ); -} - -function isString(variable) { - return typeof variable === 'string' || variable instanceof String; -} - -function flattenUnique(array) { - const results = new Set(); - array.forEach((element) => { - if (isString(element)) { - results.add(element); - } else if (element) { - flattenUnique(element).forEach((subelement) => { - results.add(subelement); - }); - } - }); - return results; -} - -function getRecursiveHtmlImports(filePath, imports) { - return getHtmlImports(filePath).then((paths) => - Promise.all(paths.map((dependency) => { - if (imports.has(dependency)) { - return null; - } - imports.add(dependency); - return getRecursiveHtmlImports(dependency, imports); - })) - ).then((results) => { - flattenUnique(results).forEach((dependency) => { - imports.add(dependency); - }); - - return imports; - }); -} - -function getJavaScriptSources(filePath) { - return hyd.Analyzer.analyze(filePath).then((analyzer) => - Object.keys(analyzer.parsedScripts).filter((script) => - script.endsWith('.js') - ) - ); -} - -function getRelativePath(filePath) { - if (filePath.startsWith('src/gui/html/')) { - return filePath.substring(13); - } - return filePath; -} - -function normalisePaths(html) { - return html.replace(/href="(\.\.\/){3}/g, 'href="') - .replace(/src="(\.\.\/){3}/g, 'src="'); -} - -function copyNormalisedFile(sourceFile, destinationFile) { - const html = fs.readFileSync(sourceFile, { encoding: 'utf8' }); - fs.mkdirsSync(path.dirname(destinationFile)); - fs.writeFileSync(destinationFile, normalisePaths(html)); -} - -function copyFiles(pathsPromise, destinationRootPath) { - pathsPromise.then((paths) => { - paths.forEach((filePath) => { - const destinationPath = `${destinationRootPath}/${getRelativePath(filePath)}`; - if (filePath.includes('bower_components')) { - fs.copySync(filePath, destinationPath); - } else { - copyNormalisedFile(filePath, destinationPath); - } - }); - }).catch(handleError); -} - -const url = 'https://github.com/google/roboto/releases/download/v2.135/roboto-hinted.zip'; -const fontsPath = 'build/fonts'; - -Promise.resolve().then(() => { - if (!fs.existsSync(fontsPath)) { - return getRobotoFiles(url, fontsPath); - } - - return ''; -}).then(() => { - helpers.getAppReleasePaths('.').forEach(releasePath => { - const index = 'src/gui/html/index.html'; - const destinationRootPath = `${releasePath.path}/resources/ui`; - const imports = new Set(); - - copyFiles(getRecursiveHtmlImports(index, imports), destinationRootPath); - copyFiles(getJavaScriptSources(index), destinationRootPath); - fs.copySync('src/gui/html/css', `${destinationRootPath}/css`); - fs.copySync('resources/ui/css/dark-theme.css', `${destinationRootPath}/css/dark-theme.css`); - fs.copySync(fontsPath, `${destinationRootPath}/fonts`); - copyNormalisedFile(index, `${destinationRootPath}/index.html`); - - // This is the only JS file referenced by a HTML import (neon-animation), - // so just hardcode it instead of recursively searching for it. - const webAnimationsJs = 'bower_components/web-animations-js/web-animations-next-lite.min.js'; - fs.copySync(webAnimationsJs, `${destinationRootPath}/${webAnimationsJs}`); - }); -}).catch(handleError); diff --git a/scripts/cmake/configure_cef.cmake b/scripts/cmake/configure_cef.cmake deleted file mode 100644 index 339b41ed..00000000 --- a/scripts/cmake/configure_cef.cmake +++ /dev/null @@ -1,25 +0,0 @@ -# Set CEF_PATH to the path to the root of the CEF folder that contains the -# files to be edited. - -# Remove the "add_subdirectory(cefclient)" and "add_subdirectory(cefsimple)" -# lines from CEF's CMakeLists.txt. -set(CEF_CMAKELISTS_PATH "CMakeLists.txt") -file(READ ${CEF_CMAKELISTS_PATH} CEF_CMAKELISTS) - -string(REPLACE "add_subdirectory(cefclient)" "" CEF_CMAKELISTS ${CEF_CMAKELISTS}) -string(REPLACE "add_subdirectory(cefsimple)" "" CEF_CMAKELISTS ${CEF_CMAKELISTS}) -string(REGEX REPLACE "add_subdirectory\\(tests/.+\\)" "" CEF_CMAKELISTS ${CEF_CMAKELISTS}) - -file(WRITE ${CEF_CMAKELISTS_PATH} ${CEF_CMAKELISTS}) - -message("MSVC_STATIC_RUNTIME: ${MSVC_STATIC_RUNTIME}") - -if (NOT MSVC_STATIC_RUNTIME) - # Replace the "/MT" and "/MTd" linker flags with "/MD" and "/MDd". - set(CEF_VARIABLES_PATH "cmake/cef_variables.cmake") - file(READ ${CEF_VARIABLES_PATH} CEF_VARIABLES) - - string(REPLACE "/MT" "/MD" CEF_VARIABLES ${CEF_VARIABLES}) - - file(WRITE ${CEF_VARIABLES_PATH} ${CEF_VARIABLES}) -endif () diff --git a/scripts/create_ico.js b/scripts/create_ico.js deleted file mode 100644 index 0b0d7bb8..00000000 --- a/scripts/create_ico.js +++ /dev/null @@ -1,32 +0,0 @@ -const helpers = require('./helpers'); -const fs = require('fs-extra'); -const path = require('path'); - -const svgPath = path.join('resources', 'icon.svg'); -const buildDirectory = path.join('build', 'icon'); -const outputPath = path.join(buildDirectory, 'icon.ico'); - -const svgSize = 192; -const svgDPI = 90; - -const sizes = [16, 20, 24, 30, 32, 36, 40, 48, 60, 64, 72, 80, 96, 128, 256]; - -fs.mkdirsSync(buildDirectory); - -const convertArgs = []; -sizes.forEach((size) => { - const pngFile = path.join(buildDirectory, `icon-${size}.png`); - convertArgs.push(pngFile); - - helpers.safeExecFileSync('convert', [ - '-density', - (size / svgSize) * svgDPI, - '-background', - 'none', - svgPath, - pngFile, - ]); -}); - -convertArgs.push(outputPath); -helpers.safeExecFileSync('convert', convertArgs); diff --git a/scripts/get_roboto_files.js b/scripts/get_roboto_files.js deleted file mode 100644 index c4d01760..00000000 --- a/scripts/get_roboto_files.js +++ /dev/null @@ -1,26 +0,0 @@ -const fs = require('fs-extra'); -const path = require('path'); -const request = require('request'); -const decompress = require('decompress'); -const decompressUnzip = require('decompress-unzip'); - -function getRobotoFiles(url, destinationPath) { - const extractPath = path.dirname(destinationPath); - const downloadPath = path.join(extractPath, 'roboto-hinted.zip'); - - return new Promise((resolve, reject) => { - request(url) - .pipe(fs.createWriteStream(downloadPath)) - .on('close', (err) => { - if (err) { - reject(err); - } - resolve(); - }); - }).then(() => decompress(downloadPath, extractPath)).then(() => { - fs.renameSync(path.join(extractPath, 'roboto-hinted'), destinationPath); - fs.removeSync(downloadPath); - }); -} - -module.exports.getRobotoFiles = getRobotoFiles; diff --git a/scripts/git/pre-commit b/scripts/git/pre-commit deleted file mode 100755 index 4ad94490..00000000 --- a/scripts/git/pre-commit +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh -# This is a Git pre-commit hook. Install it to `.git/hooks`. -# -# Run xgettext to write a new resources/l10n/template.pot, then add it to the -# commit if more than one line in it has changed, otherwise discard any changes -# to it. - -xgettext --keyword="translate:1,1t" --keyword="translate:1,2,3t" --keyword="translateFormatted:1" --add-location=full --from-code=utf-8 --package-name=LOOT --package-version=0.10.3 --copyright-holder="WrinklyNinja" --msgid-bugs-address="https://github.com/loot/loot/issues" -o resources/l10n/template.pot src/gui/html/js/*.* src/gui/*.cpp src/gui/query/*.h src/gui/*/*.cpp src/api/*/*.* src/api/*.* - -sed -i 's|charset=CHARSET|charset=UTF-8|' resources/l10n/template.pot - -LINES_ADDED=$(git diff --numstat resources/l10n/template.pot | cut -f 1) -LINES_REMOVED=$(git diff --numstat resources/l10n/template.pot | cut -f 2) - -if [ "$LINES_ADDED" = "$LINES_REMOVED" -a "$LINES_ADDED" = "1" ]; then - git checkout -- resources/l10n/template.pot -else - git add resources/l10n/template.pot -fi diff --git a/scripts/helpers.js b/scripts/helpers.js deleted file mode 100644 index 743401cb..00000000 --- a/scripts/helpers.js +++ /dev/null @@ -1,93 +0,0 @@ -// Helper functions shared across scripts. -'use strict'; -const childProcess = require('child_process'); -const path = require('path'); -const fs = require('fs'); -const os = require('os'); - -function fileExists(filePath) { - try { - // Query the entry - const stats = fs.lstatSync(filePath); - - // Is it a directory? - if (stats.isFile()) { - return true; - } - } catch (e) { - /* Don't do anything, it's not an error. */ - } - - return false; -} - -function getBinaryParentPaths(rootPath) { - const paths = [ - { - path: path.join(rootPath, 'build'), - label: null, - }, - { - path: path.join(rootPath, 'build', '32'), - label: '32-bit', - }, - { - path: path.join(rootPath, 'build', '64'), - label: '64-bit', - }, - ]; - - if (os.platform() === 'win32') { - paths.forEach(parentPath => { - parentPath.path = path.join(parentPath.path, 'Release'); - }); - } - - return paths; -} - -function getAppReleasePaths(rootPath) { - let file = 'LOOT'; - if (os.platform() === 'win32') { - file += '.exe'; - } - - return getBinaryParentPaths(rootPath).filter( - parentPath => fileExists(path.join(parentPath.path, file)) - ); -} - -function getBinaryPaths(rootPath, file) { - return getBinaryParentPaths(rootPath) - .map(parentPath => { - parentPath.path = path.join(parentPath.path, file); - return parentPath; - }) - .filter(parentPath => fileExists(parentPath.path)); -} - -function getApiBinaryPaths(rootPath) { - let file = 'loot_api'; - if (os.platform() === 'win32') { - file += '.dll'; - } else { - file = `lib${file}.so`; - } - - return getBinaryParentPaths(rootPath).filter( - parentPath => fileExists(path.join(parentPath.path, file)) - ); -} - -function safeExecFileSync(file, args, options) { - try { - return childProcess.execFileSync(file, args, options); - } catch (error) { - throw new Error(error.message); - } -} - -module.exports.fileExists = fileExists; -module.exports.getAppReleasePaths = getAppReleasePaths; -module.exports.getApiBinaryPaths = getApiBinaryPaths; -module.exports.safeExecFileSync = safeExecFileSync; diff --git a/scripts/installer.iss b/scripts/installer.iss deleted file mode 100644 index 1cf491c2..00000000 --- a/scripts/installer.iss +++ /dev/null @@ -1,315 +0,0 @@ -; LOOT installer Inno Setup script. -; This file must be encoded in UTF-8 WITH a BOM for Unicode text to -; be displayed correctly. - -#include -#include -#include -#include -#include -#include -#include - -#define MyAppName "LOOT" -#define MyAppVersion "0.10.3" -#define MyAppPublisher "LOOT Team" -#define MyAppURL "https://loot.github.io" -#define MyAppExeName "LOOT.exe" - -#if FileExists(AddBackslash(CompilerPath) + 'Languages\Korean.isl') -#define KoreanExists -#endif - -#if FileExists(AddBackslash(CompilerPath) + 'Languages\ChineseSimplified.isl') -#define SimplifiedChineseExists -#endif - -#if FileExists(SourcePath + '..\build\32\Release\LOOT.exe') -#define buildir "build\32" -#else -#define buildir "build" -#endif - -[Setup] -; NOTE: The value of AppId uniquely identifies this application. -; Do not use the same AppId value in installers for other applications. -; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) -AppId={{BF634210-A0D4-443F-A657-0DCE38040374} -AppName={#MyAppName} -AppVersion={#MyAppVersion} -;AppVerName={#MyAppName} {#MyAppVersion} -AppPublisher={#MyAppPublisher} -AppPublisherURL={#MyAppURL} -AppSupportURL={#MyAppURL} -AppUpdatesURL={#MyAppURL} -AppCopyright=Copyright (C) 2009-2016 {#MyAppPublisher} -DefaultDirName={pf}\{#MyAppName} -SourceDir=..\ -OutputBaseFilename=LOOT Installer -OutputDir=build -SetupIconFile=build\icon\icon.ico -Compression=lzma -SolidCompression=yes -DisableDirPage=no -DisableReadyPage=yes -DisableProgramGroupPage=yes - -[Languages] -Name: "en"; MessagesFile: "compiler:Default.isl" -Name: "pt_BR"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl" -Name: "da"; MessagesFile: "compiler:Languages\Danish.isl" -Name: "fi"; MessagesFile: "compiler:Languages\Finnish.isl" -Name: "fr"; MessagesFile: "compiler:Languages\French.isl" -Name: "de"; MessagesFile: "compiler:Languages\German.isl" -#ifdef KoreanExists -Name: "ko"; MessagesFile: "compiler:Languages\Korean.isl" -#endif -Name: "pl"; MessagesFile: "compiler:Languages\Polish.isl" -Name: "ru"; MessagesFile: "compiler:Languages\Russian.isl" -#ifdef SimplifiedChineseExists -Name: "zh_CN"; MessagesFile: "compiler:Languages\ChineseSimplified.isl" -#endif -Name: "es"; MessagesFile: "compiler:Languages\Spanish.isl" - -[Tasks] -Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked - -[Files] -Source: "{#buildir}\Release\LOOT.exe"; \ -DestDir: "{app}"; Flags: ignoreversion -Source: "{#buildir}\Release\cef.pak"; \ -DestDir: "{app}"; Flags: ignoreversion -Source: "{#buildir}\Release\cef_100_percent.pak"; \ -DestDir: "{app}"; Flags: ignoreversion -Source: "{#buildir}\Release\cef_200_percent.pak"; \ -DestDir: "{app}"; Flags: ignoreversion -Source: "{#buildir}\Release\d3dcompiler_47.dll"; \ -DestDir: "{app}"; Flags: ignoreversion -Source: "{#buildir}\Release\devtools_resources.pak"; \ -DestDir: "{app}"; Flags: ignoreversion -Source: "{#buildir}\Release\icudtl.dat"; \ -DestDir: "{app}"; Flags: ignoreversion -Source: "{#buildir}\Release\chrome_elf.dll"; \ -DestDir: "{app}"; Flags: ignoreversion -Source: "{#buildir}\Release\libcef.dll"; \ -DestDir: "{app}"; Flags: ignoreversion -Source: "{#buildir}\Release\libEGL.dll"; \ -DestDir: "{app}"; Flags: ignoreversion -Source: "{#buildir}\Release\libGLESv2.dll"; \ -DestDir: "{app}"; Flags: ignoreversion -Source: "{#buildir}\Release\natives_blob.bin"; \ -DestDir: "{app}"; Flags: ignoreversion -Source: "{#buildir}\Release\snapshot_blob.bin"; \ -DestDir: "{app}"; Flags: ignoreversion -Source: "{#buildir}\Release\resources\l10n\en-US.pak"; \ -DestDir: "{app}\resources\l10n"; Flags: ignoreversion - -Source: "{#buildir}\docs\html\*"; \ -DestDir: "{app}\docs"; Flags: ignoreversion recursesubdirs - -Source: "{#buildir}\Release\resources\ui\*"; \ -DestDir: "{app}\resources\ui"; Flags: ignoreversion recursesubdirs - -Source: "resources\l10n\da\LC_MESSAGES\loot.mo"; \ -DestDir: "{app}\resources\l10n\da\LC_MESSAGES"; Flags: ignoreversion -Source: "resources\l10n\de\LC_MESSAGES\loot.mo"; \ -DestDir: "{app}\resources\l10n\de\LC_MESSAGES"; Flags: ignoreversion -Source: "resources\l10n\es\LC_MESSAGES\loot.mo"; \ -DestDir: "{app}\resources\l10n\es\LC_MESSAGES"; Flags: ignoreversion -Source: "resources\l10n\fi\LC_MESSAGES\loot.mo"; \ -DestDir: "{app}\resources\l10n\fi\LC_MESSAGES"; Flags: ignoreversion -Source: "resources\l10n\fr\LC_MESSAGES\loot.mo"; \ -DestDir: "{app}\resources\l10n\fr\LC_MESSAGES"; Flags: ignoreversion -Source: "resources\l10n\ko\LC_MESSAGES\loot.mo"; \ -DestDir: "{app}\resources\l10n\ko\LC_MESSAGES"; Flags: ignoreversion -Source: "resources\l10n\pl\LC_MESSAGES\loot.mo"; \ -DestDir: "{app}\resources\l10n\pl\LC_MESSAGES"; Flags: ignoreversion -Source: "resources\l10n\pt_BR\LC_MESSAGES\loot.mo"; \ -DestDir: "{app}\resources\l10n\pt_BR\LC_MESSAGES"; Flags: ignoreversion -Source: "resources\l10n\ru\LC_MESSAGES\loot.mo"; \ -DestDir: "{app}\resources\l10n\ru\LC_MESSAGES"; Flags: ignoreversion -Source: "resources\l10n\sv\LC_MESSAGES\loot.mo"; \ -DestDir: "{app}\resources\l10n\sv\LC_MESSAGES"; Flags: ignoreversion -Source: "resources\l10n\zh_CN\LC_MESSAGES\loot.mo"; \ -DestDir: "{app}\resources\l10n\zh_CN\LC_MESSAGES"; Flags: ignoreversion - -[Icons] -Name: "{commonprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" -Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon - -[Run] -Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent -Filename: "{tmp}\vc_redist.x86.exe"; Parameters: "/quiet /norestart"; Flags: skipifdoesntexist - -[Registry] -; Store install path for backwards-compatibility with old NSIS install script behaviour. -Root: HKLM; Subkey: "Software\LOOT"; ValueType: string; ValueName: "Installed Path"; ValueData: "{app}"; Flags: deletekey uninsdeletekey - -[UninstallDelete] -Type: files; Name: "{localappdata}\{#MyAppName}\"; -Type: files; Name: "{localappdata}\{#MyAppName}\"; - -Type: files; Name: "{localappdata}\{#MyAppName}\Oblivion\masterlist.yaml"; -Type: files; Name: "{localappdata}\{#MyAppName}\Skyrim\masterlist.yaml"; -Type: files; Name: "{localappdata}\{#MyAppName}\Fallout3\masterlist.yaml"; -Type: files; Name: "{localappdata}\{#MyAppName}\FalloutNV\masterlist.yaml"; -Type: files; Name: "{localappdata}\{#MyAppName}\Fallout4\masterlist.yaml"; - -Type: filesandordirs; Name: "{localappdata}\{#MyAppName}\Oblivion\.git"; -Type: filesandordirs; Name: "{localappdata}\{#MyAppName}\Skyrim\.git"; -Type: filesandordirs; Name: "{localappdata}\{#MyAppName}\Fallout3\.git"; -Type: filesandordirs; Name: "{localappdata}\{#MyAppName}\FalloutNV\.git"; -Type: filesandordirs; Name: "{localappdata}\{#MyAppName}\Fallout4\.git"; - -Type: dirifempty; Name: "{localappdata}\{#MyAppName}\Oblivion"; -Type: dirifempty; Name: "{localappdata}\{#MyAppName}\Skyrim"; -Type: dirifempty; Name: "{localappdata}\{#MyAppName}\Fallout3"; -Type: dirifempty; Name: "{localappdata}\{#MyAppName}\FalloutNV"; -Type: dirifempty; Name: "{localappdata}\{#MyAppName}\Fallout4"; - -Type: dirifempty; Name: "{localappdata}\{#MyAppName}"; - -[CustomMessages] -en.DeleteUserFiles=Do you want to delete your settings and user metadata? -;pt_BR.DeleteUserFiles= -da.DeleteUserFiles=Ønsker du at slette dine indstillinger og bruger metadata? -fi.DeleteUserFiles=Haluatko poistaa asetukset ja käyttäjä metatiedot? -fr.DeleteUserFiles=Voulez-vous supprimer vos paramètres et les métadonnées de l'utilisateur? -de.DeleteUserFiles=Möchten Sie Ihre Einstellungen und Benutzer-Metadaten löschen? -#ifdef KoreanExists -ko.DeleteUserFiles=당신은 당신의 설정과 사용자 메타 데이터를 삭제 하시겠습니까? -#endif -pl.DeleteUserFiles=Czy chcesz usunąć ustawienia i metadane użytkownika? -ru.DeleteUserFiles=Вы хотите удалить ваши настройки и метаданные пользователя? -#ifdef SimplifiedChineseExists -zh_CN.DeleteUserFiles=你想要删除你的设置和用户数据吗? -#endif -es.DeleteUserFiles=¿Quieres borrar sus ajustes y metadatos de usuario? - -[Code] -// Set LOOT's language in settings.yaml -procedure SetLootLanguage(); -var - LanguageLine: String; - File: String; - SearchLineStart: String; - Lines: TArrayOfString; - I: Integer; -begin - LanguageLine := 'language: ' + ActiveLanguage; - File := ExpandConstant('{localappdata}\{#MyAppName}\settings.yaml'); - - if FileExists(File) then begin - SearchLineStart := 'language:'; - - if LoadStringsFromFile(File, Lines) = True then begin - for I := 0 to GetArrayLength(Lines) - 1 do begin - if Copy(Lines[I], 0, Length(SearchLineStart)) = SearchLineStart then begin - Lines[I] := LanguageLine; - SaveStringsToUTF8File(File, Lines, False) - Break; - end; - end; - end; - end - else begin - if ActiveLanguage <> 'en' then - SaveStringToFile(File, LanguageLine, False); - end; -end; - -// Run a previous install's uninstaller before starting this installation. -procedure RunPreviousVersionUninstaller(); -var - RegKey: String; - RegValue: String; - ResultCode: Integer; -begin - // First try using the Inno Setup installer's uninstall Registry key to get - // the uninstaller's path. This is necessary instead of just using the - // backwards-compatible key because the filename of the uninstaller created - // by Inno Setup can vary. - RegKey := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1'); - if RegQueryStringValue(HKLM, RegKey, 'UninstallString', RegValue) then begin - Exec(RemoveQuotes(RegValue), '/VERYSILENT', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); - // Now try using the backwards-compatible Registry key, and run the NSIS - // uninstaller, which has a fixed filename. - end - else begin - if RegQueryStringValue(HKLM, 'Software\LOOT', 'Installed Path', RegValue) then begin - Exec(RegValue + '\Uninstall.exe', '/S', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); - end; - end; -end; - -function VCRedistNeedsInstall: Boolean; -var - VersionMajor : Integer; - VersionMinor: Integer; - VersionBld: Integer; - RegKey: String; - IsRuntimeInstalled: Cardinal; - InstalledVersionMajor: Cardinal; - InstalledVersionMinor: Cardinal; - InstalledVersionBld: Cardinal; -begin - VersionMajor := 14; - VersionMinor := 0; - VersionBld := 24215; - RegKey := 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x86'; - IsRuntimeInstalled := 0; - InstalledVersionMajor := 0; - InstalledVersionMinor := 0; - InstalledVersionBld := 0; - - RegQueryDWordValue(HKLM, RegKey, 'Installed', IsRuntimeInstalled); - RegQueryDWordValue(HKLM, RegKey, 'Major', InstalledVersionMajor); - RegQueryDWordValue(HKLM, RegKey, 'Minor', InstalledVersionMinor); - RegQueryDWordValue(HKLM, RegKey, 'Bld', InstalledVersionBld); - - Result := (IsRuntimeInstalled = 0) - or (InstalledVersionMajor < VersionMajor) - or (InstalledVersionMinor < VersionMinor) - or (InstalledVersionBld < VersionBld); -end; - -// Query user whether their data files should be deleted on uninstall. -procedure CurUninstallStepChanged (CurUninstallStep: TUninstallStep); -begin - // Don't remove user data if the uninstall is silent. - if UninstallSilent then - exit; - if CurUninstallStep = usUninstall then begin - if MsgBox(CustomMessage('DeleteUserFiles'), mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = IDYES - then begin - DeleteFile(ExpandConstant('{localappdata}\{#MyAppName}\LOOTDebugLog.txt')); - DeleteFile(ExpandConstant('{localappdata}\{#MyAppName}\CEFDebugLog.txt')); - DeleteFile(ExpandConstant('{localappdata}\{#MyAppName}\settings.yaml')); - DeleteFile(ExpandConstant('{localappdata}\{#MyAppName}\Oblivion\userlist.yaml')); - DeleteFile(ExpandConstant('{localappdata}\{#MyAppName}\Skyrim\userlist.yaml')); - DeleteFile(ExpandConstant('{localappdata}\{#MyAppName}\Fallout3\userlist.yaml')); - DeleteFile(ExpandConstant('{localappdata}\{#MyAppName}\FalloutNV\userlist.yaml')); - DeleteFile(ExpandConstant('{localappdata}\{#MyAppName}\Fallout4\userlist.yaml')); - end; - end; -end; - -procedure InitializeWizard(); -begin - if VCRedistNeedsInstall then begin - idpAddFile('https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x86.exe', ExpandConstant('{tmp}\vc_redist.x86.exe')); - - idpDownloadAfter(wpReady); - end -end; - -procedure CurStepChanged(CurStep: TSetupStep); -begin - if CurStep = ssInstall then - RunPreviousVersionUninstaller(); - - if CurStep = ssPostInstall then begin - SetLootLanguage(); - DeleteFile(ExpandConstant('{tmp}\vc_redist.x86.exe')); - end -end; diff --git a/scripts/potomo.js b/scripts/potomo.js deleted file mode 100644 index 210092f6..00000000 --- a/scripts/potomo.js +++ /dev/null @@ -1,33 +0,0 @@ -/* Convert .po files to .mo files. */ -/* eslint-disable no-unused-vars */ - -'use strict'; -const childProcess = require('child_process'); -const fs = require('fs'); -const path = require('path'); -const helpers = require('./helpers'); - -let rootPath = '.'; -if (process.argv.length > 2) { - rootPath = process.argv[2]; -} - -const l10nPath = path.join(rootPath, 'resources', 'l10n'); -fs.readdirSync(l10nPath).forEach((file) => { - if (fs.statSync(path.join(l10nPath, file)).isDirectory()) { - try { - const poPath = path.join(l10nPath, file, 'LC_MESSAGES', 'loot.po'); - const moPath = path.join(l10nPath, file, 'LC_MESSAGES', 'loot.mo'); - - fs.accessSync(poPath, fs.R_OK); - - helpers.safeExecFileSync('msgfmt', [ - poPath, - '-o', - moPath, - ]); - } catch (error) { - console.log(error); - } - } -}); diff --git a/scripts/set_version_number.js b/scripts/set_version_number.js deleted file mode 100644 index ac0a8783..00000000 --- a/scripts/set_version_number.js +++ /dev/null @@ -1,92 +0,0 @@ -#! /usr/bin/env node -'use strict'; - -const path = require('path'); -const replace = require('replace'); - -function updatePreCommitHookScript(version) { - replace({ - regex: /--package-version=[\d.]+/, - replacement: `--package-version=${version}`, - paths: [path.join('scripts', 'git', 'pre-commit')], - silent: true, - }); -} - -function updateInstallerScript(version) { - replace({ - regex: /#define MyAppVersion "[\d.]+"/, - replacement: `#define MyAppVersion "${version}"`, - paths: [path.join('scripts', 'installer.iss')], - silent: true, - }); -} - -function updateCppFile(version) { - const file = path.join('src', 'api', 'loot_version.cpp.in'); - const versionParts = version.split('.'); - - replace({ - regex: /LootVersion::major = \d+;/, - replacement: `LootVersion::major = ${versionParts[0]};`, - paths: [file], - silent: true, - }); - - replace({ - regex: /LootVersion::minor = \d+;/, - replacement: `LootVersion::minor = ${versionParts[1]};`, - paths: [file], - silent: true, - }); - - replace({ - regex: /LootVersion::patch = \d+;/, - replacement: `LootVersion::patch = ${versionParts[2]};`, - paths: [file], - silent: true, - }); -} - -function updateResourceFiles(version) { - const files = [ - path.join('src', 'api', 'resource.rc'), - path.join('src', 'gui', 'resource.rc'), - ]; - const commaSeparatedVersion = version.replace(/\./g, ', '); - - replace({ - regex: /VERSION \d+, \d+, \d+/g, - replacement: `VERSION ${commaSeparatedVersion}`, - paths: files, - silent: true, - }); - - replace({ - regex: /Version", "\d+\.\d+\.\d+"/g, - replacement: `Version", "${version}"`, - paths: files, - silent: true, - }); -} - -function main() { - if (process.argv.length !== 3) { - console.error('Invalid number of arguments given. Only one argument (the new version number) is expected.'); - process.exit(1); - } - - const newVersion = process.argv[2]; - - if (newVersion.split('.').length !== 3) { - console.error('The version number must be a three-part semantic version.'); - process.exit(1); - } - - updatePreCommitHookScript(newVersion); - updateInstallerScript(newVersion); - updateCppFile(newVersion); - updateResourceFiles(newVersion); -} - -main(); diff --git a/scripts/set_version_number.py b/scripts/set_version_number.py new file mode 100644 index 00000000..767b6692 --- /dev/null +++ b/scripts/set_version_number.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import argparse +import os +import re + +def replace_in_file(path, regex, replacement): + regex = re.compile(regex) + + lines = [] + with open(path) as infile: + for line in infile: + lines.append(re.sub(regex, replacement, line)) + + with open(path, 'w') as outfile: + for line in lines: + outfile.write(line) + +def update_cpp_file(path, version): + version_parts = version.split('.') + + replace_in_file(path, 'LootVersion::major = \d+;', 'LootVersion::major = {};'.format(version_parts[0])) + replace_in_file(path, 'LootVersion::minor = \d+;', 'LootVersion::minor = {};'.format(version_parts[1])) + replace_in_file(path, 'LootVersion::patch = \d+;', 'LootVersion::patch = {};'.format(version_parts[2])) + +def update_resource_file(path, version): + comma_separated_version = version.replace('.', ', ') + + replace_in_file(path, 'VERSION \d+, \d+, \d+', 'VERSION {}'.format(comma_separated_version)) + replace_in_file(path, 'Version", "\d+\.\d+\.\d+"', 'VERSION ", "{}"'.format(version)) + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description = 'Set the LOOT API version number') + parser.add_argument('version', nargs='+') + + arguments = parser.parse_args() + + if len(arguments.version) != 1: + raise RuntimeError('Invalid number of arguments given. Only one argument (the new version number) is expected.') + + if len(arguments.version[0].split('.')) != 3: + raise RuntimeError('The version number must be a three-part semantic version.') + + update_cpp_file(os.path.join('src', 'api', 'loot_version.cpp.in'), arguments.version[0]) + update_resource_file(os.path.join('src', 'api', 'resource.rc'), arguments.version[0]) diff --git a/scripts/travis/loot-api.bintray.json b/scripts/travis/loot-api.bintray.json index bf48a738..e1738702 100644 --- a/scripts/travis/loot-api.bintray.json +++ b/scripts/travis/loot-api.bintray.json @@ -8,7 +8,7 @@ "name": "REPLACE_THIS_VERSION" }, "files": [{ - "includePattern": "build/(loot-api_.+\\.tar.xz)", + "includePattern": "build/package/(loot_api-.+\\.tar.xz)", "uploadPattern": "$1" }], "publish": true diff --git a/scripts/travis/loot.bintray.json b/scripts/travis/loot.bintray.json deleted file mode 100644 index 506a250d..00000000 --- a/scripts/travis/loot.bintray.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "package": { - "name": "loot", - "repo": "loot", - "subject": "wrinklyninja" - }, - "version": { - "name": "REPLACE_THIS_VERSION" - }, - "files": [{ - "includePattern": "build/(loot_.+\\.tar.xz)", - "uploadPattern": "$1" - }], - "publish": true -} diff --git a/src/gui/LOOT.exe.manifest b/src/gui/LOOT.exe.manifest deleted file mode 100644 index 76c07796..00000000 --- a/src/gui/LOOT.exe.manifest +++ /dev/null @@ -1,8 +0,0 @@ - - - - - True/PM - - - \ No newline at end of file diff --git a/src/gui/editor_message.h b/src/gui/editor_message.h deleted file mode 100644 index af87201e..00000000 --- a/src/gui/editor_message.h +++ /dev/null @@ -1,119 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2012-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ -#ifndef LOOT_GUI_EDITOR_MESSAGE -#define LOOT_GUI_EDITOR_MESSAGE - -#include - -#include "loot/metadata/message.h" -#include "loot/struct/simple_message.h" - -namespace loot { -struct EditorMessage : public SimpleMessage { - EditorMessage() {} - EditorMessage(const Message& message, const LanguageCode language) - : SimpleMessage(message.ToSimpleMessage(language)) { - condition = message.GetCondition(); - } - - std::string condition; -}; -} - -namespace YAML { -template<> -struct convert { - static Node encode(const loot::EditorMessage& rhs) { - Node node; - - if (rhs.type == loot::MessageType::say) - node["type"] = "say"; - else if (rhs.type == loot::MessageType::warn) - node["type"] = "warn"; - else - node["type"] = "error"; - - node["text"] = rhs.text; - node["language"] = loot::Language(rhs.language).GetLocale(); - - if (!rhs.condition.empty()) - node["condition"] = rhs.condition; - - return node; - } - - static bool decode(const Node& node, loot::EditorMessage& rhs) { - // Treat SimpleMessage as a MessageContent with a type. - if (!node.IsMap()) - throw RepresentationException(node.Mark(), "bad conversion: 'simple message' object must be a map"); - if (!node["type"]) - throw RepresentationException(node.Mark(), "bad conversion: 'type' key missing from 'simple message' object"); - if (!node["text"]) - throw RepresentationException(node.Mark(), "bad conversion: 'text' key missing from 'simple message' object"); - if (!node["language"]) - throw RepresentationException(node.Mark(), "bad conversion: 'language' key missing from 'simple message' object"); - - rhs.text = node["text"].as(); - rhs.language = loot::Language(node["language"].as()).GetCode(); - - std::string type; - type = node["type"].as(); - - loot::MessageType typeNo = loot::MessageType::say; - if (boost::iequals(type, "warn")) - typeNo = loot::MessageType::warn; - else if (boost::iequals(type, "error")) - typeNo = loot::MessageType::error; - - rhs.type = typeNo; - - if (node["condition"]) - rhs.condition = node["condition"].as(); - - return true; - } -}; - -inline Emitter& operator << (Emitter& out, const loot::EditorMessage& rhs) { - out << BeginMap; - - if (rhs.type == loot::MessageType::say) - out << Key << "type" << Value << "say"; - else if (rhs.type == loot::MessageType::warn) - out << Key << "type" << Value << "warn"; - else - out << Key << "type" << Value << "error"; - - out << Key << "language" << Value << loot::Language(rhs.language).GetLocale(); - - out << Key << "text" << Value << YAML::SingleQuoted << rhs.text; - - if (!rhs.condition.empty()) - out << Key << "condition" << Value << YAML::SingleQuoted << rhs.condition; - - return out; -} -} - -#endif diff --git a/src/gui/helpers.cpp b/src/gui/helpers.cpp deleted file mode 100644 index 13d822d9..00000000 --- a/src/gui/helpers.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2014-2017 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#include "gui/helpers.h" - -#include "loot/windows_encoding_converters.h" - -#ifdef _WIN32 -# ifndef UNICODE -# define UNICODE -# endif -# ifndef _UNICODE -# define _UNICODE -# endif -# include "windows.h" -# include "shlobj.h" -# include "shlwapi.h" -#endif - -namespace loot { -void OpenInDefaultApplication(const boost::filesystem::path& file) { -#ifdef _WIN32 - HINSTANCE ret = ShellExecute(0, NULL, ToWinWide(file.string()).c_str(), NULL, NULL, SW_SHOWNORMAL); - if ((int)ret <= 32) - throw std::system_error(GetLastError(), std::system_category(), "Failed to open file in its default application."); -#else - if (system(("/usr/bin/xdg-open" + file.string()).c_str()) != 0) - throw std::system_error(errno, std::system_category(), "Failed to open file in its default application."); -#endif -} -} diff --git a/src/gui/helpers.h b/src/gui/helpers.h deleted file mode 100644 index 9cf9fa0f..00000000 --- a/src/gui/helpers.h +++ /dev/null @@ -1,32 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2014-2017 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ -#ifndef LOOT_GUI_HELPERS -#define LOOT_GUI_HELPERS - -#include - -namespace loot { -void OpenInDefaultApplication(const boost::filesystem::path& file); -} -#endif diff --git a/src/gui/html/css/style.css b/src/gui/html/css/style.css deleted file mode 100644 index 9ed7d0ea..00000000 --- a/src/gui/html/css/style.css +++ /dev/null @@ -1,217 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2013 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . -*/ -/* CSS Custom Variables */ -:root { - --state-transition-time: 0.6s; - - --primary-color: var(--paper-indigo-500); - --light-primary-color: var(--paper-blue-50); - --accent-color: var(--paper-blue-300); - --dark-accent-color: var(--paper-blue-500); - - --primary-background-color: white; - --primary-text-color: rgba(0, 0, 0, var(--dark-primary-opacity)); - --secondary-text-color: rgba(0, 0, 0, var(--dark-secondary-opacity)); - --disabled-text-color: rgba(0, 0, 0, var(--dark-disabled-opacity)); - --divider-color: rgba(0, 0, 0, var(--dark-divider-opacity)); - - --dark-theme-text-color: white; - --dark-theme-secondary-color: rgba(255, 255, 255, var(--light-secondary-opacity)); - --dark-theme-disabled-color: rgba(255, 255, 255, var(--light-disabled-opacity)); - --dark-theme-divider-color: rgba(255, 255, 255, var(--light-divider-opacity)); - - --paper-icon-button-disabled-text: var(--dark-theme-disabled-color); - --paper-tabs-selection-bar-color: var(--accent-color); - --paper-tab-ink: var(--accent-color); - - --paper-toolbar-height: 56px; -} - -/* Misc */ -a { - color: var(--dark-accent-color); - text-decoration: none; -} -a:hover { - text-decoration: underline; -} -tt, code, kbd, samp { - font-family: Consolas, monospace; -} - -/* App bar */ -#mainToolbar, -#searchBar { - box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); - z-index: 1; -} -#mainToolbar:not(.search) + #searchBar, -#mainToolbar.search { - display: none; -} -#gameMenu { - margin: 0 8px; - width: 250px; -} -#applySortButton { - color: var(--dark-accent-color); - background-color: white; -} - -/* Drawer / Sidebar */ -div[drawer] { - background: var(--primary-background-color); -} -div[drawer] > * { - border-right: 1px var(--divider-color) solid; -} -div[drawer] > iron-pages { - overflow: auto; -} -#cardsNav { - padding-top: 8px; - padding-bottom: 8px; - will-change: transform; -} -#filters { - padding: 8px 0; - overflow: auto; -} -#filters > paper-checkbox, -#hiddenPlugins, -#hiddenMessages { - padding: 0 16px; - min-height: 48px; - line-height: 48px; -} -#contentFilter, -#conflictsFilter { - padding: 0 16px; - min-height: 64px; -} - -/* Panel */ -#main { - background-color: #fafafa; - overflow: auto; - position: relative; - z-index: 0; -} -#main > iron-list { - margin-bottom: 120px; -} -#summary { - background-color: var(--primary-background-color); - margin: 8px; - padding: 16px; -} -#summary > h1 { - margin: -16px 0 0; - line-height: 56px; - color: inherit; -} -#summary > table { - display: inline-block; - vertical-align: top; - margin-right: 32px; - width: auto; - background-color: inherit; - border-collapse: collapse; -} -#summary > table:last-child { - margin-right: 0; -} -#summary td:last-child { - text-align: right; - padding-left: 16px; -} -#main li { - padding: 8px 16px; -} -li p { - margin: 0; -} -li.error { - background: #FF8A80; -} -li.warn { - background: #FFE082; -} -.version { - color: #607D8B; -} -.crc { - color: #795548; -} -.tag.add { - color: #4CAF50; -} -.tag.remove { - color: #F44336; -} - -/* Dialogs */ -#about { - max-width: 550px; -} -#about blockquote { - white-space: pre-line; -} -#settingsDialog > paper-dialog-scrollable > div > * { - margin: 16px; -} -#settingsDialog > paper-dialog-scrollable > div > div > :first-child { - margin-right: 16px; - margin-left: 0; -} -#settingsDialog > paper-dialog-scrollable > div > :last-child { - margin-right: 0; -} -#gameTable { - margin: 32px 0 0; -} -#progressDialog paper-progress { - width: 100%; -} -#firstRun > ul { - padding-left: 48px; -} - -/* For Material Design generic dividers. */ -.divider { - height: 1px; - background: var(--divider-color); - margin-top: -1px; -} - -/* Hack for the squashing of icons when text is not wrapped, due to the use of - flex display. See */ -paper-icon-item iron-icon { - margin-right: 32px; -} - -/* Set icons to use Material Design colouring. */ -iron-icon { - color: var(--secondary-text-color); -} diff --git a/src/gui/html/css/typography.css b/src/gui/html/css/typography.css deleted file mode 100644 index c676e945..00000000 --- a/src/gui/html/css/typography.css +++ /dev/null @@ -1,133 +0,0 @@ -/* Font definitions */ -/* Roboto */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto'), - url('../fonts/Roboto-Light.ttf'); -} -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 300; - src: local('Roboto'), - url('../fonts/Roboto-LightItalic.ttf'); -} -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), - url('../fonts/Roboto-Regular.ttf'); -} -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 400; - src: local('Roboto'), - url('../fonts/Roboto-Italic.ttf'); -} -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto'), - url('../fonts/Roboto-Medium.ttf'); -} -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 500; - src: local('Roboto'), - url('../fonts/Roboto-MediumItalic.ttf'); -} -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto'), - url('../fonts/Roboto-Bold.ttf'); -} -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 700; - src: local('Roboto'), - url('../fonts/Roboto-BoldItalic.ttf'); -} -/* Noto - Korean */ -@font-face { - font-family: 'Noto'; - font-style: normal; - font-weight: 300; - src: local('Noto Sans CJK KR Light'), - url('../fonts/NotoSansCJKkr-Light.otf'); -} -@font-face { - font-family: 'Noto'; - font-style: normal; - font-weight: 400; - src: local('Noto Sans CJK KR Regular'), - url('../fonts/NotoSansCJKkr-Regular.otf'); -} -@font-face { - font-family: 'Noto'; - font-style: normal; - font-weight: 500; - src: local('Noto Sans CJK KR Medium'), - url('../fonts/NotoSansCJKkr-Medium.otf'); -} -@font-face { - font-family: 'Noto'; - font-style: normal; - font-weight: 700; - src: local('Noto Sans CJK KR Bold'), - url('../fonts/NotoSansCJKkr-Bold.otf'); -} -/* Noto - Simplified Chinese */ -@font-face { - font-family: 'Noto'; - font-style: normal; - font-weight: 300; - src: local('Noto Sans CJK SC Light'), - url('../fonts/NotoSansCJKsc-Light.otf'); -} -@font-face { - font-family: 'Noto'; - font-style: normal; - font-weight: 400; - src: local('Noto Sans CJK SC Regular'), - url('../fonts/NotoSansCJKsc-Regular.otf'); -} -@font-face { - font-family: 'Noto'; - font-style: normal; - font-weight: 500; - src: local('Noto Sans CJK SC Medium'), - url('../fonts/NotoSansCJKsc-Medium.otf'); -} -@font-face { - font-family: 'Noto'; - font-style: normal; - font-weight: 700; - src: local('Noto Sans CJK SC Bold'), - url('../fonts/NotoSansCJKsc-Bold.otf'); -} - -/* Typography */ -html { - /* Microsoft Yahei is for Chinese characters, and Malgun Gothic for Korean - characters. If Noto isn't present, they're better than the sans-serif - defaults. */ - font:13px/1.429 Roboto, Noto, 'Microsoft Yahei', 'Malgun Gothic', sans-serif; - color: var(--primary-text-color); - font-weight: 400; - text-rendering: optimizeLegibility; -} -h1 { - font-weight: 400; -} -#summary > h1 { - font-size: 1.143rem; -} diff --git a/src/gui/html/elements/editable-table.html b/src/gui/html/elements/editable-table.html deleted file mode 100644 index c7ecf2ee..00000000 --- a/src/gui/html/elements/editable-table.html +++ /dev/null @@ -1,369 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/gui/html/elements/loot-custom-icons.html b/src/gui/html/elements/loot-custom-icons.html deleted file mode 100644 index 890a5bad..00000000 --- a/src/gui/html/elements/loot-custom-icons.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/gui/html/elements/loot-dropdown-menu.html b/src/gui/html/elements/loot-dropdown-menu.html deleted file mode 100644 index 6ab53481..00000000 --- a/src/gui/html/elements/loot-dropdown-menu.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - diff --git a/src/gui/html/elements/loot-menu.html b/src/gui/html/elements/loot-menu.html deleted file mode 100644 index 3d72e608..00000000 --- a/src/gui/html/elements/loot-menu.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - diff --git a/src/gui/html/elements/loot-message-dialog.html b/src/gui/html/elements/loot-message-dialog.html deleted file mode 100644 index e2686af7..00000000 --- a/src/gui/html/elements/loot-message-dialog.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - - - diff --git a/src/gui/html/elements/loot-plugin-card.html b/src/gui/html/elements/loot-plugin-card.html deleted file mode 100644 index 5d7f40e4..00000000 --- a/src/gui/html/elements/loot-plugin-card.html +++ /dev/null @@ -1,279 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/gui/html/elements/loot-plugin-editor.html b/src/gui/html/elements/loot-plugin-editor.html deleted file mode 100644 index 37ecf8a5..00000000 --- a/src/gui/html/elements/loot-plugin-editor.html +++ /dev/null @@ -1,425 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/gui/html/elements/loot-plugin-item.html b/src/gui/html/elements/loot-plugin-item.html deleted file mode 100644 index 4d484881..00000000 --- a/src/gui/html/elements/loot-plugin-item.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - - - - diff --git a/src/gui/html/elements/loot-search-toolbar.html b/src/gui/html/elements/loot-search-toolbar.html deleted file mode 100644 index d8c8b4af..00000000 --- a/src/gui/html/elements/loot-search-toolbar.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/src/gui/html/index.html b/src/gui/html/index.html deleted file mode 100644 index 9db44194..00000000 --- a/src/gui/html/index.html +++ /dev/null @@ -1,469 +0,0 @@ - - - - LOOT - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - Plugins - Filters - - - - - - - -
- -
No plugin selected
- -
- - Press Enter or click outside the input to set the filter. - Hide version numbers - Hide CRCs - Hide Bash Tags - Hide notes - Hide 'Do not clean' messages - Hide all plugin messages - Hide inactive plugins - Hide messageless plugins -
-
-
-
Hidden plugins:
-
0 / 0
-
-
-
Hidden messages:
-
0 / 0
-
-
-
-
-
- - - - Jump To General Information - - - - - - - Sort Plugins - - Update Masterlist - - - - Search Cards - - - - - - Redate Plugins - - - - Clear All User Metadata - - - - Copy Load Order - - - - Copy Content - - - - Refresh Content - -
- - - Settings - -
- - - View Documentation - - - - Open Debug Log Location - - - - About - -
- - - Quit - -
-
-
- -
- -

General Information

- - - - - - - - - - - -
Masterlist RevisionN/A
Masterlist DateN/A
- - - - - - - - - - - - - - - -
Warnings0
Errors0
Total Messages0
- - - - - - - - - - - - - - - -
Active Plugins0
Dirty Plugins0
Total Plugins0
-
    - -
-
- - - - -
- -
-
- - -
-

Calculating the last digit of π...

-
- - -

About LOOT

- -

Version unknown (build unknown)

-

Load order optimisation for Oblivion, Skyrim, Skyrim Special Edition, Fallout 3, Fallout: New Vegas and Fallout 4.

-

https://loot.github.io

-

LOOT is free, but if you want to show your appreciation with some money, donations may be made to WrinklyNinja (LOOT's creator and main developer) using PayPal or Bitcoin.

-

Copyright © 2012–2016 WrinklyNinja

-
- LOOT is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. - - LOOT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with LOOT. If not, see <https://www.gnu.org/licenses/>. -
-
-
- OK -
-
- - -

Settings

- -
-
-
Default Game
- - Autodetect - - -
-
- Language - Language changes will be applied after LOOT is restarted. - - - -
-
-
Enable debug logging
- - The output is logged to the LOOTDebugLog.txt file. -
-
-
Update masterlist before sorting
- -
-
- - - - - - - - - - - - - - - - - -
NameBase GameLOOT FolderMaster FileMasterlist Repository URLMasterlist Repository BranchInstall PathInstall Path Registry Key
-
-
- Cancel - Apply -
-
- - -

First-Time Tips

-

This appears to be the first time you have run LOOT version unknown. Here are some tips to help you get started with the interface.

-
    -
  • Click buttons to open menus.
  • -
  • As well as messages, LOOT displays plugin version numbers, CRCs and Bash Tag suggestions for addition and removal.
  • -
  • CRCs are only displayed after plugins have been loaded, either by conflict filtering, or by sorting.
  • -
  • Double-click a plugin in the sidebar to quickly open it in the metadata editor.
  • -
  • Plugins can be drag and dropped from the sidebar into the metadata editor's "load after, "requirements" and "incompatibility" tables.
  • -
  • Some features are disabled while the metadata editor is open, or while there is a sorted load order that has not been applied or discarded.
  • -
  • Many interface elements have tooltips. If you don't know what something is, try hovering your mouse over it to find out. Otherwise, LOOT's documentation can be accessed through the main menu.
  • -
-

LOOT is free, but if you want to show your appreciation with some money, donations may be made to WrinklyNinja (LOOT's creator and main developer) using PayPal or Bitcoin.

-
- OK -
-
- - - - - - - - - - - - - - - - - - - - diff --git a/src/gui/html/js/dialog.js b/src/gui/html/js/dialog.js deleted file mode 100644 index afa92d3e..00000000 --- a/src/gui/html/js/dialog.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict'; -(function exportModule(root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define([], factory); - } else { - // Browser globals - root.loot = root.loot || {}; - root.loot.Dialog = factory(); - } -}(this, () => class { - static showProgress(text) { - const progressDialog = document.getElementById('progressDialog'); - progressDialog.getElementsByTagName('p')[0].textContent = text; - if (!progressDialog.opened) { - progressDialog.open(); - } else { - progressDialog.refit(); - } - } - - static closeProgress() { - const progressDialog = document.getElementById('progressDialog'); - if (progressDialog.opened) { - progressDialog.refit(); - progressDialog.close(); - } - } - - static showMessage(title, text) { - const dialog = document.createElement('loot-message-dialog'); - document.body.appendChild(dialog); - dialog.setDismissable(false); - dialog.showModal(title, text); - } - - static askQuestion(title, text, confirmText, closeCallback) { - const dialog = document.createElement('loot-message-dialog'); - document.body.appendChild(dialog); - dialog.setConfirmText(confirmText); - dialog.showModal(title, text, closeCallback); - } - - static showNotification(text) { - const toast = document.getElementById('toast'); - if (toast.opened) { - toast.hide(); - } - toast.show(text); - } -})); diff --git a/src/gui/html/js/dom.js b/src/gui/html/js/dom.js deleted file mode 100644 index bc3895d2..00000000 --- a/src/gui/html/js/dom.js +++ /dev/null @@ -1,265 +0,0 @@ -'use strict'; -(function exportModule(root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define([], factory); - } else { - // Browser globals - root.loot = root.loot || {}; - root.loot.DOM = factory(root.marked); - } -}(this, (marked) => { - function getElementInTableRowTemplate(rowTemplateId, elementClass) { - const select = document.querySelector('link[rel="import"][href$="editable-table.html"]'); - if (select) { - return select.import.querySelector(`#${rowTemplateId}`).content - .querySelector(`.${elementClass}`); - } - return document.querySelector(`#${rowTemplateId}`).content.querySelector(`.${elementClass}`); - } - - function createGameItem(game) { - const menuItem = document.createElement('paper-item'); - menuItem.setAttribute('value', game.folder); - menuItem.textContent = game.name; - - return menuItem; - } - - function createLanguageItem(language) { - const item = document.createElement('paper-item'); - item.setAttribute('value', language.locale); - item.textContent = language.name; - - return item; - } - - function createMessageItem(type, content) { - const li = document.createElement('li'); - li.className = type; - /* Use the Marked library for Markdown formatting support. */ - li.innerHTML = marked(content); - - return li; - } - - function createGameTypeItem(gameType) { - const item = document.createElement('paper-item'); - item.setAttribute('value', gameType); - item.textContent = gameType; - - return item; - } - - function forceSelectDefaultValue(element) { - element.setAttribute('value', element.firstElementChild.getAttribute('value')); - } - - return class DOM { - static show(elementId, showElement = true) { - document.getElementById(elementId).hidden = !showElement; - } - - static enable(elementOrId, enableElement = true) { - let element = elementOrId; - if (typeof element === 'string' || element instanceof String) { - element = document.getElementById(element); - } - - if (enableElement) { - element.removeAttribute('disabled'); - } else { - element.setAttribute('disabled', ''); - } - } - - static openDialog(dialogElementId) { - document.getElementById(dialogElementId).open(); - } - - static initialiseVirtualLists(plugins) { - document.getElementById('cardsNav').items = plugins; - document.getElementById('pluginCardList').items = plugins; - } - - static updateSelectedGame(gameFolder) { - document.getElementById('gameMenu').value = gameFolder; - - /* Also disable deletion of the game's row in the settings dialog. */ - const table = document.getElementById('gameTable'); - for (let i = 0; i < table.tBodies[0].rows.length; i += 1) { - const folderElements = table.tBodies[0].rows[i].getElementsByClassName('folder'); - if (folderElements.length === 1) { - table.setReadOnly(table.tBodies[0].rows[i], - ['delete'], - folderElements[0].value === gameFolder); - } - } - } - - static updateEnabledGames(installedGames) { - const gameMenuItems = document.getElementById('gameMenu').children; - for (let i = 0; i < gameMenuItems.length; i += 1) { - DOM.enable(gameMenuItems[i], - installedGames.indexOf(gameMenuItems[i].getAttribute('value')) !== -1); - } - } - - static setGameMenuItems(games) { - const gameMenu = document.getElementById('gameMenu'); - - /* First make sure game listing elements don't have any existing entries. */ - while (gameMenu.firstElementChild) { - gameMenu.removeChild(gameMenu.firstElementChild); - } - - games.forEach((game) => { - gameMenu.appendChild(createGameItem(game)); - }); - } - - static updateSettingsDialog(settings) { - const gameSelect = document.getElementById('defaultGameSelect'); - const gameTable = document.getElementById('gameTable'); - - /* First make sure game listing elements don't have any existing entries. */ - while (gameSelect.children.length > 1) { - gameSelect.removeChild(gameSelect.lastElementChild); - } - gameTable.clear(); - - /* Now fill with new values. */ - settings.games.forEach((game) => { - gameSelect.appendChild(createGameItem(game)); - - const row = gameTable.addRow(game); - gameTable.setReadOnly(row, ['name', 'folder', 'type']); - }); - - gameSelect.value = settings.game; - document.getElementById('languageSelect').value = settings.language; - document.getElementById('enableDebugLogging').checked = settings.enableDebugLogging; - document.getElementById('updateMasterlist').checked = settings.updateMasterlist; - } - - static fillGameTypesList(gameTypes) { - const select = getElementInTableRowTemplate('gameRow', 'type'); - - gameTypes.forEach((gameType) => { - select.appendChild(createGameTypeItem(gameType)); - }); - - forceSelectDefaultValue(select); - select.setAttribute('value', select.firstElementChild.getAttribute('value')); - } - - static fillLanguagesList(languages) { - const settingsLangSelect = document.getElementById('languageSelect'); - const messageLangSelect = getElementInTableRowTemplate('messageRow', 'language'); - - languages.forEach((language) => { - const settingsItem = createLanguageItem(language); - settingsLangSelect.appendChild(settingsItem); - messageLangSelect.appendChild(settingsItem.cloneNode(true)); - }); - - forceSelectDefaultValue(messageLangSelect); - } - - static appendGeneralMessages(messages) { - if (!messages) { - return; - } - - const generalMessagesList = document.getElementById('summary').getElementsByTagName('ul')[0]; - messages.forEach((message) => { - generalMessagesList.appendChild(createMessageItem(message.type, message.content)); - }); - } - - static listInitErrors(errorMessages) { - if (!errorMessages) { - return; - } - - DOM.appendGeneralMessages(errorMessages.map((element) => ({ - type: 'error', - content: element, - }))); - - document.getElementById('filterTotalMessageNo').textContent = errorMessages.length; - document.getElementById('totalMessageNo').textContent = errorMessages.length; - document.getElementById('totalErrorNo').textContent = errorMessages.length; - } - - static onJumpToGeneralInfo() { - document.getElementById('pluginCardList').scroll(0, 0); - } - - static onShowAboutDialog() { - document.getElementById('about').open(); - } - - static onSwitchSidebarTab(evt) { - document.getElementById(evt.target.selected).parentElement.selected = evt.target.selected; - } - - static onSidebarClick(evt) { - if (evt.target.hasAttribute('data-index')) { - const index = parseInt(evt.target.getAttribute('data-index'), 10); - document.getElementById('pluginCardList').scrollToIndex(index); - - if (evt.type === 'dblclick') { - /* Double-clicking can select the item's text, clear the selection in - case that has happened. */ - window.getSelection().removeAllRanges(); - - if (document.body.getAttribute('data-state') !== 'editing' - && document.body.getAttribute('data-state') !== 'sorting') { - document.getElementById(evt.target.getAttribute('data-id')).onShowEditor(); - } - } - } - } - - static onShowSettingsDialog() { - document.getElementById('settingsDialog').open(); - } - - static onFocusSearch(evt) { - if (evt.ctrlKey && evt.keyCode === 70) { // 'f' - document.getElementById('mainToolbar').classList.add('search'); - document.getElementById('searchBar').focusInput(); - } - } - - static onSearchOpen() { - document.getElementById('mainToolbar').classList.add('search'); - document.getElementById('searchBar').focusInput(); - } - - static onSearchChangeSelection(evt) { - document.getElementById('pluginCardList').scrollToIndex(evt.detail.selection); - } - - static initialiseAutocompleteFilenames(filenames) { - getElementInTableRowTemplate('fileRow', 'name').setAttribute('source', JSON.stringify(filenames)); - } - - static initialiseAutocompleteBashTags(tags) { - getElementInTableRowTemplate('tagRow', 'name').setAttribute('source', JSON.stringify(tags)); - } - - static setUIState(state) { - document.body.setAttribute('data-state', state); - } - - static enableGameOperations(enable) { - document.getElementById('sortButton').disabled = !enable; - document.getElementById('updateMasterlistButton').disabled = !enable; - document.getElementById('wipeUserlistButton').disabled = !enable; - document.getElementById('copyLoadOrderButton').disabled = !enable; - document.getElementById('refreshContentButton').disabled = !enable; - } - }; -})); diff --git a/src/gui/html/js/events.js b/src/gui/html/js/events.js deleted file mode 100644 index 06bb3942..00000000 --- a/src/gui/html/js/events.js +++ /dev/null @@ -1,471 +0,0 @@ -/* eslint-disable no-unused-vars */ - -'use strict'; -function onSidebarFilterToggle(evt) { - loot.filters[evt.target.id] = evt.target.checked; - loot.query('saveFilterState', evt.target.id, evt.target.checked).catch(loot.handlePromiseError); - loot.filters.apply(loot.game.plugins); -} -function onContentFilter(evt) { - loot.filters.contentSearchString = evt.target.value; - loot.filters.apply(loot.game.plugins); -} -function onConflictsFilter(evt) { - /* evt.currentTarget.value is the name of the target plugin, or an empty string - if the filter has been deactivated. */ - if (evt.currentTarget.value) { - /* Now get conflicts for the plugin. */ - loot.Dialog.showProgress(loot.l10n.translate('Identifying conflicting plugins...')); - loot.filters.activateConflictsFilter(evt.currentTarget.value).then((plugins) => { - plugins.forEach((plugin) => { - const gamePlugin = loot.game.plugins.find(item => item.name === plugin.name); - if (gamePlugin) { - gamePlugin.update(plugin); - } - }); - loot.filters.apply(loot.game.plugins); - - /* Scroll to the target plugin */ - const list = document.getElementById('pluginCardList'); - const index = list.items.findIndex(item => item.name === evt.target.value); - list.scrollToIndex(index); - - loot.Dialog.closeProgress(); - }).catch(loot.handlePromiseError); - } else { - loot.filters.deactivateConflictsFilter(); - loot.filters.apply(loot.game.plugins); - } -} - -function onChangeGame(evt) { - if (evt.detail.item.getAttribute('value') === loot.game.folder - || loot.game.folder.length === 0) { - // Game folder length is zero if LOOT is being initalised. - return; - } - /* Send off a CEF query with the folder name of the new game. */ - loot.query('changeGame', evt.detail.item.getAttribute('value')).then((result) => { - /* Filters should be re-applied on game change, except the conflicts - filter. Don't need to deactivate the others beforehand. Strictly not - deactivating the conflicts filter either, just resetting it's value. - */ - loot.filters.deactivateConflictsFilter(); - - /* Clear the UI of all existing game-specific data. Also - clear the card and li variables for each plugin object. */ - const globalMessages = document.getElementById('summary').getElementsByTagName('ul')[0]; - while (globalMessages.firstElementChild) { - globalMessages.removeChild(globalMessages.firstElementChild); - } - - /* Parse the data sent from C++. */ - const gameInfo = JSON.parse(result, loot.Plugin.fromJson); - loot.game = new loot.Game(gameInfo, loot.l10n); - - loot.game.initialiseUI(loot.DOM, loot.Filters); - - /* Now update virtual lists. */ - if (loot.filters.areAnyFiltersActive()) { - loot.filters.apply(loot.game.plugins); - } else { - loot.DOM.initialiseVirtualLists(loot.game.plugins); - } - - loot.Dialog.closeProgress(); - }).catch(loot.handlePromiseError); -} -/* Masterlist update process, minus progress dialog. */ -function updateMasterlist() { - loot.Dialog.showProgress(loot.l10n.translate('Updating and parsing masterlist...')); - return loot.query('updateMasterlist').then(JSON.parse).then((result) => { - if (result) { - /* Update JS variables. */ - loot.game.masterlist = result.masterlist; - loot.game.globalMessages = result.globalMessages; - - /* Update Bash Tag autocomplete suggestions. */ - loot.DOM.initialiseAutocompleteBashTags(result.bashTags); - - result.plugins.forEach((resultPlugin) => { - const existingPlugin = loot.game.plugins.find(plugin => plugin.name === resultPlugin.name); - if (existingPlugin) { - existingPlugin.update(resultPlugin); - } - }); - - loot.Dialog.showNotification(loot.l10n.translateFormatted('Masterlist updated to revision %s.', - loot.game.masterlist.revision)); - } else { - loot.Dialog.showNotification(loot.l10n.translate('No masterlist update was necessary.')); - } - }).catch(loot.handlePromiseError); -} -function onUpdateMasterlist() { - updateMasterlist().then(() => { - loot.Dialog.closeProgress(); - }).catch(loot.handlePromiseError); -} -function onSortPlugins() { - if (loot.filters.deactivateConflictsFilter()) { - /* Conflicts filter was undone, update the displayed cards. */ - loot.filters.apply(loot.game.plugins); - } - - let promise = Promise.resolve(); - if (loot.settings.updateMasterlist) { - promise = promise.then(updateMasterlist); - } - promise.then(() => loot.query('sortPlugins')).then(JSON.parse).then((result) => { - if (!result) { - return; - } - - loot.game.globalMessages = result.globalMessages; - - if (!result.plugins) { - const message = result.globalMessages.find(item => ( - item.text.startsWith('Cyclic interaction detected' - ))).text; - throw new Error(loot.l10n.translateFormatted('Failed to sort plugins. Details: %s', message)); - } - - /* Check if sorted load order differs from current load order. */ - const loadOrderIsUnchanged = result.plugins.every((plugin, index) => ( - plugin.name === loot.game.plugins[index].name - )); - if (loadOrderIsUnchanged) { - result.plugins.forEach((plugin) => { - const existingPlugin = loot.game.plugins.find((item) => ( - item.name === plugin.name - )); - if (existingPlugin) { - existingPlugin.update(plugin); - } - }); - /* Send discardUnappliedChanges query. Not doing so prevents LOOT's window - from closing. */ - loot.query('discardUnappliedChanges'); - loot.Dialog.closeProgress(); - loot.Dialog.showNotification(loot.l10n.translate('Sorting made no changes to the load order.')); - return; - } - loot.game.setSortedPlugins(result.plugins); - - /* Now update the UI for the new order. */ - loot.filters.apply(loot.game.plugins); - - loot.state.enterSortingState(); - - loot.Dialog.closeProgress(); - }).catch(loot.handlePromiseError); -} -function onApplySort() { - const loadOrder = loot.game.getPluginNames(); - return loot.query('applySort', loadOrder).then(() => { - loot.game.applySort(); - - loot.state.exitSortingState(); - }).catch(loot.handlePromiseError); -} -function onCancelSort() { - return loot.query('cancelSort').then(JSON.parse).then((response) => { - loot.game.cancelSort(response.plugins, response.globalMessages); - /* Sort UI elements again according to stored old load order. */ - loot.filters.apply(loot.game.plugins); - - loot.state.exitSortingState(); - }).catch(loot.handlePromiseError); -} - -function onRedatePlugins(evt) { - loot.Dialog.askQuestion(loot.l10n.translate('Redate Plugins?'), loot.l10n.translate('This feature is provided so that modders using the Creation Kit may set the load order it uses. A side-effect is that any subscribed Steam Workshop mods will be re-downloaded by Steam (this does not affect Skyrim Special Edition). Do you wish to continue?'), loot.l10n.translate('Redate'), (result) => { - if (result) { - loot.query('redatePlugins').then(() => { - loot.Dialog.showNotification(loot.l10n.translate('Plugins were successfully redated.')); - }).catch(loot.handlePromiseError); - } - }); -} -function onClearAllMetadata() { - loot.Dialog.askQuestion('', loot.l10n.translate('Are you sure you want to clear all existing user-added metadata from all plugins?'), loot.l10n.translate('Clear'), (result) => { - if (!result) { - return; - } - loot.query('clearAllMetadata').then(JSON.parse).then((plugins) => { - if (!plugins) { - return; - } - - loot.game.clearMetadata(plugins); - - loot.Dialog.showNotification(loot.l10n.translate('All user-added metadata has been cleared.')); - }).catch(loot.handlePromiseError); - }); -} -function onCopyContent() { - let content = { - messages: [], - plugins: [], - }; - - if (loot.game) { - content = loot.game.getContent(); - } else { - const message = document.getElementById('summary').getElementsByTagName('ul')[0].firstElementChild; - if (message) { - content.messages.push({ - type: message.className, - content: message.textContent, - }); - } - } - - loot.query('copyContent', content).then(() => { - loot.Dialog.showNotification(loot.l10n.translate("LOOT's content has been copied to the clipboard.")); - }).catch(loot.handlePromiseError); -} -function onCopyLoadOrder() { - let plugins = []; - - if (loot.game && loot.game.plugins) { - plugins = loot.game.getPluginNames(); - } - - loot.query('copyLoadOrder', plugins).then(() => { - loot.Dialog.showNotification(loot.l10n.translate('The load order has been copied to the clipboard.')); - }).catch(loot.handlePromiseError); -} -function onContentRefresh() { - /* Send a query for updated load order and plugin header info. */ - loot.query('getGameData').then((result) => { - /* Parse the data sent from C++. */ - const game = JSON.parse(result, loot.Plugin.fromJson); - loot.game = new loot.Game(game, loot.l10n); - - /* Re-initialise conflicts filter plugin list. */ - loot.Filters.fillConflictsFilterList(loot.game.plugins); - - /* Reapply filters. */ - if (loot.filters.areAnyFiltersActive()) { - loot.filters.apply(loot.game.plugins); - } else { - loot.DOM.initialiseVirtualLists(loot.game.plugins); - } - - loot.Dialog.closeProgress(); - }).catch(loot.handlePromiseError); -} - -function onOpenReadme() { - loot.query('openReadme').catch(loot.handlePromiseError); -} -function onOpenLogLocation() { - loot.query('openLogLocation').catch(loot.handlePromiseError); -} -function handleUnappliedChangesClose(change) { - loot.Dialog.askQuestion('', loot.l10n.translateFormatted('You have not yet applied or cancelled your %s. Are you sure you want to quit?', change), loot.l10n.translate('Quit'), (result) => { - if (!result) { - return; - } - /* Discard any unapplied changes. */ - loot.query('discardUnappliedChanges').then(() => { - window.close(); - }).catch(loot.handlePromiseError); - }); -} -function onQuit() { - if (loot.state.isInSortingState()) { - handleUnappliedChangesClose(loot.l10n.translate('sorted load order')); - } else if (loot.state.isInEditingState()) { - handleUnappliedChangesClose(loot.l10n.translate('metadata edits')); - } else { - window.close(); - } -} -function onApplySettings(evt) { - if (!document.getElementById('gameTable').validate()) { - evt.stopPropagation(); - } -} -function onCloseSettingsDialog(evt) { - if (evt.target.id !== 'settingsDialog') { - /* The event can be fired by dropdowns in the settings dialog, so ignore - any events that don't come from the dialog itself. */ - return; - } - if (!evt.detail.confirmed) { - /* Re-apply the existing settings to the settings dialog elements. */ - loot.DOM.updateSettingsDialog(loot.settings); - return; - } - - /* Update the JS variable values. */ - const settings = { - enableDebugLogging: document.getElementById('enableDebugLogging').checked, - game: document.getElementById('defaultGameSelect').value, - games: document.getElementById('gameTable').getRowsData(false), - language: document.getElementById('languageSelect').value, - lastGame: loot.settings.lastGame, - updateMasterlist: document.getElementById('updateMasterlist').checked, - filters: loot.settings.filters, - }; - - /* Send the settings back to the C++ side. */ - loot.query('closeSettings', settings).then(JSON.parse).then((installedGames) => { - loot.installedGames = installedGames; - loot.DOM.updateEnabledGames(installedGames); - if (installedGames.length > 0) { - loot.DOM.enableGameOperations(true); - } - }).catch(loot.handlePromiseError) - .then(() => { - loot.settings = settings; - loot.DOM.updateSettingsDialog(loot.settings); - loot.DOM.setGameMenuItems(loot.settings.games); - loot.DOM.updateEnabledGames(loot.installedGames); - loot.DOM.updateSelectedGame(loot.game.folder); - }) - .then(() => { - if (loot.installedGames.length > 0 && loot.game.folder.length === 0) { - /* Initialisation failed and game was configured in settings. */ - onContentRefresh(); - } - }) - .catch(loot.handlePromiseError); -} -function onEditorOpen(evt) { - /* Set the editor data. */ - document.getElementById('editor').setEditorData(evt.target.data); - - loot.state.enterEditingState(); - - /* Sidebar items have been resized. */ - document.getElementById('cardsNav').notifyResize(); - - /* Update the plugin's editor state tracker */ - evt.target.data.isEditorOpen = true; - - /* Set up drag 'n' drop event handlers. */ - const elements = document.getElementById('cardsNav').getElementsByTagName('loot-plugin-item'); - for (let i = 0; i < elements.length; i += 1) { - elements[i].draggable = true; - elements[i].addEventListener('dragstart', elements[i].onDragStart); - } - - return loot.query('editorOpened').catch(loot.handlePromiseError); -} -function onEditorClose(evt) { - const plugin = loot.game.plugins.find((item) => ( - item.name === evt.target.querySelector('h1').textContent - )); - /* Update the plugin's editor state tracker */ - plugin.isEditorOpen = false; - - let promise; - /* evt.detail is true if the apply button was pressed. */ - if (evt.detail) { - /* Need to record the editor control values and work out what's - changed, and update any UI elements necessary. Offload the - majority of the work to the C++ side of things. */ - const edits = evt.target.readFromEditor(plugin); - promise = loot.query('editorClosed', edits).then(JSON.parse).then((result) => { - if (result) { - plugin.update(result); - - plugin.userlist = edits.userlist; - - /* Now perform search again. If there is no current search, this won't - do anything. */ - document.getElementById('searchBar').search(); - } - }); - } else { - /* Don't need to record changes, but still need to notify C++ side that - the editor has been closed. */ - promise = loot.query('editorClosed', 'null'); - } - promise.catch(loot.handlePromiseError).then(() => { - loot.state.exitEditingState(); - /* Sidebar items have been resized. */ - document.getElementById('cardsNav').notifyResize(); - - /* Remove drag 'n' drop event handlers. */ - const elements = document.getElementById('cardsNav').getElementsByTagName('loot-plugin-item'); - for (let i = 0; i < elements.length; i += 1) { - elements[i].removeAttribute('draggable'); - elements[i].removeEventListener('dragstart', elements[i].onDragStart); - } - - }).catch(loot.handlePromiseError); -} -function onCopyMetadata(evt) { - loot.query('copyMetadata', evt.target.getName()).then(() => { - loot.Dialog.showNotification(loot.l10n.translateFormatted('The metadata for "%s" has been copied to the clipboard.', evt.target.getName())); - }).catch(loot.handlePromiseError); -} -function onClearMetadata(evt) { - loot.Dialog.askQuestion('', loot.l10n.translateFormatted('Are you sure you want to clear all existing user-added metadata from "%s"?', evt.target.getName()), loot.l10n.translate('Clear'), (result) => { - if (!result) { - return; - } - loot.query('clearPluginMetadata', evt.target.getName()).then(JSON.parse).then((plugin) => { - if (!result) { - return; - } - /* Need to empty the UI-side user metadata. */ - const existingPlugin = loot.game.plugins.find(item => item.id === evt.target.id); - if (existingPlugin) { - existingPlugin.userlist = undefined; - - existingPlugin.update(plugin); - } - loot.Dialog.showNotification(loot.l10n.translateFormatted('The user-added metadata for "%s" has been cleared.', evt.target.getName())); - /* Now perform search again. If there is no current search, this won't - do anything. */ - document.getElementById('searchBar').search(); - }).catch(loot.handlePromiseError); - }); -} - - -function onSearchBegin(evt) { - loot.game.plugins.forEach((plugin) => { - plugin.isSearchResult = false; - }); - - if (!evt.detail.needle) { - return; - } - - // Don't push to the target's results property directly, as the - // change observer doesn't work correctly unless special Polymer APIs - // are used, which I don't want to get into. - const results = []; - loot.game.plugins.forEach((plugin, index) => { - if (plugin.getCardContent(loot.filters).containsText(evt.detail.needle)) { - results.push(index); - plugin.isSearchResult = true; - } - }); - - evt.target.results = results; -} -function onSearchEnd(evt) { - loot.game.plugins.forEach((plugin) => { - plugin.isSearchResult = false; - }); - document.getElementById('mainToolbar').classList.remove('search'); -} -function onFolderChange(evt) { - loot.DOM.updateSelectedGame(evt.detail.folder); - /* Enable/disable the redate plugins option. */ - let gameSettings; - if (loot.settings && loot.settings.games) { - gameSettings = loot.settings.games.find(game => ( - (game.type === 'Skyrim' || game.type === 'Skyrim Special Edition') - && game.folder === evt.detail.folder - )); - } - loot.DOM.enable('redatePluginsButton', gameSettings !== undefined); -} diff --git a/src/gui/html/js/filters.js b/src/gui/html/js/filters.js deleted file mode 100644 index e49c5b52..00000000 --- a/src/gui/html/js/filters.js +++ /dev/null @@ -1,170 +0,0 @@ -'use strict'; -(function exportModule(root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define([], factory); - } else { - // Browser globals - root.loot = root.loot || {}; - root.loot.Filters = factory(root.loot.query, - root.loot.handlePromiseError); - } -}(this, (query, handlePromiseError) => class { - constructor(l10n) { - /* Plugin filters */ - this.hideMessagelessPlugins = false; - this.hideInactivePlugins = false; - this.conflictingPluginNames = []; - this.contentSearchString = ''; - - /* Plugin content filters */ - this.hideVersionNumbers = false; - this.hideCRCs = false; - this.hideBashTags = false; - this.hideAllPluginMessages = false; - this.hideNotes = false; - this.hideDoNotCleanMessages = false; - - this._doNotCleanString = l10n.translate('Do not clean').toLowerCase(); - } - - pluginFilter(plugin) { - if (this.hideInactivePlugins && !plugin.isActive) { - return false; - } - - if (this.conflictingPluginNames.length !== 0 - && this.conflictingPluginNames.indexOf(plugin.name) === -1) { - return false; - } - - if (this.hideMessagelessPlugins - && plugin.getCardContent(this).messages.length === 0) { - return false; - } - - if (this.contentSearchString.length !== 0 - && !plugin.getCardContent(this).containsText(this.contentSearchString)) { - return false; - } - - return true; - } - - messageFilter(message) { - if (this.hideAllPluginMessages) { - return false; - } - - if (this.hideNotes && message.type === 'say') { - return false; - } - - if (this.hideDoNotCleanMessages - && message.text.toLowerCase().indexOf(this._doNotCleanString) !== -1) { - return false; - } - - return true; - } - - deactivateConflictsFilter() { - const wasEnabled = this.conflictingPluginNames.length > 0; - - this.conflictingPluginNames = []; - - document.dispatchEvent(new CustomEvent('loot-filter-conflicts-deactivate')); - - return wasEnabled; - } - - activateConflictsFilter(targetPluginName) { - if (!targetPluginName) { - return Promise.resolve([]); - } - - /* Filter everything but the plugin itself if there are no - conflicts. */ - this.conflictingPluginNames = [targetPluginName]; - - return query('getConflictingPlugins', targetPluginName).then(JSON.parse).then((plugins) => { - plugins.forEach((plugin) => { - if (plugin.conflicts) { - this.conflictingPluginNames.push(plugin.name); - } - }); - return plugins; - }).catch(handlePromiseError); - } - - areAnyFiltersActive() { - return this.hideMessagelessPlugins - || this.hideInactivePlugins - || this.conflictingPluginNames.length !== 0 - || this.contentSearchString.length !== 0 - || this.hideVersionNumbers - || this.hideCRCs - || this.hideBashTags - || this.hideAllPluginMessages - || this.hideNotes - || this.hideDoNotCleanMessages; - } - - load(filterSettings) { - if (filterSettings) { - Object.getOwnPropertyNames(filterSettings).forEach((filter) => { - this[filter] = filterSettings[filter]; - document.getElementById(filter).checked = this[filter]; - }); - } - } - - apply(plugins) { - const filteredPlugins = plugins.filter(this.pluginFilter, this); - - document.getElementById('cardsNav').items = filteredPlugins; - document.getElementById('pluginCardList').items = filteredPlugins; - - const pluginCards = document.getElementById('pluginCardList').children; - for (let i = 0; i < pluginCards.length; i += 1) { - if (pluginCards[i].data) { - pluginCards[i].updateContent(true); - } - } - document.getElementById('cardsNav').notifyResize(); - document.getElementById('pluginCardList').notifyResize(); - - /* Now perform search again. If there is no current search, this won't - do anything. */ - document.getElementById('searchBar').search(); - - /* Re-count all hidden plugins and messages. */ - document.getElementById('hiddenPluginNo').textContent = plugins.length - filteredPlugins.length; - document.getElementById('hiddenMessageNo').textContent = plugins.reduce((previousValue, currentValue) => ( - previousValue + currentValue.messages.length - currentValue.getCardContent(this).messages.length - ), 0); - } - - static fillConflictsFilterList(plugins) { - const list = document.getElementById('conflictsFilter'); - - /* Remove any existing plugin items. */ - while (list.children.length > 1) { - list.removeChild(list.lastElementChild); - } - - plugins.forEach(plugin => { - const item = document.createElement('div'); - - item.className = 'paper-item'; - item.setAttribute('value', plugin.name); - item.textContent = plugin.name; - - list.appendChild(item); - }); - } - - static onDeactivateConflictsFilter() { - document.getElementById('conflictsFilter').value = ''; - } -})); diff --git a/src/gui/html/js/game.js b/src/gui/html/js/game.js deleted file mode 100644 index 379146f0..00000000 --- a/src/gui/html/js/game.js +++ /dev/null @@ -1,396 +0,0 @@ -'use strict'; - -(function exportModule(root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define([], factory); - } else { - // Browser globals - root.loot = root.loot || {}; - root.loot.Game = factory(root.marked, root.loot.Plugin); - } -}(this, (marked, Plugin) => class { - constructor(obj, l10n) { - this.folder = obj.folder || ''; - this.globalMessages = obj.globalMessages || []; - this.masterlist = obj.masterlist || {}; - this.plugins = obj.plugins || []; - this.bashTags = obj.bashTags || []; - - this.oldLoadOrder = undefined; - - this._notApplicableString = l10n.translate('N/A'); - } - - get folder() { - return this._folder; - } - - set folder(folder) { - if (folder !== this._folder) { - document.dispatchEvent(new CustomEvent('loot-game-folder-change', { - detail: { folder }, - })); - } - - this._folder = folder; - } - - get globalMessages() { - return this._globalMessages; - } - - set globalMessages(globalMessages) { - /* Update the message counts. */ - let oldTotal = 0; - let newTotal = 0; - let oldWarns = 0; - let newWarns = 0; - let oldErrs = 0; - let newErrs = 0; - - if (this._globalMessages) { - oldTotal = this._globalMessages.length; - this._globalMessages.forEach((message) => { - if (message.type === 'warn') { - oldWarns += 1; - } else if (message.type === 'error') { - oldErrs += 1; - } - }); - } - - if (globalMessages) { - newTotal = globalMessages.length; - - globalMessages.forEach((message) => { - if (message.type === 'warn') { - newWarns += 1; - } else if (message.type === 'error') { - newErrs += 1; - } - }); - } - - if (newTotal !== oldTotal || newWarns !== oldWarns || newErrs !== oldErrs) { - document.dispatchEvent(new CustomEvent('loot-game-global-messages-change', { - detail: { - totalDiff: newTotal - oldTotal, - warningDiff: newWarns - oldWarns, - errorDiff: newErrs - oldErrs, - messages: globalMessages, - }, - })); - } - - this._globalMessages = globalMessages; - } - - get masterlist() { - return this._masterlist; - } - - set masterlist(masterlist) { - if (masterlist !== this._masterlist - && (masterlist === undefined || this._masterlist === undefined - || masterlist.revision !== this._masterlist.revision - || masterlist.date !== this._masterlist.date)) { - let revision = this._notApplicableString; - let date = this._notApplicableString; - if (masterlist && masterlist.revision) { - revision = masterlist.revision; - } - if (masterlist && masterlist.date) { - date = masterlist.date; - } - - document.dispatchEvent(new CustomEvent('loot-game-masterlist-change', { - detail: { - revision, - date, - }, - })); - } - - this._masterlist = masterlist; - } - - get plugins() { - return this._plugins; - } - - set plugins(plugins) { - /* Update plugin and message counts. Unlike for global messages - it's not worth calculating the count differences, just count - from zero. */ - let totalMessageNo = 0; - let warnMessageNo = 0; - let errorMessageNo = 0; - let activePluginNo = 0; - let dirtyPluginNo = 0; - - /* Include global messages in the count. */ - if (this.globalMessages) { - totalMessageNo = this.globalMessages.length; - this.globalMessages.forEach((message) => { - if (message.type === 'warn') { - warnMessageNo += 1; - } else if (message.type === 'error') { - errorMessageNo += 1; - } - }); - } - - plugins.forEach((plugin) => { - if (plugin.isActive) { - activePluginNo += 1; - } - if (plugin.isDirty) { - dirtyPluginNo += 1; - } - if (plugin.messages) { - totalMessageNo += plugin.messages.length; - plugin.messages.forEach((message) => { - if (message.type === 'warn') { - warnMessageNo += 1; - } else if (message.type === 'error') { - errorMessageNo += 1; - } - }); - } - }); - - document.dispatchEvent(new CustomEvent('loot-game-plugins-change', { - detail: { - valuesAreTotals: true, - totalMessageNo, - warnMessageNo, - errorMessageNo, - totalPluginNo: plugins.length, - activePluginNo, - dirtyPluginNo, - }, - })); - - this._plugins = plugins; - } - - appendPlugin(plugin) { - let totalChange = 0; - let warnChange = 0; - let errorChange = 0; - let activeChange = 0; - let dirtyChange = 0; - - if (plugin.isActive) { - activeChange += 1; - } - if (plugin.isDirty) { - dirtyChange += 1; - } - if (plugin.messages) { - totalChange += plugin.messages.length; - plugin.messages.forEach((message) => { - if (message.type === 'warn') { - warnChange += 1; - } else if (message.type === 'error') { - errorChange += 1; - } - }); - } - - document.dispatchEvent(new CustomEvent('loot-game-plugins-change', { - detail: { - valuesAreTotals: false, - totalMessageNo: totalChange, - warnMessageNo: warnChange, - errorMessageNo: errorChange, - totalPluginNo: 1, - activePluginNo: activeChange, - dirtyPluginNo: dirtyChange, - }, - })); - - this._plugins.push(plugin); - } - - removePluginAtIndex(index) { - let totalChange = 0; - let warnChange = 0; - let errorChange = 0; - let activeChange = 0; - let dirtyChange = 0; - - if (this._plugins[index].isActive) { - activeChange -= 1; - } - if (this._plugins[index].isDirty) { - dirtyChange -= 1; - } - if (this._plugins[index].messages) { - totalChange -= this._plugins[index].messages.length; - this._plugins[index].messages.forEach((message) => { - if (message.type === 'warn') { - warnChange -= 1; - } else if (message.type === 'error') { - errorChange -= 1; - } - }); - } - - document.dispatchEvent(new CustomEvent('loot-game-plugins-change', { - detail: { - valuesAreTotals: false, - totalMessageNo: totalChange, - warnMessageNo: warnChange, - errorMessageNo: errorChange, - totalPluginNo: -1, - activePluginNo: activeChange, - dirtyPluginNo: dirtyChange, - }, - })); - - this._plugins.splice(index, 1); - } - - getContent() { - let messages = []; - let plugins = []; - - if (this.globalMessages) { - messages = this.globalMessages; - } - if (this.plugins) { - plugins = this.plugins.map(plugin => ({ - name: plugin.name, - crc: plugin.crc, - version: plugin.version, - isActive: plugin.isActive, - isEmpty: plugin.isEmpty, - loadsArchive: plugin.loadsArchive, - - priority: plugin.priority, - globalPriority: plugin.globalPriority, - messages: plugin.messages, - tags: plugin.tags, - isDirty: plugin.isDirty, - })); - } - - return { - messages, - plugins, - }; - } - - getPluginNames() { - return this.plugins.map(plugin => plugin.name); - } - - setSortedPlugins(plugins) { - this.oldLoadOrder = this.plugins; - - const newPlugins = []; - plugins.forEach((plugin) => { - let existingPlugin = this.oldLoadOrder.find(item => item.name === plugin.name); - if (existingPlugin) { - existingPlugin.update(plugin); - } else { - existingPlugin = new Plugin(plugin); - } - newPlugins.push(existingPlugin); - }); - - this.plugins = newPlugins; - } - - applySort() { - this.oldLoadOrder = undefined; - } - - cancelSort(plugins, globalMessages) { - this.plugins = this.oldLoadOrder; - this.oldLoadOrder = undefined; - - plugins.forEach((plugin) => { - const existingPlugin = this.plugins.find(item => item.name === plugin.name); - if (existingPlugin) { - existingPlugin.update(plugin); - } - }); - - /* Update general messages */ - this.globalMessages = globalMessages; - } - - clearMetadata(plugins) { - /* Need to empty the UI-side user metadata. */ - plugins.forEach((plugin) => { - const existingPlugin = this.plugins.find(item => item.name === plugin.name); - if (existingPlugin) { - existingPlugin.userlist = undefined; - - existingPlugin.update(plugin); - } - }); - } - - initialiseUI(DOM, Filters) { - /* Re-initialise autocomplete suggestions. */ - DOM.initialiseAutocompleteFilenames(this.getPluginNames()); - DOM.initialiseAutocompleteBashTags(this.bashTags); - - /* Re-initialise conflicts filter plugin list. */ - Filters.fillConflictsFilterList(this.plugins); - } - - static onPluginsChange(evt) { - if (!evt.detail.valuesAreTotals) { - evt.detail.totalMessageNo += parseInt(document.getElementById('totalMessageNo').textContent, 10); - evt.detail.warnMessageNo += parseInt(document.getElementById('totalWarningNo').textContent, 10); - evt.detail.errorMessageNo += parseInt(document.getElementById('totalErrorNo').textContent, 10); - evt.detail.totalPluginNo += parseInt(document.getElementById('totalPluginNo').textContent, 10); - evt.detail.activePluginNo += parseInt(document.getElementById('activePluginNo').textContent, 10); - evt.detail.dirtyPluginNo += parseInt(document.getElementById('dirtyPluginNo').textContent, 10); - } - - document.getElementById('filterTotalMessageNo').textContent = evt.detail.totalMessageNo; - document.getElementById('totalMessageNo').textContent = evt.detail.totalMessageNo; - document.getElementById('totalWarningNo').textContent = evt.detail.warnMessageNo; - document.getElementById('totalErrorNo').textContent = evt.detail.errorMessageNo; - - document.getElementById('filterTotalPluginNo').textContent = evt.detail.totalPluginNo; - document.getElementById('totalPluginNo').textContent = evt.detail.totalPluginNo; - document.getElementById('activePluginNo').textContent = evt.detail.activePluginNo; - document.getElementById('dirtyPluginNo').textContent = evt.detail.dirtyPluginNo; - } - - static onGlobalMessagesChange(evt) { - document.getElementById('filterTotalMessageNo').textContent = parseInt(document.getElementById('filterTotalMessageNo').textContent, 10) + evt.detail.totalDiff; - document.getElementById('totalMessageNo').textContent = parseInt(document.getElementById('totalMessageNo').textContent, 10) + evt.detail.totalDiff; - document.getElementById('totalWarningNo').textContent = parseInt(document.getElementById('totalWarningNo').textContent, 10) + evt.detail.warningDiff; - document.getElementById('totalErrorNo').textContent = parseInt(document.getElementById('totalErrorNo').textContent, 10) + evt.detail.errorDiff; - - /* Remove old messages from UI. */ - const generalMessagesList = document.getElementById('summary').getElementsByTagName('ul')[0]; - while (generalMessagesList.firstElementChild) { - generalMessagesList.removeChild(generalMessagesList.firstElementChild); - } - - /* Add new messages. */ - if (evt.detail.messages) { - evt.detail.messages.forEach((message) => { - const li = document.createElement('li'); - li.className = message.type; - /* Use the Marked library for Markdown formatting support. */ - li.innerHTML = marked(message.text); - generalMessagesList.appendChild(li); - }); - } - } - - static onMasterlistChange(evt) { - document.getElementById('masterlistRevision').textContent = evt.detail.revision; - document.getElementById('masterlistDate').textContent = evt.detail.date; - } -})); diff --git a/src/gui/html/js/handlePromiseError.js b/src/gui/html/js/handlePromiseError.js deleted file mode 100644 index 4299b0de..00000000 --- a/src/gui/html/js/handlePromiseError.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; -(function exportModule(root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define([], factory); - } else { - // Browser globals - root.loot = root.loot || {}; - root.loot.handlePromiseError = factory(root.loot); - } -}(this, (loot) => (error) => { - /* Error.stack seems to be Chromium-specific. */ - console.log(error.stack); // eslint-disable-line no-console - loot.Dialog.closeProgress(); - loot.Dialog.showMessage(loot.l10n.translate('Error'), error.message); -})); diff --git a/src/gui/html/js/initialise.js b/src/gui/html/js/initialise.js deleted file mode 100644 index df7ff4cb..00000000 --- a/src/gui/html/js/initialise.js +++ /dev/null @@ -1,262 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2013-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . -*/ -'use strict'; -(function exportModule(root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define([], factory); - } else { - // Browser globals - root.loot = root.loot || {}; - root.loot.initialise = factory(root.loot.Dialog, - root.loot.DOM, - root.loot.Filters, - root.loot.Game, - root.loot.handlePromiseError, - root.loot.translateStaticText, - root.loot.Plugin, - root.loot.query, - root.loot.Translator, - root.loot.updateExists); - } -}(this, (Dialog, - dom, - Filters, - Game, - handlePromiseError, - translateStaticText, - Plugin, - query, - Translator, - updateExists) => { - function setupEventHandlers() { - /* Set up handlers for filters. */ - document.getElementById('hideVersionNumbers').addEventListener('change', onSidebarFilterToggle); - document.getElementById('hideCRCs').addEventListener('change', onSidebarFilterToggle); - document.getElementById('hideBashTags').addEventListener('change', onSidebarFilterToggle); - document.getElementById('hideNotes').addEventListener('change', onSidebarFilterToggle); - document.getElementById('hideDoNotCleanMessages').addEventListener('change', onSidebarFilterToggle); - document.getElementById('hideInactivePlugins').addEventListener('change', onSidebarFilterToggle); - document.getElementById('hideAllPluginMessages').addEventListener('change', onSidebarFilterToggle); - document.getElementById('hideMessagelessPlugins').addEventListener('change', onSidebarFilterToggle); - document.getElementById('contentFilter').addEventListener('change', onContentFilter); - document.getElementById('conflictsFilter').addEventListener('iron-select', onConflictsFilter); - document.addEventListener('loot-filter-conflicts-deactivate', Filters.onDeactivateConflictsFilter); - - /* Set up handlers for buttons. */ - document.getElementById('redatePluginsButton').addEventListener('click', onRedatePlugins); - document.getElementById('openLogButton').addEventListener('click', onOpenLogLocation); - document.getElementById('wipeUserlistButton').addEventListener('click', onClearAllMetadata); - document.getElementById('copyLoadOrderButton').addEventListener('click', onCopyLoadOrder); - document.getElementById('copyContentButton').addEventListener('click', onCopyContent); - document.getElementById('refreshContentButton').addEventListener('click', onContentRefresh); - document.getElementById('settingsButton').addEventListener('click', dom.onShowSettingsDialog); - document.getElementById('helpButton').addEventListener('click', onOpenReadme); - document.getElementById('aboutButton').addEventListener('click', dom.onShowAboutDialog); - document.getElementById('quitButton').addEventListener('click', onQuit); - document.getElementById('gameMenu').addEventListener('iron-select', onChangeGame); - document.getElementById('updateMasterlistButton').addEventListener('click', onUpdateMasterlist); - document.getElementById('sortButton').addEventListener('click', onSortPlugins); - document.getElementById('applySortButton').addEventListener('click', onApplySort); - document.getElementById('cancelSortButton').addEventListener('click', onCancelSort); - document.getElementById('sidebarTabs').addEventListener('iron-select', dom.onSwitchSidebarTab); - document.getElementById('jumpToGeneralInfo').addEventListener('click', dom.onJumpToGeneralInfo); - - /* Set up search event handlers. */ - document.getElementById('showSearch').addEventListener('click', dom.onSearchOpen); - document.getElementById('searchBar').addEventListener('loot-search-begin', onSearchBegin); - document.getElementById('searchBar').addEventListener('loot-search-change-selection', dom.onSearchChangeSelection, false); - document.getElementById('searchBar').addEventListener('loot-search-end', onSearchEnd); - window.addEventListener('keyup', dom.onFocusSearch); - - /* Set up event handlers for settings dialog. */ - const settings = document.getElementById('settingsDialog'); - settings.addEventListener('iron-overlay-closed', onCloseSettingsDialog); - settings.querySelector('[dialog-confirm]').addEventListener('tap', onApplySettings); - - /* Set up handler for opening and closing editors. */ - document.body.addEventListener('loot-editor-open', onEditorOpen); - document.body.addEventListener('loot-editor-close', onEditorClose); - document.body.addEventListener('loot-copy-metadata', onCopyMetadata); - document.body.addEventListener('loot-clear-metadata', onClearMetadata); - - document.getElementById('cardsNav').addEventListener('click', dom.onSidebarClick); - document.getElementById('cardsNav').addEventListener('dblclick', dom.onSidebarClick); - - /* Set up handler for plugin data changes. */ - document.addEventListener('loot-plugin-message-change', Plugin.onMessageChange); - document.addEventListener('loot-plugin-message-change', Plugin.onContentChange); - document.addEventListener('loot-plugin-cleaning-data-change', Plugin.onCleaningDataChange); - document.addEventListener('loot-plugin-card-content-change', Plugin.onContentChange); - document.addEventListener('loot-plugin-card-styling-change', Plugin.onCardStylingChange); - document.addEventListener('loot-plugin-item-content-change', Plugin.onItemContentChange); - - /* Set up event handlers for game member variable changes. */ - document.addEventListener('loot-game-folder-change', onFolderChange); - document.addEventListener('loot-game-masterlist-change', Game.onMasterlistChange); - document.addEventListener('loot-game-global-messages-change', Game.onGlobalMessagesChange); - document.addEventListener('loot-game-plugins-change', Game.onPluginsChange); - } - - function setVersion(appData) { - return query('getVersion').then(JSON.parse).then((version) => { - appData.version = version; - }); - } - - function setLanguages() { - return query('getLanguages').then(JSON.parse).then(dom.fillLanguagesList); - } - - function getInitErrors() { - return query('getInitErrors').then((result) => { - const errors = JSON.parse(result); - if (errors.length > 0) { - throw new Error(result); - } - }); - } - - function getErrorMessages(string) { - /* error.message could be a message string or JSON encoding a list of - message strings. */ - try { - return JSON.parse(string); - } catch (error) { - return [string]; - } - } - - function handleInitErrors(error) { - dom.listInitErrors(getErrorMessages(error.message)); - Dialog.closeProgress(); - dom.enableGameOperations(false); - dom.openDialog('settingsDialog'); - } - - function setGameTypes() { - return query('getGameTypes').then(JSON.parse).then(dom.fillGameTypesList); - } - - function setInstalledGames(appData) { - return query('getInstalledGames').then(JSON.parse).then((installedGames) => { - appData.installedGames = installedGames; - dom.updateEnabledGames(installedGames); - }); - } - - function setSettings(appData) { - return query('getSettings').then(JSON.parse).then((result) => { - appData.settings = result; - dom.updateSettingsDialog(appData.settings); - dom.setGameMenuItems(appData.settings.games); - dom.updateEnabledGames(appData.installedGames); - dom.updateSelectedGame(appData.game.folder); - }); - } - - function setGameData(appData) { - return query('getGameData').then((result) => { - const game = JSON.parse(result, Plugin.fromJson); - appData.game = new Game(game, appData.l10n); - - appData.game.initialiseUI(dom, appData.Filters); - appData.filters.load(appData.settings.filters); - - /* Initialise the lists before checking if any filters need to be applied. - This causes the UI to be initialised faster thanks to scheduling - behaviour. */ - dom.initialiseVirtualLists(appData.game.plugins); - if (appData.filters.areAnyFiltersActive()) { - /* Schedule applying the filters instead of applying them immediately. - This improves the UI initialisation speed, and is quick enough that - the lists aren't visible pre-filtration. */ - setTimeout((plugins) => { appData.filters.apply(plugins); }, 0, appData.game.plugins); - } - - Dialog.closeProgress(); - }); - } - - return (loot) => { - Dialog.showProgress('Initialising user interface...'); - - /* Make sure settings are what I want. */ - window.marked.setOptions({ - gfm: true, - tables: true, - sanitize: true, - }); - setupEventHandlers(); - - loot.version = {}; - loot.settings = {}; - loot.l10n = new Translator(); - loot.game = new Game({}, loot.l10n); - loot.filters = new Filters(loot.l10n); - - Promise.all([ - setLanguages(), - setGameTypes(), - setInstalledGames(loot), - setVersion(loot), - setSettings(loot), - ]).then(() => { - /* Translate static text. */ - loot.l10n = new Translator(loot.settings.language); - return loot.l10n.load(); - }).then(() => { - loot.filters = new Filters(loot.l10n); - translateStaticText(loot.l10n, loot.version); - /* Also need to update the settings UI. */ - dom.updateSettingsDialog(loot.settings); - dom.setGameMenuItems(loot.settings.games); - dom.updateEnabledGames(loot.installedGames); - dom.updateSelectedGame(loot.game.folder); - }) - .catch(handlePromiseError) - .then(getInitErrors) - .then(() => setGameData(loot)) - .catch(handleInitErrors) - .then(() => { - if (loot.settings.lastVersion !== loot.version.release) { - dom.openDialog('firstRun'); - } - }) - .then(() => loot.query('getVersion')) - .then(JSON.parse) - .then((version) => updateExists(version.release, version.build)) - .then((isUpdateAvailable) => { - if (!isUpdateAvailable) { - return; - } - - dom.appendGeneralMessages([{ - type: 'warn', - content: loot.l10n.translateFormatted('A [new release](%s) of LOOT is available.', 'https://github.com/loot/loot/releases/latest'), - }]); - }) - .catch(handlePromiseError); - }; -})); diff --git a/src/gui/html/js/plugin.js b/src/gui/html/js/plugin.js deleted file mode 100644 index 7ae3c8e2..00000000 --- a/src/gui/html/js/plugin.js +++ /dev/null @@ -1,507 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2013-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . -*/ -'use strict'; -(function exportModule(root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['bower_components/lodash/dist/lodash.core.min'], factory); - } else { - // Browser globals - root.loot = root.loot || {}; - root.loot.Plugin = factory(root._); - } -}(this, (_) => { - /* Messages, tags, CRCs and version strings can all be hidden by filters. - Use getters with no setters for member variables as data should not be - written to objects of this class. */ - class PluginCardContent { - constructor(plugin, filters) { - this._name = plugin.name; - this._isActive = plugin.isActive || false; - this._isEmpty = plugin.isEmpty; - this._isMaster = plugin.isMaster; - this._loadsArchive = plugin.loadsArchive; - - if (!filters.hideVersionNumbers) { - this._version = plugin.version; - } else { - this._version = ''; - } - - if (!filters.hideCRCs) { - this._crc = plugin.crc; - } else { - this._crc = 0; - } - - if (!filters.hideBashTags) { - this._tags = plugin.tags; - } else { - this._tags = []; - } - - this._messages = plugin.messages.filter(filters.messageFilter, filters); - } - - get name() { - return this._name; - } - - get isActive() { - return this._isActive; - } - - get isEmpty() { - return this._isEmpty; - } - - get isMaster() { - return this._isMaster; - } - - get loadsArchive() { - return this._loadsArchive; - } - - get version() { - return this._version; - } - - get crc() { - if (this._crc === 0) { - return ''; - } - - /* Pad CRC string to 8 characters. */ - return (`00000000${this._crc.toString(16).toUpperCase()}`).slice(-8); - } - - get tags() { - const tagsAdded = []; - const tagsRemoved = []; - - if (this._tags) { - for (let i = 0; i < this._tags.length; i += 1) { - if (this._tags[i].name[0] === '-') { - tagsRemoved.push(this._tags[i].name.substr(1)); - } else { - tagsAdded.push(this._tags[i].name); - } - } - } - /* Now make sure that the same tag doesn't appear in both arrays. - Prefer the removed list. */ - for (let i = 0; i < tagsAdded.length; i += 1) { - for (let j = 0; j < tagsRemoved.length; j += 1) { - if (tagsRemoved[j].toLowerCase() === tagsAdded[i].toLowerCase()) { - /* Remove tag from the tagsAdded array. */ - tagsAdded.splice(i, 1); - i -= 1; - } - } - } - - return { - added: tagsAdded.join(', '), - removed: tagsRemoved.join(', '), - }; - } - - get messages() { - return this._messages; - } - - containsText(text) { - if (text === undefined || text.length === 0) { - return true; - } - const needle = text.toLowerCase(); - - if (this.name.toLowerCase().indexOf(needle) !== -1 - || this.crc.toLowerCase().indexOf(needle) !== -1 - || this.version.toLowerCase().indexOf(needle) !== -1) { - return true; - } - - if (this.tags.added.toLowerCase().indexOf(needle) !== -1 - || this.tags.removed.toLowerCase().indexOf(needle) !== -1) { - return true; - } - - for (let i = 0; i < this.messages.length; i += 1) { - if (this.messages[i].text.toLowerCase().indexOf(needle) !== -1) { - return true; - } - } - - return false; - } - } - - return class Plugin { - constructor(obj) { - /* Plugin data */ - this.name = obj.name; - this._crc = obj.crc || 0; - this.version = obj.version || ''; - this.isActive = obj.isActive || false; - this.isEmpty = obj.isEmpty || false; - this.isMaster = obj.isMaster || false; - this.loadsArchive = obj.loadsArchive || false; - - this.masterlist = obj.masterlist; - this._userlist = obj.userlist; - - this._priority = obj.priority || 0; - this._globalPriority = obj.globalPriority || 0; - this._messages = obj.messages || []; - this._tags = obj.tags || []; - this._isDirty = obj.isDirty || false; - this._loadOrderIndex = obj.loadOrderIndex; - this.cleanedWith = obj.cleanedWith || ''; - - /* UI state variables */ - this.id = this.name.replace(/\s+/g, ''); - this._isEditorOpen = false; - this._isSearchResult = false; - } - - update(plugin) { - if (!plugin) { - return; - } - if (plugin.name !== this.name) { - throw new Error(`Cannot update data for ${this.name} using data for ${plugin.name}`); - } - - Object.getOwnPropertyNames(plugin).forEach((property) => { - this[property] = plugin[property]; - }); - } - - static fromJson(key, value) { - if (value !== null && value.__type === 'Plugin') { - return new Plugin(value); - } - return value; - } - - static tagFromRowData(rowData) { - if (rowData.condition === undefined - || rowData.name === undefined - || rowData.type === undefined) { - throw new TypeError('Row data members are undefined'); - } - const tag = { - condition: rowData.condition, - name: '', - }; - - if (rowData.type === 'remove') { - tag.name = '-'; - } - tag.name += rowData.name; - - return tag; - } - - static tagToRowData(tag) { - const rowData = { - condition: tag.condition, - }; - - if (tag.name[0] === '-') { - rowData.type = 'remove'; - rowData.name = tag.name.substr(1); - } else { - rowData.type = 'add'; - rowData.name = tag.name; - } - - return rowData; - } - - _dispatchCardContentChangeEvent(mayChangeCardHeight) { - document.dispatchEvent(new CustomEvent('loot-plugin-card-content-change', { - detail: { - pluginId: this.id, - mayChangeCardHeight, - }, - })); - } - - _dispatchCardStylingChangeEvent() { - document.dispatchEvent(new CustomEvent('loot-plugin-card-styling-change', { - detail: { pluginId: this.id }, - })); - } - - _dispatchItemContentChangeEvent() { - document.dispatchEvent(new CustomEvent('loot-plugin-item-content-change', { - detail: { - pluginId: this.id, - priority: this.priority, - globalPriority: this.globalPriority, - isEditorOpen: this.isEditorOpen, - hasUserEdits: this.hasUserEdits, - loadOrderIndex: this.loadOrderIndex, - }, - })); - } - - get messages() { - return this._messages; - } - - set messages(messages) { - /* Update the message counts. */ - let oldTotal = 0; - let newTotal = 0; - let oldWarns = 0; - let newWarns = 0; - let oldErrs = 0; - let newErrs = 0; - - oldTotal = this._messages.length; - - this._messages.forEach((message) => { - if (message.type === 'warn') { - oldWarns += 1; - } else if (message.type === 'error') { - oldErrs += 1; - } - }); - - newTotal = messages.length; - - messages.forEach((message) => { - if (message.type === 'warn') { - newWarns += 1; - } else if (message.type === 'error') { - newErrs += 1; - } - }); - - if (newTotal !== oldTotal - || newWarns !== oldWarns - || newErrs !== oldErrs - || !_.isEqual(this._messages, messages)) { - this._messages = messages; - - document.dispatchEvent(new CustomEvent('loot-plugin-message-change', { - detail: { - pluginId: this.id, - mayChangeCardHeight: true, - totalDiff: newTotal - oldTotal, - warningDiff: newWarns - oldWarns, - errorDiff: newErrs - oldErrs, - }, - })); - } - } - - get isDirty() { - return this._isDirty; - } - - set isDirty(dirty) { - /* Update dirty counts. */ - if (dirty !== this._isDirty) { - this._isDirty = dirty; - - document.dispatchEvent(new CustomEvent('loot-plugin-cleaning-data-change', { - detail: { - isDirty: this.isDirty, - }, - })); - } - } - - get cleanedWith() { - return this._cleanedWith; - } - - set cleanedWith(cleanedWith) { - if (cleanedWith !== this._cleanedWith) { - this._cleanedWith = cleanedWith; - - document.dispatchEvent(new CustomEvent('loot-plugin-cleaning-data-change', { - detail: { - cleanedWith: this.cleanedWith, - pluginId: this.id, - }, - })); - } - } - - get crc() { - return this._crc; - } - - set crc(crc) { - if (this._crc !== crc) { - this._crc = crc; - - this._dispatchCardContentChangeEvent(false); - } - } - - get tags() { - return this._tags; - } - - set tags(tags) { - if (!_.isEqual(this._tags, tags)) { - this._tags = tags; - - this._dispatchCardContentChangeEvent(true); - } - } - - get hasUserEdits() { - return this.userlist !== undefined && Object.keys(this.userlist).length > 1; - } - - get userlist() { - return this._userlist; - } - - set userlist(userlist) { - if (!_.isEqual(this._userlist, userlist)) { - this._userlist = userlist; - - this._dispatchItemContentChangeEvent(); - this._dispatchCardStylingChangeEvent(); - } - } - - get priority() { - return this._priority; - } - - set priority(priority) { - if (this._priority !== priority) { - this._priority = priority; - - this._dispatchItemContentChangeEvent(); - } - } - - get globalPriority() { - return this._globalPriority; - } - - set globalPriority(globalPriority) { - if (this._globalPriority !== globalPriority) { - this._globalPriority = globalPriority; - - this._dispatchItemContentChangeEvent(); - } - } - - get isEditorOpen() { - return this._isEditorOpen; - } - - set isEditorOpen(isEditorOpen) { - if (this._isEditorOpen !== isEditorOpen) { - this._isEditorOpen = isEditorOpen; - - this._dispatchItemContentChangeEvent(); - } - } - - get isSearchResult() { - return this._isSearchResult; - } - - set isSearchResult(isSearchResult) { - if (this._isSearchResult !== isSearchResult) { - this._isSearchResult = isSearchResult; - - this._dispatchCardStylingChangeEvent(); - } - } - - get loadOrderIndex() { - return this._loadOrderIndex; - } - - set loadOrderIndex(loadOrderIndex) { - if (this._loadOrderIndex !== loadOrderIndex) { - this._loadOrderIndex = loadOrderIndex; - - this._dispatchItemContentChangeEvent(); - } - } - - getCardContent(filters) { - return new PluginCardContent(this, filters); - } - - static onMessageChange(evt) { - document.getElementById('filterTotalMessageNo').textContent = parseInt(document.getElementById('filterTotalMessageNo').textContent, 10) + evt.detail.totalDiff; - document.getElementById('totalMessageNo').textContent = parseInt(document.getElementById('totalMessageNo').textContent, 10) + evt.detail.totalDiff; - document.getElementById('totalWarningNo').textContent = parseInt(document.getElementById('totalWarningNo').textContent, 10) + evt.detail.warningDiff; - document.getElementById('totalErrorNo').textContent = parseInt(document.getElementById('totalErrorNo').textContent, 10) + evt.detail.errorDiff; - } - - static onCleaningDataChange(evt) { - if (evt.detail.isDirty !== undefined) { - if (evt.detail.isDirty) { - document.getElementById('dirtyPluginNo').textContent = parseInt(document.getElementById('dirtyPluginNo').textContent, 10) + 1; - } else { - document.getElementById('dirtyPluginNo').textContent = parseInt(document.getElementById('dirtyPluginNo').textContent, 10) - 1; - } - } - if (evt.detail.cleanedWith !== undefined) { - const card = document.getElementById(evt.detail.pluginId); - if (card) { - card.updateIsCleanIcon(); - } - } - } - - static onContentChange(evt) { - const card = document.getElementById(evt.detail.pluginId); - if (card) { - card.updateContent(evt.detail.mayChangeCardHeight); - } - } - - static onCardStylingChange(evt) { - const card = document.getElementById(evt.detail.pluginId); - if (card) { - card.updateStyling(); - } - } - - static onItemContentChange(evt) { - const item = document.getElementById('cardsNav').querySelector(`[data-id="${evt.detail.pluginId}"]`); - if (item) { - item.updateContent(evt.detail); - } - } - }; -})); diff --git a/src/gui/html/js/query.js b/src/gui/html/js/query.js deleted file mode 100644 index a1d56a22..00000000 --- a/src/gui/html/js/query.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; -(function exportModule(root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define([], factory); - } else { - // Browser globals - root.loot = root.loot || {}; - root.loot.query = factory(); - } -}(this, () => (requestName, ...args) => { - if (!requestName) { - throw new Error('No request name passed'); - } - const request = JSON.stringify({ - name: requestName, - args, - }); - return new Promise((resolve, reject) => { - window.cefQuery({ - request, - persistent: false, - onSuccess: resolve, - onFailure: (errorCode, errorMessage) => { - reject(new Error(errorMessage)); - }, - }); - }); -})); diff --git a/src/gui/html/js/state.js b/src/gui/html/js/state.js deleted file mode 100644 index c39e4028..00000000 --- a/src/gui/html/js/state.js +++ /dev/null @@ -1,132 +0,0 @@ -'use strict'; -(function exportModule(root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define([], factory); - } else { - // Browser globals - root.loot = root.loot || {}; - root.loot.State = factory(root.loot.DOM); - root.loot.state = new root.loot.State(); - } -}(this, dom => class State { - static get DEFAULT_STATE() { - return 0; - } - - static get SORTING_STATE() { - return 1; - } - - static get EDITING_STATE() { - return 2; - } - - constructor() { - this.currentState = State.DEFAULT_STATE; - } - - isInDefaultState() { - return this.currentState === State.DEFAULT_STATE; - } - - isInEditingState() { - return this.currentState === State.EDITING_STATE; - } - - isInSortingState() { - return this.currentState === State.SORTING_STATE; - } - - enterSortingState() { - if (this.isInSortingState()) { - return; - } - if (this.isInEditingState()) { - throw new Error('Cannot enter sorting state from editing state'); - } - - /* Hide the masterlist update buttons, and display the accept and - cancel sort buttons. */ - dom.show('updateMasterlistButton', false); - dom.show('sortButton', false); - dom.show('applySortButton'); - dom.show('cancelSortButton'); - - /* Disable changing game. */ - dom.enable('gameMenu', false); - dom.enable('refreshContentButton', false); - - dom.setUIState('sorting'); - - this.currentState = State.SORTING_STATE; - } - - exitSortingState() { - if (this.isInDefaultState()) { - return; - } - if (this.isInEditingState()) { - throw new Error('Cannot exit sorting state from editing state'); - } - - /* Show the masterlist update buttons, and hide the accept and - cancel sort buttons. */ - dom.show('updateMasterlistButton'); - dom.show('sortButton'); - dom.show('applySortButton', false); - dom.show('cancelSortButton', false); - - /* Enable changing game. */ - dom.enable('gameMenu'); - dom.enable('refreshContentButton'); - - dom.setUIState('default'); - - this.currentState = State.DEFAULT_STATE; - } - - enterEditingState() { - if (this.isInEditingState()) { - return; - } - if (this.isInSortingState()) { - throw new Error('Cannot enter editing state from sorting state'); - } - - /* Disable the toolbar elements. */ - dom.enable('wipeUserlistButton', false); - dom.enable('copyContentButton', false); - dom.enable('refreshContentButton', false); - dom.enable('settingsButton', false); - dom.enable('gameMenu', false); - dom.enable('updateMasterlistButton', false); - dom.enable('sortButton', false); - - dom.setUIState('editing'); - - this.currentState = State.EDITING_STATE; - } - - exitEditingState() { - if (this.isInDefaultState()) { - return; - } - if (this.isInSortingState()) { - throw new Error('Cannot exit editing state from sorting state'); - } - - /* Re-enable toolbar elements. */ - dom.enable('wipeUserlistButton'); - dom.enable('copyContentButton'); - dom.enable('refreshContentButton'); - dom.enable('settingsButton'); - dom.enable('gameMenu'); - dom.enable('updateMasterlistButton'); - dom.enable('sortButton'); - - dom.setUIState('default'); - - this.currentState = State.DEFAULT_STATE; - } -})); diff --git a/src/gui/html/js/translateStaticText.js b/src/gui/html/js/translateStaticText.js deleted file mode 100644 index 1449bce1..00000000 --- a/src/gui/html/js/translateStaticText.js +++ /dev/null @@ -1,379 +0,0 @@ -'use strict'; - -(function exportModule(root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define([], factory); - } else { - // Browser globals - root.loot = root.loot || {}; - root.loot.translateStaticText = factory(); - } -}(this, () => { - function getTemplate(templateId, importHtml) { - if (importHtml === undefined) { - importHtml = templateId; - } - - let template = document.getElementById(templateId); - if (!template) { - template = document - .querySelector(`link[rel="import"][href$="${importHtml}.html"]`).import; - } - template = template.querySelector(`#${templateId}`); - - if (template.tagName !== 'TEMPLATE') { - template = template.querySelector('template'); - } - - return template.content; - } - - function translatePluginCard(l10n, element) { - element.querySelector('paper-tooltip[for=activeTick]').textContent = l10n.translate('Active Plugin'); - element.querySelector('paper-tooltip[for=isMaster]').textContent = l10n.translate('Master File'); - element.querySelector('paper-tooltip[for=isEmpty]').textContent = l10n.translate('Empty Plugin'); - element.querySelector('paper-tooltip[for=loadsArchive]').textContent = l10n.translate('Loads Archive'); - element.querySelector('paper-tooltip[for=hasUserEdits]').textContent = l10n.translate('Has User Metadata'); - - element.querySelector('#editMetadata').lastChild.textContent = l10n.translate('Edit Metadata'); - element.querySelector('#copyMetadata').lastChild.textContent = l10n.translate('Copy Metadata'); - element.querySelector('#clearMetadata').lastChild.textContent = l10n.translate('Clear User Metadata'); - } - - function translatePluginCardInstance(l10n) { - const elements = document.getElementById('pluginCardList').children; - - if (elements.length > 1 && elements[1].tagName === 'LOOT-PLUGIN-CARD') { - translatePluginCard(l10n, elements[1].shadowRoot); - } - } - - function translatePluginCardTemplate(l10n) { - translatePluginCard(l10n, getTemplate('loot-plugin-card')); - } - - function translatePluginEditor(l10n) { - /* Plugin editor template. */ - const pluginEditor = document.getElementById('editor').shadowRoot; - - pluginEditor.getElementById('enableEdits').previousElementSibling.textContent = l10n.translate('Enable Edits'); - pluginEditor.getElementById('priorityValue').previousElementSibling.textContent = l10n.translate('Priority'); - pluginEditor.getElementById('globalPriorityValue').previousElementSibling.textContent = l10n.translate('Global Priority'); - - pluginEditor.getElementById('tableTabs').querySelector('[data-for=main]').textContent = l10n.translate('Main'); - pluginEditor.getElementById('tableTabs').querySelector('[data-for=after]').textContent = l10n.translate('Load After'); - pluginEditor.getElementById('tableTabs').querySelector('[data-for=req]').textContent = l10n.translate('Requirements'); - pluginEditor.getElementById('tableTabs').querySelector('[data-for=inc]').textContent = l10n.translate('Incompatibilities'); - pluginEditor.getElementById('tableTabs').querySelector('[data-for=message]').textContent = l10n.translate('Messages'); - pluginEditor.getElementById('tableTabs').querySelector('[data-for=tags]').textContent = l10n.translate('Bash Tags'); - pluginEditor.getElementById('tableTabs').querySelector('[data-for=dirty]').textContent = l10n.translate('Dirty Plugin Info'); - pluginEditor.getElementById('tableTabs').querySelector('[data-for=clean]').textContent = l10n.translate('Clean Plugin Info'); - pluginEditor.getElementById('tableTabs').querySelector('[data-for=url]').textContent = l10n.translate('Locations'); - - pluginEditor.getElementById('after').querySelector('th:first-child').textContent = l10n.translate('Filename'); - pluginEditor.getElementById('after').querySelector('th:nth-child(2)').textContent = l10n.translate('Display Name'); - pluginEditor.getElementById('after').querySelector('th:nth-child(3)').textContent = l10n.translate('Condition'); - - pluginEditor.getElementById('req').querySelector('th:first-child').textContent = l10n.translate('Filename'); - pluginEditor.getElementById('req').querySelector('th:nth-child(2)').textContent = l10n.translate('Display Name'); - pluginEditor.getElementById('req').querySelector('th:nth-child(3)').textContent = l10n.translate('Condition'); - - pluginEditor.getElementById('inc').querySelector('th:first-child').textContent = l10n.translate('Filename'); - pluginEditor.getElementById('inc').querySelector('th:nth-child(2)').textContent = l10n.translate('Display Name'); - pluginEditor.getElementById('inc').querySelector('th:nth-child(3)').textContent = l10n.translate('Condition'); - - pluginEditor.getElementById('message').querySelector('th:first-child').textContent = l10n.translate('Type'); - pluginEditor.getElementById('message').querySelector('th:nth-child(2)').textContent = l10n.translate('Content'); - pluginEditor.getElementById('message').querySelector('th:nth-child(3)').textContent = l10n.translate('Condition'); - pluginEditor.getElementById('message').querySelector('th:nth-child(4)').textContent = l10n.translate('Language'); - - pluginEditor.getElementById('tags').querySelector('th:first-child').textContent = l10n.translate('Add/Remove'); - pluginEditor.getElementById('tags').querySelector('th:nth-child(2)').textContent = l10n.translate('Bash Tag'); - pluginEditor.getElementById('tags').querySelector('th:nth-child(3)').textContent = l10n.translate('Condition'); - - pluginEditor.getElementById('dirty').querySelector('th:first-child').textContent = l10n.translate('CRC'); - pluginEditor.getElementById('dirty').querySelector('th:nth-child(2)').textContent = l10n.translate('ITM Count'); - pluginEditor.getElementById('dirty').querySelector('th:nth-child(3)').textContent = l10n.translate('Deleted References'); - pluginEditor.getElementById('dirty').querySelector('th:nth-child(4)').textContent = l10n.translate('Deleted Navmeshes'); - pluginEditor.getElementById('dirty').querySelector('th:nth-child(5)').textContent = l10n.translate('Cleaning Utility'); - - pluginEditor.getElementById('clean').querySelector('th:first-child').textContent = l10n.translate('CRC'); - pluginEditor.getElementById('clean').querySelector('th:nth-child(2)').textContent = l10n.translate('Cleaning Utility'); - - pluginEditor.getElementById('url').querySelector('th:first-child').textContent = l10n.translate('URL'); - pluginEditor.getElementById('url').querySelector('th:nth-child(2)').textContent = l10n.translate('Name'); - - pluginEditor.querySelector('paper-tooltip[for=accept]').textContent = l10n.translate('Save Metadata'); - pluginEditor.querySelector('paper-tooltip[for=cancel]').textContent = l10n.translate('Cancel'); - } - - function translatePluginListItem(l10n, element) { - element.querySelector('#globalPriorityTooltip').textContent = l10n.translate('Global Priority'); - element.querySelector('#localPriorityTooltip').textContent = l10n.translate('Priority'); - element.querySelector('paper-tooltip[for=hasUserEdits]').textContent = l10n.translate('Has User Metadata'); - element.querySelector('paper-tooltip[for=editorIsOpen]').textContent = l10n.translate('Editor Is Open'); - } - - function translatePluginListItemInstance(l10n) { - const elements = document.getElementById('cardsNav').children; - - if (elements.length > 1 && elements[1].tagName === 'LOOT-PLUGIN-ITEM') { - translatePluginListItem(l10n, elements[1].shadowRoot); - } - } - - function translatePluginListItemTemplate(l10n) { - translatePluginListItem(l10n, getTemplate('loot-plugin-item')); - } - - function translateMessageDialogTemplate(l10n) { - /* Plugin List Item Template */ - const messageDialog = getTemplate('loot-message-dialog'); - - messageDialog.getElementById('confirm').textContent = l10n.translate('OK'); - messageDialog.getElementById('dismiss').textContent = l10n.translate('Cancel'); - } - - function translateFileRowTemplate(l10n) { - /* File row template */ - const fileRow = getTemplate('fileRow', 'editable-table'); - - fileRow.querySelector('.name').setAttribute('error-message', l10n.translate('A filename is required.')); - fileRow.querySelector('paper-tooltip').textContent = l10n.translate('Delete Row'); - } - - function translateMessageRowTemplate(l10n) { - /* Message row template */ - const messageRow = getTemplate('messageRow', 'editable-table'); - - messageRow.querySelector('.type').children[0].textContent = l10n.translate('Note'); - messageRow.querySelector('.type').children[1].textContent = l10n.translate('Warning'); - messageRow.querySelector('.type').children[2].textContent = l10n.translate('Error'); - messageRow.querySelector('.text').setAttribute('error-message', l10n.translate('A content string is required.')); - messageRow.querySelector('paper-tooltip').textContent = l10n.translate('Delete Row'); - } - - function translateTagRowTemplate(l10n) { - /* Tag row template */ - const tagRow = getTemplate('tagRow', 'editable-table'); - - tagRow.querySelector('.type').children[0].textContent = l10n.translate('Add'); - tagRow.querySelector('.type').children[1].textContent = l10n.translate('Remove'); - tagRow.querySelector('.name').setAttribute('error-message', l10n.translate('A name is required.')); - tagRow.querySelector('paper-tooltip').textContent = l10n.translate('Delete Row'); - } - - function translateDirtyInfoRowTemplate(l10n) { - /* Dirty Info row template */ - const dirtyInfoRow = getTemplate('dirtyInfoRow', 'editable-table'); - - dirtyInfoRow.querySelector('.crc').setAttribute('error-message', l10n.translate('A CRC is required.')); - dirtyInfoRow.querySelector('.itm').setAttribute('error-message', l10n.translate('Values must be integers.')); - dirtyInfoRow.querySelector('.udr').setAttribute('error-message', l10n.translate('Values must be integers.')); - dirtyInfoRow.querySelector('.nav').setAttribute('error-message', l10n.translate('Values must be integers.')); - dirtyInfoRow.querySelector('.utility').setAttribute('error-message', l10n.translate('A utility name is required.')); - dirtyInfoRow.querySelector('paper-tooltip').textContent = l10n.translate('Delete Row'); - } - - function translateCleanInfoRowTemplate(l10n) { - /* Dirty Info row template */ - const cleanInfoRow = getTemplate('cleanInfoRow', 'editable-table'); - - cleanInfoRow.querySelector('.crc').setAttribute('error-message', l10n.translate('A CRC is required.')); - cleanInfoRow.querySelector('.utility').setAttribute('error-message', l10n.translate('A utility name is required.')); - cleanInfoRow.querySelector('paper-tooltip').textContent = l10n.translate('Delete Row'); - } - - function translateLocationRowTemplate(l10n) { - /* Location row template */ - const locationRow = getTemplate('locationRow', 'editable-table'); - - locationRow.querySelector('.link').setAttribute('error-message', l10n.translate('A link is required.')); - locationRow.querySelector('paper-tooltip').textContent = l10n.translate('Delete Row'); - } - - function translateGameRowTemplate(l10n) { - /* Game row template */ - const gameRow = getTemplate('gameRow', 'editable-table'); - - gameRow.querySelector('.name').setAttribute('error-message', l10n.translate('A name is required.')); - gameRow.querySelector('.folder').setAttribute('error-message', l10n.translate('A folder is required.')); - gameRow.querySelector('paper-tooltip').textContent = l10n.translate('Delete Row'); - } - - function translateNewRowTemplate(l10n) { - /* New row template */ - const newRow = getTemplate('newRow', 'editable-table'); - - newRow.querySelector('paper-tooltip').textContent = l10n.translate('Add New Row'); - } - - function translateMainToolbar(l10n) { - /* Main toolbar */ - const mainToolbar = document.getElementById('mainToolbar'); - mainToolbar.querySelector('paper-tooltip[for=jumpToGeneralInfo]').textContent = l10n.translate('Jump To General Information'); - mainToolbar.querySelector('paper-tooltip[for=sortButton]').textContent = l10n.translate('Sort Plugins'); - mainToolbar.querySelector('paper-tooltip[for=updateMasterlistButton]').textContent = l10n.translate('Update Masterlist'); - document.getElementById('applySortButton').textContent = l10n.translate('Apply'); - document.getElementById('cancelSortButton').textContent = l10n.translate('Cancel'); - mainToolbar.querySelector('paper-tooltip[for=showSearch]').textContent = l10n.translate('Search Cards'); - - /* Toolbar menu */ - document.getElementById('redatePluginsButton').lastChild.textContent = l10n.translate('Redate Plugins'); - document.getElementById('openLogButton').lastChild.textContent = l10n.translate('Open Debug Log Location'); - document.getElementById('wipeUserlistButton').lastChild.textContent = l10n.translate('Clear All User Metadata'); - document.getElementById('copyLoadOrderButton').lastChild.textContent = l10n.translate('Copy Load Order'); - document.getElementById('copyContentButton').lastChild.textContent = l10n.translate('Copy Content'); - document.getElementById('refreshContentButton').lastChild.textContent = l10n.translate('Refresh Content'); - document.getElementById('helpButton').lastChild.textContent = l10n.translate('View Documentation'); - document.getElementById('aboutButton').lastChild.textContent = l10n.translate('About'); - document.getElementById('settingsButton').lastChild.textContent = l10n.translate('Settings'); - document.getElementById('quitButton').lastChild.textContent = l10n.translate('Quit'); - - /* Search bar */ - document.getElementById('searchBar').shadowRoot.getElementById('search').label = l10n.translate('Search cards'); - } - - function updateDropdownSelectedItemText(dropdownElement) { - const paperDropdownMenu = dropdownElement.shadowRoot.querySelector('paper-dropdown-menu'); - if (paperDropdownMenu.selectedItem) { - paperDropdownMenu.shadowRoot.querySelector('paper-input').value = paperDropdownMenu.selectedItem.textContent; - } - } - - function translateSidebar(l10n) { - /* Nav items */ - document.getElementById('sidebarTabs').firstElementChild.textContent = l10n.translate('Plugins'); - document.getElementById('sidebarTabs').firstElementChild.nextElementSibling.textContent = l10n.translate('Filters'); - document.getElementById('filters').querySelector('paper-tooltip[for=contentFilter]').textContent = l10n.translate('Press Enter or click outside the input to set the filter.'); - document.getElementById('contentFilter').label = l10n.translate('Show only plugins with cards that contain'); - document.getElementById('contentFilter').placeholder = l10n.translate('No text specified'); - - /* Filters */ - document.getElementById('hideVersionNumbers').textContent = l10n.translate('Hide version numbers'); - document.getElementById('hideCRCs').textContent = l10n.translate('Hide CRCs'); - document.getElementById('hideBashTags').textContent = l10n.translate('Hide Bash Tags'); - document.getElementById('hideNotes').textContent = l10n.translate('Hide notes'); - document.getElementById('hideDoNotCleanMessages').textContent = l10n.translate('Hide \'Do not clean\' messages'); - document.getElementById('hideAllPluginMessages').textContent = l10n.translate('Hide all plugin messages'); - document.getElementById('hideInactivePlugins').textContent = l10n.translate('Hide inactive plugins'); - document.getElementById('hideMessagelessPlugins').textContent = l10n.translate('Hide messageless plugins'); - - const conflictsFilter = document.getElementById('conflictsFilter'); - conflictsFilter.label = l10n.translate('Show only conflicting plugins for'); - conflictsFilter.firstElementChild.textContent = l10n.translate('No plugin selected'); - /* The selected text doesn't update, so force that translation. */ - updateDropdownSelectedItemText(conflictsFilter); - - document.getElementById('hiddenPluginsTxt').textContent = l10n.translate('Hidden plugins:'); - document.getElementById('hiddenMessagesTxt').textContent = l10n.translate('Hidden messages:'); - } - - function translateSummaryCard(l10n) { - /* Summary */ - document.getElementById('summary').firstElementChild.textContent = l10n.translate('General Information'); - document.getElementById('masterlistRevision').previousElementSibling.textContent = l10n.translate('Masterlist Revision'); - document.getElementById('masterlistDate').previousElementSibling.textContent = l10n.translate('Masterlist Date'); - document.getElementById('totalWarningNo').previousElementSibling.textContent = l10n.translate('Warnings'); - document.getElementById('totalErrorNo').previousElementSibling.textContent = l10n.translate('Errors'); - document.getElementById('totalMessageNo').previousElementSibling.textContent = l10n.translate('Total Messages'); - document.getElementById('activePluginNo').previousElementSibling.textContent = l10n.translate('Active Plugins'); - document.getElementById('dirtyPluginNo').previousElementSibling.textContent = l10n.translate('Dirty Plugins'); - document.getElementById('totalPluginNo').previousElementSibling.textContent = l10n.translate('Total Plugins'); - } - - function translateSettingsDialog(l10n) { - /* Settings dialog */ - document.getElementById('settingsDialog').querySelector('h2').textContent = l10n.translate('Settings'); - - const defaultGameSelect = document.getElementById('defaultGameSelect'); - defaultGameSelect.previousElementSibling.textContent = l10n.translate('Default Game'); - defaultGameSelect.firstElementChild.textContent = l10n.translate('Autodetect'); - /* The selected text doesn't update, so force that translation. */ - updateDropdownSelectedItemText(defaultGameSelect); - - document.getElementById('languageLabel').textContent = l10n.translate('Language'); - document.getElementById('languageLabel').nextElementSibling.textContent = l10n.translate('Language changes will be applied after LOOT is restarted.'); - - document.getElementById('enableDebugLogging').previousElementSibling.textContent = l10n.translate('Enable debug logging'); - document.getElementById('enableDebugLogging').nextElementSibling.textContent = l10n.translate('The output is logged to the LOOTDebugLog.txt file.'); - - document.getElementById('updateMasterlist').previousElementSibling.textContent = l10n.translate('Update masterlist before sorting'); - - const gameTable = document.getElementById('gameTable'); - gameTable.querySelector('th:first-child').textContent = l10n.translate('Name'); - gameTable.querySelector('th:nth-child(2)').textContent = l10n.translate('Base Game'); - gameTable.querySelector('th:nth-child(3)').textContent = l10n.translate('LOOT Folder'); - gameTable.querySelector('th:nth-child(4)').textContent = l10n.translate('Master File'); - gameTable.querySelector('th:nth-child(5)').textContent = l10n.translate('Masterlist Repository URL'); - gameTable.querySelector('th:nth-child(6)').textContent = l10n.translate('Masterlist Repository Branch'); - gameTable.querySelector('th:nth-child(7)').textContent = l10n.translate('Install Path'); - gameTable.querySelector('th:nth-child(8)').textContent = l10n.translate('Install Path Registry Key'); - - /* As the game table is attached on launch, its "Add New Row" - tooltip doesn't benefit from the template translation above. */ - gameTable.querySelector('tr:last-child paper-tooltip').textContent = l10n.translate('Add New Row'); - - document.getElementById('settingsDialog').getElementsByClassName('accept')[0].textContent = l10n.translate('Apply'); - document.getElementById('settingsDialog').getElementsByClassName('cancel')[0].textContent = l10n.translate('Cancel'); - } - - function translateFirstRunDialog(l10n, version) { - /* First-run dialog */ - const firstRun = document.getElementById('firstRun'); - firstRun.querySelector('h2').textContent = l10n.translate('First-Time Tips'); - - firstRun.querySelector('p:first-of-type').innerHTML = l10n.translateFormatted('This appears to be the first time you have run LOOT v%s. Here are some tips to help you get started with the interface.', version.release); - - firstRun.querySelector('li:nth-child(1)').innerHTML = l10n.translateFormatted('Click %(menu_icon)s buttons to open menus.', { - menu_icon: '', - }); - firstRun.querySelector('li:nth-child(2)').innerHTML = l10n.translate('As well as messages, LOOT displays plugin version numbers, CRCs and Bash Tag suggestions for addition and removal.'); - firstRun.querySelector('li:nth-child(3)').textContent = l10n.translate('CRCs are only displayed after plugins have been loaded, either by conflict filtering, or by sorting.'); - firstRun.querySelector('li:nth-child(4)').textContent = l10n.translate('Double-click a plugin in the sidebar to quickly open it in the metadata editor.'); - firstRun.querySelector('li:nth-child(5)').textContent = l10n.translate('Plugins can be drag and dropped from the sidebar into the metadata editor\'s "load after", "requirements" and "incompatibility" tables.'); - firstRun.querySelector('li:nth-child(6)').textContent = l10n.translate('Some features are disabled while the metadata editor is open, or while there is a sorted load order that has not been applied or discarded.'); - firstRun.querySelector('li:last-child').textContent = l10n.translate('Many interface elements have tooltips. If you don\'t know what something is, try hovering your mouse over it to find out. Otherwise, LOOT\'s documentation can be accessed through the main menu.'); - - firstRun.querySelector('p:last-of-type').innerHTML = l10n.translateFormatted("LOOT is free, but if you want to show your appreciation with some money, donations may be made to WrinklyNinja (LOOT's creator and main developer) using %s or %s.", 'PayPal', 'Bitcoin'); - - firstRun.getElementsByTagName('paper-button')[0].textContent = l10n.translate('OK'); - } - - function translateAboutDialog(l10n, version) { - const about = document.getElementById('about'); - about.querySelector('h2').textContent = l10n.translate('About LOOT'); - - about.querySelector('p:nth-child(1)').innerHTML = l10n.translateFormatted('Version %s (build %s)', version.release, version.build); - about.querySelector('p:nth-child(2)').textContent = l10n.translate('Load order optimisation for Oblivion, Skyrim, Skyrim Special Edition, Fallout 3, Fallout: New Vegas and Fallout 4.'); - - about.querySelector('p:nth-child(4)').innerHTML = l10n.translateFormatted("LOOT is free, but if you want to show your appreciation with some money, donations may be made to WrinklyNinja (LOOT's creator and main developer) using %s or %s.", 'PayPal', 'Bitcoin'); - } - - return (l10n, version) => { - translatePluginCardInstance(l10n); - translatePluginCardTemplate(l10n); - translatePluginEditor(l10n); - translatePluginListItemInstance(l10n); - translatePluginListItemTemplate(l10n); - translateMessageDialogTemplate(l10n); - - translateFileRowTemplate(l10n); - translateMessageRowTemplate(l10n); - translateTagRowTemplate(l10n); - translateDirtyInfoRowTemplate(l10n); - translateCleanInfoRowTemplate(l10n); - translateLocationRowTemplate(l10n); - translateGameRowTemplate(l10n); - translateNewRowTemplate(l10n); - - translateMainToolbar(l10n); - translateSidebar(l10n); - - translateSummaryCard(l10n); - translateSettingsDialog(l10n); - translateFirstRunDialog(l10n, version); - translateAboutDialog(l10n, version); - }; -})); diff --git a/src/gui/html/js/translator.js b/src/gui/html/js/translator.js deleted file mode 100644 index f412f1df..00000000 --- a/src/gui/html/js/translator.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict'; - -(function exportModule(root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['bower_components/Jed/jed', - 'bower_components/jed-gettext-parser/jedGettextParser'], - factory); - } else { - // Browser globals - root.loot = root.loot || {}; - root.loot.Translator = factory(root.Jed, root.jedGettextParser); - } -}(this, (Jed, jedGettextParser) => class { - /* Returns a Promise */ - constructor(locale) { - this.locale = locale || 'en'; - this.jed = undefined; - } - - load() { - const defaultTranslationData = { - messages: { - '': { - domain: 'messages', - lang: 'en', - plural_forms: 'nplurals=2; plural=(n != 1);', - }, - }, - }; - - let translationDataPromise; - if (this.locale === 'en') { - /* Just resolve to an empty data set. */ - translationDataPromise = Promise.resolve(defaultTranslationData); - } else { - translationDataPromise = new Promise((resolve, reject) => { - const url = `http://loot/l10n/${this.locale}/LC_MESSAGES/loot.mo`; - const xhr = new XMLHttpRequest(); - xhr.open('GET', url); - xhr.responseType = 'arraybuffer'; - xhr.addEventListener('readystatechange', (evt) => { - if (evt.target.readyState === 4) { - /* Status is 0 for local file URL loading. */ - if (evt.target.status >= 200 && evt.target.status < 400) { - resolve(jedGettextParser.mo.parse(evt.target.response)); - } else { - reject(new Error(evt.target.statusText)); - } - } - }, false); - xhr.send(); - }); - } - - return translationDataPromise.catch((error) => { - console.log(`Error loading translation data: ${error.message}`); // eslint-disable-line no-console - return defaultTranslationData; - }).then((result) => { - this.jed = new Jed({ - locale_data: result, - domain: 'messages', - }); - }); - } - - translate(text) { - return this.translateFormatted(text); - } - - translateFormatted(text, ...substitutions) { - if (text === undefined) { - return ''; - } - if (this.jed === undefined) { - return text; - } - return this.jed.translate(text).fetch(...substitutions); - } -})); diff --git a/src/gui/html/js/updateExists.js b/src/gui/html/js/updateExists.js deleted file mode 100644 index 5d9923e7..00000000 --- a/src/gui/html/js/updateExists.js +++ /dev/null @@ -1,66 +0,0 @@ -'use strict'; -(function exportModule(root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['bower_components/octokat/dist/octokat.js'], factory); - } else { - // Browser globals - root.loot = root.loot || {}; - root.loot.updateExists = factory(root.Octokat); - } -}(this, (Octokat) => { - const versionRegex = /^(\d+)\.(\d+)\.(\d+)$/; - - function compare(lhs, rhs) { - if (!versionRegex.test(lhs) || !versionRegex.test(rhs)) { - throw new Error(`versions to compare are of unexpected format: ${lhs}, ${rhs}`); - } - - const lhsNumbers = lhs.split('.'); - const rhsNumbers = rhs.split('.'); - - for (let i = 0; i < lhsNumbers.length; i += 1) { - const lhsNumber = Number(lhsNumbers[i]); - const rhsNumber = Number(rhsNumbers[i]); - - if (lhsNumber < rhsNumber) { - return -1; - } - - if (rhsNumber < lhsNumber) { - return 1; - } - } - - return 0; - } - - return (currentVersion, currentBuild) => { - if (currentVersion === undefined || currentBuild === undefined) { - return Promise.reject(new Error('Invalid arguments, both version and build must be given')); - } - - const repo = (new Octokat()).repos('loot', 'loot'); - - return repo.releases.latest.fetch().then((latestRelease) => { - const comparison = compare(currentVersion, latestRelease.tagName); - if (comparison === -1) { - return true; - } else if (comparison === 1) { - return false; - } - - return repo.tags.fetch().then((tags) => { - const tag = tags.find((element) => element.name === latestRelease.tagName); - - return !tag.commit.sha.startsWith(currentBuild); - }); - }).catch((error) => { - if (!error.message) { - console.error(error); - } else { - throw error; - } - }); - }; -})); diff --git a/src/gui/html/polymer-settings.html b/src/gui/html/polymer-settings.html deleted file mode 100644 index 02261054..00000000 --- a/src/gui/html/polymer-settings.html +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/src/gui/loot_app.cpp b/src/gui/loot_app.cpp deleted file mode 100644 index 1962e759..00000000 --- a/src/gui/loot_app.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2014-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#include "gui/loot_app.h" - -#include -#include -#include -#include - -#include "gui/state/loot_paths.h" -#include "loot/language.h" -#include "gui/loot_handler.h" -#include "gui/loot_scheme_handler_factory.h" - -namespace loot { -void LootApp::Initialise(const std::string& defaultGame, - const std::string& lootDataPath, - const std::string& url) { - LootPaths::initialise(lootDataPath); - lootState_.init(defaultGame); - url_ = url; -} - -void LootApp::OnBeforeCommandLineProcessing(const CefString& process_type, - CefRefPtr command_line) { - if (process_type.empty()) { - // Browser process, OK to modify the command line. - - // Disable spell checking. - command_line->AppendSwitch("--disable-spell-checking"); - command_line->AppendSwitch("--disable-extensions"); - } -} - -CefRefPtr LootApp::GetBrowserProcessHandler() { - return this; -} - -CefRefPtr LootApp::GetRenderProcessHandler() { - return this; -} - -void LootApp::OnContextInitialized() { - //Make sure this is running in the UI thread. - assert(CefCurrentlyOn(TID_UI)); - - // Information used when creating the native window. - CefWindowInfo window_info; - -#ifdef _WIN32 - // On Windows we need to specify certain flags that will be passed to CreateWindowEx(). - window_info.SetAsPopup(NULL, "LOOT"); -#endif - - // Set the handler for browser-level callbacks. - CefRefPtr handler(new LootHandler(lootState_)); - - // Register the custom "loot" domain handler. - CefRegisterSchemeHandlerFactory("http", "loot", new LootSchemeHandlerFactory()); - - // Specify CEF browser settings here. - CefBrowserSettings browser_settings; - - // Need to set the global locale for this process so that messages will - // be translated. - BOOST_LOG_TRIVIAL(debug) << "Initialising language settings in UI thread."; - if (lootState_.getLanguage().GetCode() != LanguageCode::english) { - boost::locale::generator gen; - gen.add_messages_path(LootPaths::getL10nPath().string()); - gen.add_messages_domain("loot"); - - BOOST_LOG_TRIVIAL(debug) << "Selected language: " << lootState_.getLanguage().GetName(); - std::locale::global(gen(lootState_.getLanguage().GetLocale() + ".UTF-8")); - boost::filesystem::path::imbue(std::locale()); - } - - // Create the first browser window. - CefBrowserHost::CreateBrowser(window_info, handler.get(), url_, browser_settings, NULL); -} - -void LootApp::OnWebKitInitialized() { - // Create the renderer-side router for query handling. - CefMessageRouterConfig config; - message_router_ = CefMessageRouterRendererSide::Create(config); -} - -bool LootApp::OnProcessMessageReceived( - CefRefPtr browser, - CefProcessId source_process, - CefRefPtr message) { - // Handle IPC messages from the browser process... - return message_router_->OnProcessMessageReceived(browser, source_process, message); -} - -void LootApp::OnContextCreated(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr context) { - // Register javascript functions. - message_router_->OnContextCreated(browser, frame, context); -} -} diff --git a/src/gui/loot_app.h b/src/gui/loot_app.h deleted file mode 100644 index 5c66c15f..00000000 --- a/src/gui/loot_app.h +++ /dev/null @@ -1,71 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2014-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#ifndef LOOT_GUI_LOOT_APP -#define LOOT_GUI_LOOT_APP - -#include -#include -#include - -#include "gui/state/loot_state.h" - -namespace loot { -class LootApp : public CefApp, - public CefBrowserProcessHandler, - public CefRenderProcessHandler { -public: - void Initialise(const std::string& defaultGame, - const std::string& lootDataPath, - const std::string& url); - - // Override CefApp methods. - virtual void OnBeforeCommandLineProcessing(const CefString& process_type, - CefRefPtr command_line); - virtual CefRefPtr GetBrowserProcessHandler() OVERRIDE; - virtual CefRefPtr GetRenderProcessHandler() OVERRIDE; - - // Override CefBrowserProcessHandler methods. - virtual void OnContextInitialized() OVERRIDE; - virtual void OnWebKitInitialized() OVERRIDE; - - // Override CefRenderProcessHandler methods. - virtual bool OnProcessMessageReceived(CefRefPtr browser, - CefProcessId source_process, - CefRefPtr message) OVERRIDE; - -private: - virtual void OnContextCreated(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr context) OVERRIDE; - - LootState lootState_; - CefRefPtr message_router_; - std::string url_; - - IMPLEMENT_REFCOUNTING(LootApp); -}; -} - -#endif diff --git a/src/gui/loot_handler.cpp b/src/gui/loot_handler.cpp deleted file mode 100644 index 0eb5b97b..00000000 --- a/src/gui/loot_handler.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2014-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#include "gui/loot_handler.h" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "gui/state/loot_paths.h" -#include "gui/helpers.h" -#include "gui/loot_scheme_handler_factory.h" -#include "gui/query_handler.h" -#include "gui/resource.h" - -namespace loot { -LootHandler::LootHandler(LootState& lootState) : lootState_(lootState) {} - -// CefClient methods -//------------------ - -CefRefPtr LootHandler::GetDisplayHandler() { - return this; -} - -CefRefPtr LootHandler::GetLifeSpanHandler() { - return this; -} - -CefRefPtr LootHandler::GetLoadHandler() { - return this; -} - -bool LootHandler::OnProcessMessageReceived(CefRefPtr browser, - CefProcessId source_process, - CefRefPtr message) { - return browser_side_router_->OnProcessMessageReceived(browser, source_process, message); -} - -// CefLifeSpanHandler methods -//--------------------------- - -void LootHandler::OnAfterCreated(CefRefPtr browser) { - assert(CefCurrentlyOn(TID_UI)); - -#ifdef _WIN32 - // Set the title bar icon. - HWND hWnd = browser->GetHost()->GetWindowHandle(); - HANDLE hIcon = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(MAINICON), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE); - HANDLE hIconSm = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(MAINICON), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE); - SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon); - SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIconSm); - - // Set the window title. - SetWindowText(hWnd, L"LOOT"); -#endif - - // Set window size & position. - if (lootState_.isWindowPositionStored()) { -#ifdef _WIN32 - WINDOWPLACEMENT windowPlacement; - windowPlacement.length = sizeof(WINDOWPLACEMENT); - windowPlacement.rcNormalPosition.left = lootState_.getWindowPosition().left; - windowPlacement.rcNormalPosition.top = lootState_.getWindowPosition().top; - windowPlacement.rcNormalPosition.right = lootState_.getWindowPosition().right; - windowPlacement.rcNormalPosition.bottom = lootState_.getWindowPosition().bottom; - - if (lootState_.getWindowPosition().maximised) { - windowPlacement.showCmd = SW_SHOWMAXIMIZED; - } - - // Fit the saved window size/position to the current monitor setup. - - // Get the nearest monitor to the saved size/pos. - HMONITOR hMonitor; - hMonitor = MonitorFromRect(&windowPlacement.rcNormalPosition, MONITOR_DEFAULTTONEAREST); - - // Get the rect for the monitor's working area. - MONITORINFO mi; - mi.cbSize = sizeof(mi); - GetMonitorInfo(hMonitor, &mi); - - // Clip the saved rect to fit inside the monitor rect. - int width = windowPlacement.rcNormalPosition.right - windowPlacement.rcNormalPosition.left; - int height = windowPlacement.rcNormalPosition.bottom - windowPlacement.rcNormalPosition.top; - windowPlacement.rcNormalPosition.left = max(mi.rcWork.left, min(mi.rcWork.right - width, windowPlacement.rcNormalPosition.left)); - windowPlacement.rcNormalPosition.top = max(mi.rcWork.top, min(mi.rcWork.bottom - height, windowPlacement.rcNormalPosition.top)); - windowPlacement.rcNormalPosition.right = windowPlacement.rcNormalPosition.left + width; - windowPlacement.rcNormalPosition.bottom = windowPlacement.rcNormalPosition.top + height; - - SetWindowPlacement(hWnd, &windowPlacement); -#endif - } else { -#ifdef _WIN32 - // High DPI support doesn't seem to scale window content correctly - // unless the window is resized, so if no size info is recorded, - // just set its current size + 1. - RECT rc; - GetWindowRect(browser->GetHost()->GetWindowHandle(), &rc); - SetWindowPos(browser->GetHost()->GetWindowHandle(), HWND_TOP, rc.left, rc.top, rc.right - rc.left + 1, rc.bottom - rc.top + 1, SWP_SHOWWINDOW); -#endif - } - - // Add to the list of existing browsers. - browser_list_.push_back(browser); - - // Create a message router. - CefMessageRouterConfig config; - browser_side_router_ = CefMessageRouterBrowserSide::Create(config); - - browser_side_router_->AddHandler(new QueryHandler(lootState_), false); -} - -bool LootHandler::DoClose(CefRefPtr browser) { - assert(CefCurrentlyOn(TID_UI)); - - // Check if unapplied changes exist. - if (lootState_.hasUnappliedChanges()) { - browser->GetMainFrame()->ExecuteJavaScript("onQuit();", browser->GetMainFrame()->GetURL(), 0); - return true; - } - - // Allow the close. For windowed browsers this will result in the OS close - // event being sent. - return false; -} - -void LootHandler::OnBeforeClose(CefRefPtr browser) { - assert(CefCurrentlyOn(TID_UI)); - -#ifdef _WIN32 - WINDOWPLACEMENT windowPlacement; - windowPlacement.length = sizeof(WINDOWPLACEMENT); - - GetWindowPlacement(browser->GetHost()->GetWindowHandle(), &windowPlacement); - - LootSettings::WindowPosition position; - position.top = windowPlacement.rcNormalPosition.top; - position.bottom = windowPlacement.rcNormalPosition.bottom; - position.left = windowPlacement.rcNormalPosition.left; - position.right = windowPlacement.rcNormalPosition.right; - position.maximised = windowPlacement.showCmd == SW_SHOWMAXIMIZED; - lootState_.storeWindowPosition(position); -#endif - - try { - lootState_.save(LootPaths::getSettingsPath()); - } catch (std::exception &e) { - BOOST_LOG_TRIVIAL(error) << "Failed to save LOOT's settings. Error: " << e.what(); - } - - // Cancel any javascript callbacks. - browser_side_router_->OnBeforeClose(browser); - - // Remove from the list of existing browsers. - for (BrowserList::iterator bit = browser_list_.begin(); bit != browser_list_.end(); ++bit) { - if ((*bit)->IsSame(browser)) { - browser_list_.erase(bit); - break; - } - } - - if (browser_list_.empty()) { - // All browser windows have closed. Quit the application message loop. - CefQuitMessageLoop(); - } -} - -// CefLoadHandler methods -//----------------------- - -void LootHandler::OnLoadError(CefRefPtr browser, - CefRefPtr frame, - ErrorCode errorCode, - const CefString& errorText, - const CefString& failedUrl) { - assert(CefCurrentlyOn(TID_UI)); - - // Don't display an error for downloaded files. - if (errorCode == ERR_ABORTED) - return; - -// Display a load error message. - std::stringstream ss; - ss << "" - << "

Failed to load URL " << std::string(failedUrl) - << " with error " << std::string(errorText) << " (" << errorCode - << ").

"; - - frame->LoadString(ss.str(), failedUrl); -} - -// CefRequestHandler methods -//-------------------------- - -CefRefPtr LootHandler::GetRequestHandler() { - return this; -} - -bool LootHandler::OnBeforeBrowse(CefRefPtr< CefBrowser > browser, - CefRefPtr< CefFrame > frame, - CefRefPtr< CefRequest > request, - bool is_redirect) { - BOOST_LOG_TRIVIAL(trace) << "Attempting to open link: " << request->GetURL().ToString(); - - const std::string url = request->GetURL().ToString(); - if (boost::starts_with(url, "http://loot/")) { - BOOST_LOG_TRIVIAL(trace) << "Link is to LOOT page, allowing CEF's default handling."; - return false; - } else if (boost::starts_with(url, "http://localhost:")) { - BOOST_LOG_TRIVIAL(warning) << "Link is to a page on localhost, if this isn't happening while running tests, something has gone wrong"; - return false; - } - - BOOST_LOG_TRIVIAL(info) << "Opening link in Windows' default handler."; - OpenInDefaultApplication(boost::filesystem::path(request->GetURL().ToString())); - - return true; -} - -CefRequestHandler::ReturnValue LootHandler::OnBeforeResourceLoad(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr request, - CefRefPtr callback) { - if (boost::starts_with(request->GetURL().ToString(), "https://fonts.googleapis.com")) { - BOOST_LOG_TRIVIAL(warning) << "Blocking load of resource at " << request->GetURL().ToString(); - return RV_CANCEL; - } - - return RV_CONTINUE; -} -} diff --git a/src/gui/loot_handler.h b/src/gui/loot_handler.h deleted file mode 100644 index 397d9697..00000000 --- a/src/gui/loot_handler.h +++ /dev/null @@ -1,97 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2014-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#ifndef LOOT_GUI_LOOT_HANDLER -#define LOOT_GUI_LOOT_HANDLER - -#include - -#include -#include - -#include "gui/state/loot_state.h" - -namespace loot { -class LootHandler : public CefClient, - public CefDisplayHandler, - public CefLifeSpanHandler, - public CefLoadHandler, - public CefRequestHandler { -public: - LootHandler(LootState& lootState); - - // CefClient methods - //------------------ - virtual CefRefPtr GetDisplayHandler() OVERRIDE; - virtual CefRefPtr GetLifeSpanHandler() OVERRIDE; - virtual CefRefPtr GetLoadHandler() OVERRIDE; - - virtual bool OnProcessMessageReceived(CefRefPtr browser, - CefProcessId source_process, - CefRefPtr message) OVERRIDE; - - // CefLifeSpanHandler methods - //--------------------------- - virtual void OnAfterCreated(CefRefPtr browser) OVERRIDE; - virtual bool DoClose(CefRefPtr browser) OVERRIDE; - virtual void OnBeforeClose(CefRefPtr browser) OVERRIDE; - - // CefLoadHandler methods - //----------------------- - virtual void OnLoadError(CefRefPtr browser, - CefRefPtr frame, - ErrorCode errorCode, - const CefString& errorText, - const CefString& failedUrl) OVERRIDE; - - // CefRequestHandler methods - //-------------------------- - - virtual CefRefPtr GetRequestHandler() OVERRIDE; - - virtual bool OnBeforeBrowse(CefRefPtr< CefBrowser > browser, - CefRefPtr< CefFrame > frame, - CefRefPtr< CefRequest > request, - bool is_redirect) OVERRIDE; - - virtual CefRequestHandler::ReturnValue OnBeforeResourceLoad(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr request, - CefRefPtr callback) OVERRIDE; - -private: - typedef std::list> BrowserList; - - // List of existing browser windows. Only accessed on the CEF UI thread. - BrowserList browser_list_; - CefRefPtr browser_side_router_; - - LootState& lootState_; - - // Include the default reference counting implementation. - IMPLEMENT_REFCOUNTING(LootHandler); -}; -} - -#endif diff --git a/src/gui/loot_scheme_handler_factory.cpp b/src/gui/loot_scheme_handler_factory.cpp deleted file mode 100644 index 92ac7450..00000000 --- a/src/gui/loot_scheme_handler_factory.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#include "loot_scheme_handler_factory.h" - -#include "gui/state/loot_paths.h" - -#include -#include - -#include -#include -#include - -using namespace std; - -namespace loot { - /////////////////////////////// - // LootSchemeHandlerFactory - /////////////////////////////// - -CefRefPtr LootSchemeHandlerFactory::Create(CefRefPtr browser, - CefRefPtr frame, - const CefString& scheme_name, - CefRefPtr request) { - BOOST_LOG_TRIVIAL(info) << "Handling request to URL: " << request->GetURL().ToString(); - const string filePath = GetPath(request->GetURL()); - - if (boost::filesystem::exists(filePath)) { - return new CefStreamResourceHandler(200, - "OK", - GetMimeType(filePath), - GetHeaders(), - CefStreamReader::CreateForFile(filePath)); - } - - BOOST_LOG_TRIVIAL(trace) << "File " << filePath << " not found, sending 404."; - const string error404 = "File not found."; - CefRefPtr stream = CefStreamReader::CreateForData((void*)error404.c_str(), error404.size()); - return new CefStreamResourceHandler(404, - "Not Found", - "text/plain", - GetHeaders(), - stream); -} - -std::string LootSchemeHandlerFactory::GetPath(const CefString& url) const { - CefURLParts urlParts; - CefParseURL(url, urlParts); - - return (LootPaths::getResourcesPath() / CefString(&urlParts.path).ToString()).string(); -} - -std::string LootSchemeHandlerFactory::GetMimeType(const std::string& file) const { - if (file.substr(file.length() - 5) == ".html") - return "text/html"; - else if (file.substr(file.length() - 3) == ".js") - return "application/javascript"; - else if (file.substr(file.length() - 4) == ".css") - return "text/css"; - else - return "application/octet-stream"; -} - -CefResponse::HeaderMap LootSchemeHandlerFactory::GetHeaders() const { - CefResponse::HeaderMap headers; - headers.emplace("Access-Control-Allow-Origin", "*"); - - return headers; -} -} diff --git a/src/gui/loot_scheme_handler_factory.h b/src/gui/loot_scheme_handler_factory.h deleted file mode 100644 index 564d47b1..00000000 --- a/src/gui/loot_scheme_handler_factory.h +++ /dev/null @@ -1,48 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_LOOT_SCHEME_HANDLER_FACTORY -#define LOOT_GUI_LOOT_SCHEME_HANDLER_FACTORY - -#include -#include - -namespace loot { -class LootSchemeHandlerFactory : public CefSchemeHandlerFactory { -public: - virtual CefRefPtr Create(CefRefPtr browser, - CefRefPtr frame, - const CefString& scheme_name, - CefRefPtr request) - OVERRIDE; -private: - std::string GetPath(const CefString& url) const; - std::string GetMimeType(const std::string& file) const; - CefResponse::HeaderMap GetHeaders() const; - - IMPLEMENT_REFCOUNTING(LootSchemeHandlerFactory); -}; -} - -#endif diff --git a/src/gui/main.cpp b/src/gui/main.cpp deleted file mode 100644 index d8605133..00000000 --- a/src/gui/main.cpp +++ /dev/null @@ -1,190 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2014-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "gui/state/loot_paths.h" -#include "gui/loot_app.h" - -#ifdef _WIN32 -#include -#include -#else -#include -#include -#endif - -CefSettings GetCefSettings() { - CefSettings cef_settings; - - //Enable CEF command line args. - cef_settings.command_line_args_disabled = false; - - // Set CEF logging. - CefString(&cef_settings.log_file).FromString((loot::LootPaths::getLootDataPath() / "CEFDebugLog.txt").string()); - - // Load locale pack files from LOOT's l10n path. - CefString(&cef_settings.locales_dir_path).FromString(loot::LootPaths::getL10nPath().string()); - - return cef_settings; -} - -#ifndef _WIN32 -namespace { -int XErrorHandlerImpl(Display *display, XErrorEvent *event) { - LOG(WARNING) - << "X error received: " - << "type " << event->type << ", " - << "serial " << event->serial << ", " - << "error_code " << static_cast(event->error_code) << ", " - << "request_code " << static_cast(event->request_code) << ", " - << "minor_code " << static_cast(event->minor_code); - return 0; -} - -int XIOErrorHandlerImpl(Display *display) { - return 0; -} -} -#endif - -void processCommandLineArguments(CefRefPtr app) { - std::string defaultGame; - std::string lootDataPath; - - // Record command line arguments. - CefRefPtr command_line = CefCommandLine::CreateCommandLine(); -#ifdef _WIN32 - command_line->InitFromString(::GetCommandLineW()); -#endif - - if (command_line->HasSwitch("game")) { // Format is: --game= - defaultGame = command_line->GetSwitchValue("game"); - } - - if (command_line->HasSwitch("loot-data-path")) { - lootDataPath = command_line->GetSwitchValue("loot-data-path"); - } - - std::string url = "http://loot/ui/index.html"; - if (command_line->HasArguments()) { - std::vector arguments; - command_line->GetArguments(arguments); - url = arguments[0]; - BOOST_LOG_TRIVIAL(info) << "Loading homepage using URL " << url; - } - - app.get()->Initialise(defaultGame, lootDataPath, url); -} - -#ifdef _WIN32 -int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { -#else -int main(int argc, char* argv[]) { -#endif - - // Do all the standard CEF setup stuff. - //------------------------------------- - - void * sandbox_info = nullptr; - -#ifdef _WIN32 - // Enable High-DPI support on Windows 7 or newer. - CefEnableHighDPISupport(); - - // Read command line arguments. - CefMainArgs main_args(hInstance); -#else - // Read command line arguments. - CefMainArgs main_args(argc, argv); -#endif - - // Create the process reference. - CefRefPtr app(new loot::LootApp); - - // Run the process. - int exit_code = CefExecuteProcess(main_args, app.get(), nullptr); - if (exit_code >= 0) { - // The sub-process has completed so return here. - return exit_code; - } - -#ifdef _WIN32 - // Check if LOOT is already running - //--------------------------------- - - HANDLE hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, L"LOOT.Shell.Instance"); - if (hMutex != NULL) { - // An instance of LOOT is already running, so focus its window then quit. - HWND hWnd = ::FindWindow(NULL, L"LOOT"); - ::SetForegroundWindow(hWnd); - return 0; - } else { - //Create the mutex so that future instances will not run. - hMutex = ::CreateMutex(NULL, FALSE, L"LOOT.Shell.Instance"); - } -#endif - - // Handle command line args (not CEF args) - //---------------------------------------- - - processCommandLineArguments(app); - - // Back to CEF - //------------ - - // Initialise CEF settings. - CefSettings cef_settings = GetCefSettings(); - -#ifndef _WIN32 - // Install xlib error handlers so that the application won't be terminated - // on non-fatal errors. - XSetErrorHandler(XErrorHandlerImpl); - XSetIOErrorHandler(XIOErrorHandlerImpl); -#endif - - // Initialize CEF. - CefInitialize(main_args, cef_settings, app.get(), sandbox_info); - - // Run the CEF message loop. This will block until CefQuitMessageLoop() is called. - CefRunMessageLoop(); - - // Shut down CEF. - CefShutdown(); - -#ifdef _WIN32 - // Release the program instance mutex. - if (hMutex != NULL) - ReleaseMutex(hMutex); -#endif - - return 0; -} diff --git a/src/gui/query/apply_sort_query.h b/src/gui/query/apply_sort_query.h deleted file mode 100644 index e3eafda5..00000000 --- a/src/gui/query/apply_sort_query.h +++ /dev/null @@ -1,50 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_APPLY_SORT_QUERY -#define LOOT_GUI_QUERY_APPLY_SORT_QUERY - -#include "gui/query/query.h" - -namespace loot { -class ApplySortQuery : public Query { -public: - ApplySortQuery(LootState& state, const std::vector& plugins) : - state_(state), plugins_(plugins) {} - - std::string executeLogic() { - BOOST_LOG_TRIVIAL(trace) << "User has accepted sorted load order, applying it."; - state_.decrementUnappliedChangeCounter(); - state_.getCurrentGame().SetLoadOrder(plugins_); - - return ""; - } - -private: - LootState& state_; - const std::vector plugins_; -}; -} - -#endif diff --git a/src/gui/query/cancel_find_query.h b/src/gui/query/cancel_find_query.h deleted file mode 100644 index 70fbe1b4..00000000 --- a/src/gui/query/cancel_find_query.h +++ /dev/null @@ -1,47 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_CANCEL_FIND_QUERY -#define LOOT_GUI_QUERY_CANCEL_FIND_QUERY - -#include - -#include "gui/query/query.h" - -namespace loot { -class CancelFindQuery : public Query { -public: - CancelFindQuery(CefRefPtr browser) : browser_(browser) {} - - std::string executeLogic() { - browser_->GetHost()->StopFinding(true); - return ""; - } - -private: - const CefRefPtr browser_; -}; -} - -#endif diff --git a/src/gui/query/cancel_sort_query.h b/src/gui/query/cancel_sort_query.h deleted file mode 100644 index 01443cd7..00000000 --- a/src/gui/query/cancel_sort_query.h +++ /dev/null @@ -1,64 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_CANCEL_SORT_QUERY -#define LOOT_GUI_QUERY_CANCEL_SORT_QUERY - -#include "gui/state/loot_state.h" -#include "gui/query/json.h" -#include "gui/query/metadata_query.h" - -namespace loot { -class CancelSortQuery : public MetadataQuery { -public: - CancelSortQuery(LootState& state) : - MetadataQuery(state), - state_(state) {} - - std::string executeLogic() { - state_.decrementUnappliedChangeCounter(); - state_.getCurrentGame().DecrementLoadOrderSortCount(); - - YAML::Node response; - std::vector loadOrder = state_.getCurrentGame().GetLoadOrder(); - for (const auto& plugin : loadOrder) { - YAML::Node pluginNode; - - pluginNode["name"] = plugin; - pluginNode["loadOrderIndex"] = state_.getCurrentGame().GetActiveLoadOrderIndex(plugin, loadOrder); - - response["plugins"].push_back(pluginNode); - } - - response["generalMessages"] = getGeneralMessages(); - - return JSON::stringify(response); - } - -private: - LootState& state_; -}; -} - -#endif diff --git a/src/gui/query/change_game_query.h b/src/gui/query/change_game_query.h deleted file mode 100644 index d7127c09..00000000 --- a/src/gui/query/change_game_query.h +++ /dev/null @@ -1,53 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_CHANGE_GAME_QUERY -#define LOOT_GUI_QUERY_CHANGE_GAME_QUERY - -#include - -#include "gui/query/json.h" -#include "gui/query/get_game_data_query.h" - -namespace loot { -class ChangeGameQuery : public GetGameDataQuery { -public: - ChangeGameQuery(LootState& state, CefRefPtr frame, const std::string& gameFolder) : - GetGameDataQuery(state, frame), - state_(state), - gameFolder_(gameFolder) {} - - std::string executeLogic() { - state_.changeGame(gameFolder_); - - return GetGameDataQuery::executeLogic(); - } - -private: - LootState& state_; - const std::string gameFolder_; -}; -} - -#endif diff --git a/src/gui/query/clear_all_metadata_query.h b/src/gui/query/clear_all_metadata_query.h deleted file mode 100644 index 6825e567..00000000 --- a/src/gui/query/clear_all_metadata_query.h +++ /dev/null @@ -1,82 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_CLEAR_ALL_METADATA_QUERY -#define LOOT_GUI_QUERY_CLEAR_ALL_METADATA_QUERY - -#include "gui/state/game.h" -#include "gui/query/json.h" -#include "gui/query/metadata_query.h" - -namespace loot { -class ClearAllMetadataQuery : public MetadataQuery { -public: - ClearAllMetadataQuery(LootState& state) : - MetadataQuery(state), - game_(state.getCurrentGame()) {} - - std::string executeLogic() { - BOOST_LOG_TRIVIAL(debug) << "Clearing all user metadata."; - - // Record which plugins have userlist entries. - auto userlistPluginNames = getUserlistPluginNames(); - - // Clear the user metadata. - game_.ClearAllUserMetadata(); - game_.SaveUserMetadata(); - - BOOST_LOG_TRIVIAL(trace) << "Rederiving display metadata for " << userlistPluginNames.size() << " plugins that had user metadata."; - - return getDerivedMetadataJson(userlistPluginNames); - } - -private: - std::vector getUserlistPluginNames() const { - std::vector userlistPluginNames; - for (const auto& plugin : game_.GetPlugins()) { - if (!game_.GetUserMetadata(plugin->GetName()).HasNameOnly()) { - userlistPluginNames.push_back(plugin->GetName()); - } - } - - return userlistPluginNames; - } - - std::string getDerivedMetadataJson(const std::vector& userlistPluginNames) { - YAML::Node pluginsNode; - for (const auto &pluginName : userlistPluginNames) { - pluginsNode.push_back(generateDerivedMetadata(pluginName)); - } - - if (pluginsNode.size() > 0) - return JSON::stringify(pluginsNode); - else - return "[]"; - } - - gui::Game& game_; -}; -} - -#endif diff --git a/src/gui/query/clear_plugin_metadata_query.h b/src/gui/query/clear_plugin_metadata_query.h deleted file mode 100644 index 1ef93558..00000000 --- a/src/gui/query/clear_plugin_metadata_query.h +++ /dev/null @@ -1,60 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_CLEAR_PLUGIN_METADATA_QUERY -#define LOOT_GUI_QUERY_CLEAR_PLUGIN_METADATA_QUERY - -#include "gui/state/game.h" -#include "gui/query/json.h" -#include "gui/query/metadata_query.h" - -namespace loot { -class ClearPluginMetadataQuery : public MetadataQuery { -public: - ClearPluginMetadataQuery(LootState& state, const std::string& pluginName) : - MetadataQuery(state), - game_(state.getCurrentGame()), - pluginName_(pluginName) {} - - std::string executeLogic() { - BOOST_LOG_TRIVIAL(debug) << "Clearing user metadata for plugin " << pluginName_; - - game_.ClearUserMetadata(pluginName_); - game_.SaveUserMetadata(); - - // Now rederive the displayed metadata from the masterlist. - YAML::Node derivedMetadata = generateDerivedMetadata(pluginName_); - if (derivedMetadata.size() > 0) - return JSON::stringify(derivedMetadata); - - return "null"; - } - -private: - gui::Game& game_; - const std::string pluginName_; -}; -} - -#endif diff --git a/src/gui/query/clipboard_query.h b/src/gui/query/clipboard_query.h deleted file mode 100644 index 78a53a93..00000000 --- a/src/gui/query/clipboard_query.h +++ /dev/null @@ -1,63 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_CLIPBOARD_QUERY -#define LOOT_GUI_QUERY_CLIPBOARD_QUERY - -#include "gui/query/query.h" -#include "loot/windows_encoding_converters.h" - -namespace loot { -class ClipboardQuery : public Query { -protected: - void copyToClipboard(const std::string& text) { -#ifdef _WIN32 - if (!OpenClipboard(NULL)) { - throw std::system_error(GetLastError(), std::system_category(), "Failed to open the Windows clipboard."); - } - - if (!EmptyClipboard()) { - throw std::system_error(GetLastError(), std::system_category(), "Failed to empty the Windows clipboard."); - } - - // The clipboard takes a Unicode (ie. UTF-16) string that it then owns and must not - // be destroyed by LOOT. Convert the string, then copy it into a new block of - // memory for the clipboard. - std::wstring wtext = ToWinWide(text); - wchar_t * wcstr = new wchar_t[wtext.length() + 1]; - wcscpy(wcstr, wtext.c_str()); - - if (SetClipboardData(CF_UNICODETEXT, wcstr) == NULL) { - throw std::system_error(GetLastError(), std::system_category(), "Failed to copy metadata to the Windows clipboard."); - } - - if (!CloseClipboard()) { - throw std::system_error(GetLastError(), std::system_category(), "Failed to close the Windows clipboard."); - } -#endif - } -}; -} - -#endif diff --git a/src/gui/query/close_settings_query.h b/src/gui/query/close_settings_query.h deleted file mode 100644 index 876cff7c..00000000 --- a/src/gui/query/close_settings_query.h +++ /dev/null @@ -1,50 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_CLOSE_SETTINGS_QUERY -#define LOOT_GUI_QUERY_CLOSE_SETTINGS_QUERY - -#include "gui/state/loot_state.h" -#include "gui/query/get_installed_games_query.h" - -namespace loot { -class CloseSettingsQuery : public GetInstalledGamesQuery { -public: - CloseSettingsQuery(LootState& state, YAML::Node settings) : - GetInstalledGamesQuery(state), state_(state), settings_(settings) {} - - std::string executeLogic() { - BOOST_LOG_TRIVIAL(trace) << "Settings dialog closed and changes accepted, updating settings object."; - state_.load(settings_); - - return GetInstalledGamesQuery::executeLogic(); - } - -private: - LootState& state_; - YAML::Node settings_; -}; -} - -#endif diff --git a/src/gui/query/copy_content_query.h b/src/gui/query/copy_content_query.h deleted file mode 100644 index ef8bb16a..00000000 --- a/src/gui/query/copy_content_query.h +++ /dev/null @@ -1,60 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_COPY_CONTENT_QUERY -#define LOOT_GUI_QUERY_COPY_CONTENT_QUERY - -#include - -#include "gui/query/clipboard_query.h" - -namespace loot { -class CopyContentQuery : public ClipboardQuery { -public: - CopyContentQuery(const YAML::Node& content) : content_(content) {} - - std::string executeLogic() { - const std::string text = "[spoiler][code]" + getContentAsText() + "[/code][/spoiler]"; - - copyToClipboard(text); - return ""; - } - -private: - std::string getContentAsText() const { - YAML::Emitter out; - out.SetIndent(2); - out << content_; - - std::string text = out.c_str(); - boost::replace_all(text, "! ", ""); - - return text; - } - - const YAML::Node content_; -}; -} - -#endif diff --git a/src/gui/query/copy_load_order_query.h b/src/gui/query/copy_load_order_query.h deleted file mode 100644 index 6ea42af8..00000000 --- a/src/gui/query/copy_load_order_query.h +++ /dev/null @@ -1,74 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_COPY_LOAD_ORDER_QUERY -#define LOOT_GUI_QUERY_COPY_LOAD_ORDER_QUERY - -#include "gui/query/clipboard_query.h" - -namespace loot { -class CopyLoadOrderQuery : public ClipboardQuery { -public: - CopyLoadOrderQuery(LootState& state, const std::vector& plugins) : - state_(state), plugins_(plugins) {} - - std::string executeLogic() { - int numberOfIndexDigits = getNumberOfIndexDigits(); - - size_t activeIndex = 0; - std::stringstream stream; - for (const auto& pluginName : plugins_) { - activeIndex += writePluginLine(stream, pluginName, activeIndex); - } - - copyToClipboard(stream.str()); - return ""; - } - -private: - unsigned short getNumberOfIndexDigits() const { - if (plugins_.size() > 99) - return 3; - else if (plugins_.size() > 9) - return 2; - else - return 1; - } - - size_t writePluginLine(std::ostream& stream, const std::string& plugin, size_t activeIndex) { - if (state_.getCurrentGame().IsPluginActive(plugin)) { - stream << std::setw(getNumberOfIndexDigits()) << activeIndex << " " << std::hex << std::setw(2) << activeIndex << std::dec << " " << plugin << "\r\n"; - return 1; - } - - stream << std::setw(getNumberOfIndexDigits() + 4) << " " << plugin << "\r\n"; - return 0; - } - - LootState& state_; - const std::vector plugins_; -}; -} - -#endif diff --git a/src/gui/query/copy_metadata_query.h b/src/gui/query/copy_metadata_query.h deleted file mode 100644 index 3cb77201..00000000 --- a/src/gui/query/copy_metadata_query.h +++ /dev/null @@ -1,73 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_COPY_METADATA_QUERY -#define LOOT_GUI_QUERY_COPY_METADATA_QUERY - -#include - -#include "gui/query/clipboard_query.h" -#include "loot/yaml/plugin_metadata.h" - -namespace loot { -class CopyMetadataQuery : public ClipboardQuery { -public: - CopyMetadataQuery(LootState& state, const std::string& pluginName) : - state_(state), pluginName_(pluginName) {} - - std::string executeLogic() { - BOOST_LOG_TRIVIAL(debug) << "Copying metadata for plugin " << pluginName_; - - // Get metadata from masterlist and userlist. - PluginMetadata metadata = state_.getCurrentGame().GetMasterlistMetadata(pluginName_); - metadata.MergeMetadata(state_.getCurrentGame().GetUserMetadata(pluginName_)); - - // Generate text representation. - std::string text = "[spoiler][code]" + asText(metadata) + "[/code][/spoiler]"; - - copyToClipboard(text); - - BOOST_LOG_TRIVIAL(info) << "Exported userlist metadata text for \"" << pluginName_ << "\": " << text; - - return ""; - } - -private: - static std::string asText(const PluginMetadata& metadata) { - YAML::Emitter out; - out.SetIndent(2); - out << metadata; - - std::string text = out.c_str(); - boost::replace_all(text, "! ", ""); - - return text; - } - - LootState& state_; - std::string pluginName_; -}; -} - -#endif diff --git a/src/gui/query/discard_unapplied_changes_query.h b/src/gui/query/discard_unapplied_changes_query.h deleted file mode 100644 index dc21e846..00000000 --- a/src/gui/query/discard_unapplied_changes_query.h +++ /dev/null @@ -1,48 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_DISCARD_UNAPPLIED_CHANGES_QUERY -#define LOOT_GUI_QUERY_DISCARD_UNAPPLIED_CHANGES_QUERY - -#include "gui/state/loot_state.h" -#include "gui/query/query.h" - -namespace loot { -class DiscardUnappliedChangesQuery : public Query { -public: - DiscardUnappliedChangesQuery(LootState& state) : state_(state) {} - - std::string executeLogic() { - while (state_.hasUnappliedChanges()) - state_.decrementUnappliedChangeCounter(); - - return ""; - } - -private: - LootState& state_; -}; -} - -#endif diff --git a/src/gui/query/editor_closed_query.h b/src/gui/query/editor_closed_query.h deleted file mode 100644 index 02bdae7c..00000000 --- a/src/gui/query/editor_closed_query.h +++ /dev/null @@ -1,169 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_EDITOR_CLOSED_QUERY -#define LOOT_GUI_QUERY_EDITOR_CLOSED_QUERY - -#include "gui/state/loot_state.h" -#include "gui/query/metadata_query.h" - -namespace loot { -class EditorClosedQuery : public MetadataQuery { -public: - EditorClosedQuery(LootState& state, YAML::Node metadata) : - MetadataQuery(state), - state_(state), metadata_(metadata) {} - - std::string executeLogic() { - try { - const std::string json = applyUserEdits(); - state_.decrementUnappliedChangeCounter(); - - return json; - } catch (YAML::RepresentationException& e) { - throw YAML::RepresentationException(YAML::Mark::null_mark(), e.msg); - } - } - -private: - static PluginMetadata convertMetadata(YAML::Node& newMetadata, PluginMetadata& existingUserMetadata) { - PluginMetadata newUserlistEntry(existingUserMetadata.GetName()); - - // First sort out the priority value. This is only given if it was changed. - BOOST_LOG_TRIVIAL(trace) << "Calculating userlist metadata local priority value from Javascript variables."; - if (newMetadata["priority"]) { - BOOST_LOG_TRIVIAL(trace) << "Local priority value was changed, recalculating..."; - // Priority value was changed, so add it to the userlist data. - newUserlistEntry.SetLocalPriority(Priority(newMetadata["priority"].as())); - } else { - // Priority value wasn't changed, use the existing userlist value. - BOOST_LOG_TRIVIAL(trace) << "Local priority value is unchanged, using existing userlist value (if it exists)."; - newUserlistEntry.SetLocalPriority(existingUserMetadata.GetLocalPriority()); - } - - if (newMetadata["globalPriority"]) { - BOOST_LOG_TRIVIAL(trace) << "Global priority value was changed, recalculating..."; - // Priority value was changed, so add it to the userlist data. - newUserlistEntry.SetGlobalPriority(Priority(newMetadata["globalPriority"].as())); - } else { - BOOST_LOG_TRIVIAL(trace) << "Global priority value is unchanged, using existing userlist value (if it exists)."; - newUserlistEntry.SetGlobalPriority(existingUserMetadata.GetGlobalPriority()); - } - - // Now the enabled flag. - newUserlistEntry.SetEnabled(newMetadata["userlist"]["enabled"].as()); - - // Now metadata lists. These are given in their entirety, so replace anything that - // currently exists. - BOOST_LOG_TRIVIAL(trace) << "Recording metadata lists from Javascript variables."; - if (newMetadata["userlist"]["after"]) - newUserlistEntry.SetLoadAfterFiles(newMetadata["userlist"]["after"].as>()); - if (newMetadata["userlist"]["req"]) - newUserlistEntry.SetRequirements(newMetadata["userlist"]["req"].as>()); - if (newMetadata["userlist"]["inc"]) - newUserlistEntry.SetIncompatibilities(newMetadata["userlist"]["inc"].as>()); - - if (newMetadata["userlist"]["msg"]) - newUserlistEntry.SetMessages(toMessages(newMetadata["userlist"]["msg"].as>())); - if (newMetadata["userlist"]["tag"]) - newUserlistEntry.SetTags(newMetadata["userlist"]["tag"].as>()); - if (newMetadata["userlist"]["dirty"]) - newUserlistEntry.SetDirtyInfo(newMetadata["userlist"]["dirty"].as>()); - if (newMetadata["userlist"]["clean"]) - newUserlistEntry.SetCleanInfo(newMetadata["userlist"]["clean"].as>()); - if (newMetadata["userlist"]["url"]) - newUserlistEntry.SetLocations(newMetadata["userlist"]["url"].as>()); - - return newUserlistEntry; - } - - PluginMetadata getUniqueMetadata(const PluginMetadata& metadata) { - BOOST_LOG_TRIVIAL(trace) << "Removing any user metadata that duplicates masterlist metadata."; - try { - auto plugin = state_.getCurrentGame().GetPlugin(metadata.GetName()); - auto masterlistMetadata = state_.getCurrentGame().GetMasterlistMetadata(metadata.GetName()); - auto nonUserMetadata = getNonUserMetadata(plugin, masterlistMetadata); - return metadata.NewMetadata(nonUserMetadata); - } catch (...) { - return metadata.NewMetadata(state_.getCurrentGame().GetMasterlistMetadata(metadata.GetName())); - } - } - - std::string applyUserEdits() { - if (!metadata_.IsMap()) // No edits to apply. - return "null"; - - const std::string pluginName = metadata_["name"].as(); - - BOOST_LOG_TRIVIAL(trace) << "Applying user edits for: " << pluginName; - - // Find existing userlist entry. - PluginMetadata ulistPlugin = state_.getCurrentGame().GetUserMetadata(pluginName); - - // Create new object for userlist entry. - PluginMetadata newMetadata = getUniqueMetadata(convertMetadata(metadata_, ulistPlugin)); - - // Now erase any existing userlist entry. - if (!ulistPlugin.HasNameOnly()) { - BOOST_LOG_TRIVIAL(trace) << "Erasing the existing userlist entry."; - state_.getCurrentGame().ClearUserMetadata(ulistPlugin.GetName()); - } - - // Add a new userlist entry if necessary. - if (!newMetadata.HasNameOnly()) { - BOOST_LOG_TRIVIAL(trace) << "Adding new metadata to new userlist entry."; - state_.getCurrentGame().AddUserMetadata(newMetadata); - } - - // Save edited userlist. - state_.getCurrentGame().SaveUserMetadata(); - - // Now rederive the derived metadata. - BOOST_LOG_TRIVIAL(trace) << "Returning newly derived display metadata."; - YAML::Node derivedMetadata = generateDerivedMetadata(newMetadata.GetName()); - if (derivedMetadata.size() > 0) - return JSON::stringify(derivedMetadata); - else - return "null"; - } - - static std::vector toMessages(const std::vector& messages) { - std::vector list; - - for (const auto& message : messages) { - list.push_back(Message( - message.type, - {{message.text, message.language}}, - message.condition)); - } - - return list; - } - - LootState& state_; - YAML::Node metadata_; -}; -} - -#endif diff --git a/src/gui/query/editor_opened_query.h b/src/gui/query/editor_opened_query.h deleted file mode 100644 index bb7ee1c7..00000000 --- a/src/gui/query/editor_opened_query.h +++ /dev/null @@ -1,46 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_EDITOR_OPENED_QUERY -#define LOOT_GUI_QUERY_EDITOR_OPENED_QUERY - -#include "gui/state/loot_state.h" -#include "gui/query/query.h" - -namespace loot { -class EditorOpenedQuery : public Query { -public: - EditorOpenedQuery(LootState& state) : state_(state) {} - - std::string executeLogic() { - state_.incrementUnappliedChangeCounter(); - return ""; - } - -private: - LootState& state_; -}; -} - -#endif diff --git a/src/gui/query/get_conflicting_plugins_query.h b/src/gui/query/get_conflicting_plugins_query.h deleted file mode 100644 index e38f4123..00000000 --- a/src/gui/query/get_conflicting_plugins_query.h +++ /dev/null @@ -1,84 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_GET_CONFLICTING_PLUGINS_QUERY -#define LOOT_GUI_QUERY_GET_CONFLICTING_PLUGINS_QUERY - -#include "gui/state/game.h" -#include "gui/query/json.h" -#include "gui/query/metadata_query.h" - -namespace loot { -class GetConflictingPluginsQuery : public MetadataQuery { -public: - GetConflictingPluginsQuery(LootState& state, const std::string& pluginName) : - MetadataQuery(state), - game_(state.getCurrentGame()), - pluginName_(pluginName) {} - - std::string executeLogic() { - BOOST_LOG_TRIVIAL(debug) << "Searching for plugins that conflict with " << pluginName_; - - // Checking for FormID overlap will only work if the plugins have been loaded, so check if - // the plugins have been fully loaded, and if not load all plugins. - if (!game_.ArePluginsFullyLoaded()) - game_.LoadAllInstalledPlugins(false); - - YAML::Node node; - auto plugin = game_.GetPlugin(pluginName_); - for (const auto& otherPlugin : game_.GetPlugins()) { - node.push_back(getConflictMetadata(plugin, otherPlugin)); - } - - if (node.size() > 0) - return JSON::stringify(node); - - return "[]"; - } - -private: - YAML::Node getConflictMetadata(const std::shared_ptr& plugin, - const std::shared_ptr& otherPlugin) { - YAML::Node pluginNode = generateDerivedMetadata(otherPlugin->GetName()); - - pluginNode["name"] = otherPlugin->GetName(); - pluginNode["crc"] = otherPlugin->GetCRC(); - pluginNode["isEmpty"] = otherPlugin->IsEmpty(); - - if (plugin->DoFormIDsOverlap(*otherPlugin)) { - BOOST_LOG_TRIVIAL(debug) << "Found conflicting plugin: " << otherPlugin->GetName(); - pluginNode["conflicts"] = true; - } else { - pluginNode["conflicts"] = false; - } - - return pluginNode; - } - - gui::Game& game_; - const std::string pluginName_; -}; -} - -#endif diff --git a/src/gui/query/get_game_data_query.h b/src/gui/query/get_game_data_query.h deleted file mode 100644 index c40f7ee5..00000000 --- a/src/gui/query/get_game_data_query.h +++ /dev/null @@ -1,154 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_GET_GAME_DATA_QUERY -#define LOOT_GUI_QUERY_GET_GAME_DATA_QUERY - -#include - -#include "loot/loot_version.h" -#include "gui/editor_message.h" -#include "gui/query/json.h" -#include "gui/query/metadata_query.h" -#include "gui/state/loot_state.h" - -namespace loot { -class GetGameDataQuery : public MetadataQuery { -public: - GetGameDataQuery(LootState& state, CefRefPtr frame) : - MetadataQuery(state), - state_(state), - frame_(frame) {} - - std::string executeLogic() { - sendProgressUpdate(frame_, boost::locale::translate("Parsing, merging and evaluating metadata...")); - - /* If the game's plugins object is empty, this is the first time loading - the game data, so also load the metadata lists. */ - bool isFirstLoad = state_.getCurrentGame().GetPlugins().empty(); - - state_.getCurrentGame().LoadAllInstalledPlugins(true); - - if (isFirstLoad) - state_.getCurrentGame().LoadMetadata(); - - //Sort plugins into their load order. - std::vector> installed; - std::vector loadOrder = state_.getCurrentGame().GetLoadOrder(); - for (const auto &pluginName : loadOrder) { - try { - const auto plugin = state_.getCurrentGame().GetPlugin(pluginName); - installed.push_back(plugin); - } catch (...) {} - } - - return generateJsonResponse(installed); - } - -private: - static std::vector toEditorMessages(const std::vector& messages, const LanguageCode language) { - std::vector list; - - for (const auto& message : messages) { - list.push_back(EditorMessage(message, language)); - } - - return list; - } - - static YAML::Node convertPluginMetadata(const PluginMetadata& metadata, const LanguageCode language) { - YAML::Node node; - - node["enabled"] = metadata.IsEnabled(); - node["priority"] = metadata.GetLocalPriority().GetValue(); - node["globalPriority"] = metadata.GetGlobalPriority().GetValue(); - node["after"] = metadata.GetLoadAfterFiles(); - node["req"] = metadata.GetRequirements(); - node["inc"] = metadata.GetIncompatibilities(); - node["msg"] = toEditorMessages(metadata.GetMessages(), language); - node["tag"] = metadata.GetTags(); - node["dirty"] = metadata.GetDirtyInfo(); - node["clean"] = metadata.GetCleanInfo(); - node["url"] = metadata.GetLocations(); - - return node; - } - - YAML::Node generateDerivedMetadata(const std::shared_ptr& plugin) { - YAML::Node pluginNode; - - pluginNode["__type"] = "Plugin"; // For conversion back into a JS typed object. - pluginNode["name"] = plugin->GetName(); - pluginNode["isActive"] = state_.getCurrentGame().IsPluginActive(plugin->GetName()); - pluginNode["isEmpty"] = plugin->IsEmpty(); - pluginNode["isMaster"] = plugin->IsMaster(); - pluginNode["loadsArchive"] = plugin->LoadsArchive(); - pluginNode["crc"] = plugin->GetCRC(); - pluginNode["version"] = plugin->GetVersion(); - - BOOST_LOG_TRIVIAL(trace) << "Getting masterlist metadata for: " << plugin->GetName(); - auto masterlistMetadata = state_.getCurrentGame().GetMasterlistMetadata(plugin->GetName()); - if (!masterlistMetadata.HasNameOnly()) - pluginNode["masterlist"] = convertPluginMetadata(masterlistMetadata, state_.getLanguage().GetCode()); - - BOOST_LOG_TRIVIAL(trace) << "Getting userlist metadata for: " << plugin->GetName(); - auto userlistMetadata = state_.getCurrentGame().GetUserMetadata(plugin->GetName()); - if (!userlistMetadata.HasNameOnly()) - pluginNode["userlist"] = convertPluginMetadata(userlistMetadata, state_.getLanguage().GetCode()); - - // Now merge masterlist and userlist metadata and evaluate, - // putting any resulting metadata into the base of the pluginNode. - YAML::Node derivedNode = MetadataQuery::generateDerivedMetadata(plugin->GetName()); - - for (auto it = derivedNode.begin(); it != derivedNode.end(); ++it) { - const std::string key = it->first.as(); - pluginNode[key] = it->second; - } - - return pluginNode; - } - - std::string generateJsonResponse(const std::vector>& plugins) { - YAML::Node gameNode; - - // ID the game using its folder value. - gameNode["folder"] = state_.getCurrentGame().FolderName(); - gameNode["masterlist"] = getMasterlistInfo(); - gameNode["globalMessages"] = getGeneralMessages(); - gameNode["bashTags"] = state_.getCurrentGame().GetKnownBashTags(); - - // Now store plugin data. - for (const auto& plugin : plugins) { - gameNode["plugins"].push_back(generateDerivedMetadata(plugin)); - } - - return JSON::stringify(gameNode); - } - - LootState& state_; - CefRefPtr frame_; -}; -} - -#endif diff --git a/src/gui/query/get_game_types_query.h b/src/gui/query/get_game_types_query.h deleted file mode 100644 index 8ab8adaf..00000000 --- a/src/gui/query/get_game_types_query.h +++ /dev/null @@ -1,56 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_GET_GAME_TYPES_QUERY -#define LOOT_GUI_QUERY_GET_GAME_TYPES_QUERY - -#include "gui/state/game_settings.h" -#include "gui/query/json.h" -#include "gui/query/query.h" - -namespace loot { -class GetGameTypesQuery : public Query { -public: - std::string executeLogic() { - BOOST_LOG_TRIVIAL(info) << "Getting LOOT's supported game types."; - return getGameTypesAsJson(); - } - -private: - static std::string getGameTypesAsJson() { - YAML::Node temp; - - temp.push_back(GameSettings(GameType::tes4).FolderName()); - temp.push_back(GameSettings(GameType::tes5).FolderName()); - temp.push_back(GameSettings(GameType::tes5se).FolderName()); - temp.push_back(GameSettings(GameType::fo3).FolderName()); - temp.push_back(GameSettings(GameType::fonv).FolderName()); - temp.push_back(GameSettings(GameType::fo4).FolderName()); - - return JSON::stringify(temp); - } -}; -} - -#endif diff --git a/src/gui/query/get_init_errors_query.h b/src/gui/query/get_init_errors_query.h deleted file mode 100644 index 74d9fe01..00000000 --- a/src/gui/query/get_init_errors_query.h +++ /dev/null @@ -1,46 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_GET_INIT_ERRORS_QUERY -#define LOOT_GUI_QUERY_GET_INIT_ERRORS_QUERY - -#include "gui/state/loot_state.h" -#include "gui/query/json.h" -#include "gui/query/query.h" - -namespace loot { -class GetInitErrorsQuery : public Query { -public: - GetInitErrorsQuery(LootState& state) : state_(state) {} - - std::string executeLogic() { - return JSON::stringify(YAML::Node(state_.getInitErrors())); - } - -private: - LootState& state_; -}; -} - -#endif diff --git a/src/gui/query/get_installed_games_query.h b/src/gui/query/get_installed_games_query.h deleted file mode 100644 index 4123cbfb..00000000 --- a/src/gui/query/get_installed_games_query.h +++ /dev/null @@ -1,55 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_GET_INSTALLED_GAMES_QUERY -#define LOOT_GUI_QUERY_GET_INSTALLED_GAMES_QUERY - -#include "gui/state/loot_state.h" -#include "gui/query/json.h" -#include "gui/query/query.h" - -namespace loot { -class GetInstalledGamesQuery : public Query { -public: - GetInstalledGamesQuery(LootState& state) : state_(state) {} - - std::string executeLogic() { - BOOST_LOG_TRIVIAL(info) << "Getting LOOT's detected games."; - return getInstalledGamesAsJson(); - } - -private: - std::string getInstalledGamesAsJson() const { - YAML::Node temp = YAML::Node(state_.getInstalledGames()); - if (temp.size() > 0) - return JSON::stringify(temp); - else - return "[]"; - } - - LootState& state_; -}; -} - -#endif diff --git a/src/gui/query/get_languages_query.h b/src/gui/query/get_languages_query.h deleted file mode 100644 index ac5460ab..00000000 --- a/src/gui/query/get_languages_query.h +++ /dev/null @@ -1,56 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_GET_LANGUAGES_QUERY -#define LOOT_GUI_QUERY_GET_LANGUAGES_QUERY - -#include "gui/query/json.h" -#include "loot/language.h" -#include "gui/query/query.h" - -namespace loot { -class GetLanguagesQuery : public Query { -public: - std::string executeLogic() { - BOOST_LOG_TRIVIAL(info) << "Getting LOOT's supported languages."; - return getLanguagesAsJson(); - } - -private: - static std::string getLanguagesAsJson() { - YAML::Node temp; - for (const auto& code : Language::codes) { - YAML::Node lang; - Language language(code); - lang["name"] = language.GetName(); - lang["locale"] = language.GetLocale(); - temp.push_back(lang); - } - - return JSON::stringify(temp); - } -}; -} - -#endif diff --git a/src/gui/query/get_settings_query.h b/src/gui/query/get_settings_query.h deleted file mode 100644 index 3bfe60b7..00000000 --- a/src/gui/query/get_settings_query.h +++ /dev/null @@ -1,47 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_GET_SETTINGS_QUERY -#define LOOT_GUI_QUERY_GET_SETTINGS_QUERY - -#include "gui/state/loot_settings.h" -#include "gui/query/json.h" -#include "gui/query/query.h" - -namespace loot { -class GetSettingsQuery : public Query { -public: - GetSettingsQuery(LootSettings& settings) : settings_(settings) {} - - std::string executeLogic() { - BOOST_LOG_TRIVIAL(info) << "Getting LOOT settings."; - return JSON::stringify(settings_.toYaml()); - } - -private: - const LootSettings& settings_; -}; -} - -#endif diff --git a/src/gui/query/get_version_query.h b/src/gui/query/get_version_query.h deleted file mode 100644 index aa2acbe6..00000000 --- a/src/gui/query/get_version_query.h +++ /dev/null @@ -1,45 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_GET_VERSION_QUERY -#define LOOT_GUI_QUERY_GET_VERSION_QUERY - -#include "gui/query/query.h" -#include "loot/loot_version.h" -#include "gui/query/json.h" - -namespace loot { -class GetVersionQuery : public Query { -public: - std::string executeLogic() { - BOOST_LOG_TRIVIAL(info) << "Getting LOOT version."; - YAML::Node node; - node["release"] = LootVersion::string(); - node["build"] = LootVersion::revision; - return JSON::stringify(node); - } -}; -} - -#endif diff --git a/src/gui/query/json.h b/src/gui/query/json.h deleted file mode 100644 index 68a89656..00000000 --- a/src/gui/query/json.h +++ /dev/null @@ -1,72 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_JSON -#define LOOT_GUI_QUERY_JSON - -#include - -#include -#include - -namespace loot { -namespace JSON { -YAML::Node parse(const std::string& json) { - return YAML::Load(json); -} - -std::string stringify(const YAML::Node& yaml) { - YAML::Emitter out; - out.SetOutputCharset(YAML::EscapeNonAscii); - out.SetStringFormat(YAML::DoubleQuoted); - out.SetBoolFormat(YAML::TrueFalseBool); - out.SetSeqFormat(YAML::Flow); - out.SetMapFormat(YAML::Flow); - - out << yaml; - - // yaml-cpp produces `!` artifacts in its output, so remove them. - std::string json = out.c_str(); - boost::replace_all(json, "! ", ""); - // There's also a bit of weirdness where there are some \x escapes and some \u escapes. - // They should all be \u, so transform them. - boost::replace_all(json, "\\x", "\\u00"); - // yaml-cpp also emits booleans as "true" and "false" strings, whereas JSON expects the same unquoted basic values. The same happens for null and numbers. - boost::replace_all(json, "\": \"true\"", "\": true"); - boost::replace_all(json, "\": \"false\"", "\": false"); - boost::replace_all(json, "\": \"null\"", "\": null"); - boost::replace_all(json, "\": ~", "\": null"); - - // Using the definition at . - // Version numbers and revision IDs should be kept as strings though. - std::regex numbers("\"(?!version|revision)([^\"]+)\": \"(-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)\"", std::regex::ECMAScript); - - json = std::regex_replace(json, numbers, "\"$1\": $2"); - - return json; -} -} -} - -#endif diff --git a/src/gui/query/metadata_query.h b/src/gui/query/metadata_query.h deleted file mode 100644 index 36bbb80a..00000000 --- a/src/gui/query/metadata_query.h +++ /dev/null @@ -1,179 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_METADATA_QUERY -#define LOOT_GUI_QUERY_METADATA_QUERY - -#include -#include -#include -#include - -#include "gui/query/query.h" -#include "loot/exception/file_access_error.h" -#include "loot/exception/git_state_error.h" - -namespace loot { -class MetadataQuery : public Query { -protected: - MetadataQuery(LootState& state) : state_(state) {} - - std::vector getGeneralMessages() { - std::vector messages = state_.getCurrentGame().GetMessages(); - - return toSimpleMessages(messages, state_.getLanguage().GetCode()); - } - - PluginMetadata getNonUserMetadata(const std::shared_ptr& file, - const PluginMetadata& masterlistEntry) { - auto metadata = masterlistEntry; - - auto fileTags = file->GetBashTags(); - auto tags = metadata.GetTags(); - tags.insert(begin(fileTags), end(fileTags)); - metadata.SetTags(tags); - - auto messages = metadata.GetMessages(); - auto statusMessages = file->GetStatusMessages(); - auto validityMessages = state_.getCurrentGame().CheckInstallValidity(file, metadata); - messages.insert(end(messages), begin(statusMessages), end(statusMessages)); - messages.insert(end(messages), begin(validityMessages), end(validityMessages)); - metadata.SetMessages(messages); - - return metadata; - } - - YAML::Node generateDerivedMetadata(const std::string& pluginName) { - // Now rederive the displayed metadata from the masterlist and userlist. - std::shared_ptr plugin = nullptr; - try { - plugin = state_.getCurrentGame().GetPlugin(pluginName); - } catch (...) { - return YAML::Node(); - } - - PluginMetadata master(pluginName); - try { - master = state_.getCurrentGame().GetMasterlistMetadata(pluginName, true); - } catch (std::exception& e) { - BOOST_LOG_TRIVIAL(error) << "\"" << pluginName << "\"'s masterlist metadata contains a condition that could not be evaluated. Details: " << e.what(); - master.SetMessages({ - Message(MessageType::error, (boost::format(boost::locale::translate("\"%1%\" contains a condition that could not be evaluated. Details: %2%")) % pluginName % e.what()).str()), - }); - } - - PluginMetadata user(pluginName); - try { - user = state_.getCurrentGame().GetUserMetadata(pluginName, true); - } catch (std::exception& e) { - BOOST_LOG_TRIVIAL(error) << "\"" << pluginName << "\"'s user metadata contains a condition that could not be evaluated. Details: " << e.what(); - user.SetMessages({ - Message(MessageType::error, (boost::format(boost::locale::translate("\"%1%\" contains a condition that could not be evaluated. Details: %2%")) % pluginName % e.what()).str()), - }); - } - - return generateDerivedMetadata(plugin, master, user); - } - - YAML::Node getMasterlistInfo() { - using boost::locale::translate; - - YAML::Node masterlistNode; - try { - MasterlistInfo info = state_.getCurrentGame().GetMasterlistInfo(); - addSuffixIfModified(info); - - masterlistNode["revision"] = info.revision_id; - masterlistNode["date"] = info.revision_date; - } catch (FileAccessError &) { - BOOST_LOG_TRIVIAL(warning) << "No masterlist present at " << state_.getCurrentGame().MasterlistPath(); - masterlistNode["revision"] = translate("N/A: No masterlist present").str(); - masterlistNode["date"] = translate("N/A: No masterlist present").str(); - } catch (GitStateError &) { - BOOST_LOG_TRIVIAL(warning) << "Not a Git repository: " << state_.getCurrentGame().MasterlistPath().parent_path(); - masterlistNode["revision"] = translate("Unknown: Git repository missing").str(); - masterlistNode["date"] = translate("Unknown: Git repository missing").str(); - } - - return masterlistNode; - } - -private: - static std::vector toSimpleMessages(const std::vector& messages, - LanguageCode language) { - BOOST_LOG_TRIVIAL(info) << "Using message language: " << Language(language).GetName(); - std::vector simpleMessages(messages.size()); - std::transform(begin(messages), - end(messages), - begin(simpleMessages), - [&](const Message& message) { - return message.ToSimpleMessage(language); - }); - - return simpleMessages; - } - - YAML::Node generateDerivedMetadata(const std::shared_ptr& file, - const PluginMetadata& masterlistEntry, - const PluginMetadata& userlistEntry) { - auto metadata = getNonUserMetadata(file, masterlistEntry); - metadata.MergeMetadata(userlistEntry); - - return toYaml(file, metadata); - } - - YAML::Node toYaml(const std::shared_ptr& plugin, - const PluginMetadata& metadata) { - BOOST_LOG_TRIVIAL(info) << "Using message language: " << state_.getLanguage().GetName(); - - YAML::Node pluginNode; - pluginNode["name"] = plugin->GetName(); - pluginNode["priority"] = metadata.GetLocalPriority().GetValue(); - pluginNode["globalPriority"] = metadata.GetGlobalPriority().GetValue(); - pluginNode["messages"] = metadata.GetSimpleMessages(state_.getLanguage().GetCode()); - pluginNode["tags"] = metadata.GetTags(); - pluginNode["isDirty"] = !metadata.GetDirtyInfo().empty(); - pluginNode["loadOrderIndex"] = state_.getCurrentGame().GetActiveLoadOrderIndex(plugin->GetName()); - - if (!metadata.GetCleanInfo().empty()) { - pluginNode["cleanedWith"] = metadata.GetCleanInfo().begin()->GetCleaningUtility(); - } else { - pluginNode["cleanedWith"] = ""; - } - - return pluginNode; - } - - void addSuffixIfModified(MasterlistInfo& info) { - if (info.is_modified) { - info.revision_date += " " + boost::locale::translate("(edited)").str(); - info.revision_id += " " + boost::locale::translate("(edited)").str(); - } - } - - LootState& state_; -}; -} - -#endif diff --git a/src/gui/query/open_log_location_query.h b/src/gui/query/open_log_location_query.h deleted file mode 100644 index 37aba823..00000000 --- a/src/gui/query/open_log_location_query.h +++ /dev/null @@ -1,44 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_OPEN_LOG_LOCATION_QUERY -#define LOOT_GUI_QUERY_OPEN_LOG_LOCATION_QUERY - -#include "gui/state/loot_paths.h" -#include "gui/helpers.h" -#include "gui/query/query.h" - -namespace loot { -class OpenLogLocationQuery : public Query { -public: - std::string executeLogic() { - BOOST_LOG_TRIVIAL(info) << "Opening LOOT local appdata folder."; - OpenInDefaultApplication(LootPaths::getLogPath().parent_path()); - - return ""; - } -}; -} - -#endif diff --git a/src/gui/query/open_readme_query.h b/src/gui/query/open_readme_query.h deleted file mode 100644 index a7584642..00000000 --- a/src/gui/query/open_readme_query.h +++ /dev/null @@ -1,44 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_OPEN_README_QUERY -#define LOOT_GUI_QUERY_OPEN_README_QUERY - -#include "gui/state/loot_paths.h" -#include "gui/helpers.h" -#include "gui/query/query.h" - -namespace loot { -class OpenReadmeQuery : public Query { -public: - std::string executeLogic() { - BOOST_LOG_TRIVIAL(info) << "Opening LOOT readme."; - OpenInDefaultApplication(LootPaths::getReadmePath()); - - return ""; - } -}; -} - -#endif diff --git a/src/gui/query/query.h b/src/gui/query/query.h deleted file mode 100644 index 5eede221..00000000 --- a/src/gui/query/query.h +++ /dev/null @@ -1,57 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_QUERY -#define LOOT_GUI_QUERY_QUERY - -#include -#include -#include - -namespace loot { -class Query : public CefBase { -public: - void execute(CefRefPtr callback) { - try { - callback->Success(executeLogic()); - } catch (std::exception &e) { - BOOST_LOG_TRIVIAL(error) << e.what(); - callback->Failure(-1, boost::locale::translate("Oh no, something went wrong! You can check your LOOTDebugLog.txt (you can get to it through the main menu) for more information.").str()); - } - } - -protected: - virtual std::string executeLogic() = 0; - - void sendProgressUpdate(CefRefPtr frame, const std::string& message) { - BOOST_LOG_TRIVIAL(trace) << "Sending progress update: " << message; - frame->ExecuteJavaScript("loot.Dialog.showProgress('" + message + "');", frame->GetURL(), 0); - } - -private: - IMPLEMENT_REFCOUNTING(Query); -}; -} - -#endif diff --git a/src/gui/query/redate_plugins_query.h b/src/gui/query/redate_plugins_query.h deleted file mode 100644 index 731356e6..00000000 --- a/src/gui/query/redate_plugins_query.h +++ /dev/null @@ -1,46 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_REDATE_PLUGINS_QUERY -#define LOOT_GUI_QUERY_REDATE_PLUGINS_QUERY - -#include "gui/state/loot_state.h" -#include "gui/query/query.h" - -namespace loot { -class RedatePluginsQuery : public Query { -public: - RedatePluginsQuery(LootState& state) : state_(state) {} - - std::string executeLogic() { - state_.getCurrentGame().RedatePlugins(); - return ""; - } - -private: - LootState& state_; -}; -} - -#endif diff --git a/src/gui/query/save_filter_state_query.h b/src/gui/query/save_filter_state_query.h deleted file mode 100644 index 6cd344c4..00000000 --- a/src/gui/query/save_filter_state_query.h +++ /dev/null @@ -1,54 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_SAVE_FILTER_STATE_QUERY -#define LOOT_GUI_QUERY_SAVE_FILTER_STATE_QUERY - -#include - -#include "gui/state/loot_state.h" -#include "gui/query/query.h" - -namespace loot { -class SaveFilterStateQuery : public Query { -public: - SaveFilterStateQuery(LootState& state, - const std::string& filterId, - bool enabled) : - state_(state), filterId_(filterId), enabled_(enabled) {} - - std::string executeLogic() { - BOOST_LOG_TRIVIAL(trace) << "Saving filter states."; - state_.storeFilterState(filterId_, enabled_); - return ""; - } - -private: - LootState& state_; - std::string filterId_; - bool enabled_; -}; -} - -#endif diff --git a/src/gui/query/sort_plugins_query.h b/src/gui/query/sort_plugins_query.h deleted file mode 100644 index f3aef618..00000000 --- a/src/gui/query/sort_plugins_query.h +++ /dev/null @@ -1,110 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_SORT_PLUGINS_QUERY -#define LOOT_GUI_QUERY_SORT_PLUGINS_QUERY - -#include -#include - -#include "gui/state/loot_state.h" -#include "gui/query/json.h" -#include "loot/exception/cyclic_interaction_error.h" -#include "gui/query/metadata_query.h" - -namespace loot { -class SortPluginsQuery : public MetadataQuery { -public: - SortPluginsQuery(LootState& state, CefRefPtr frame) : - MetadataQuery(state), - state_(state), - frame_(frame) {} - - std::string executeLogic() { - BOOST_LOG_TRIVIAL(info) << "Beginning sorting operation."; - - //Sort plugins into their load order. - sendProgressUpdate(frame_, boost::locale::translate("Sorting load order...")); - std::vector plugins = state_.getCurrentGame().SortPlugins(); - - if ((state_.getCurrentGame().Type() == GameType::tes5 - || state_.getCurrentGame().Type() == GameType::fo4 - || state_.getCurrentGame().Type() == GameType::tes5se)) - applyUnchangedLoadOrder(plugins); - - std::string json = generateJsonResponse(plugins); - - // plugins will be empty if there was a sorting error. - if (!plugins.empty()) - state_.incrementUnappliedChangeCounter(); - - return json; - } - -private: - void applyUnchangedLoadOrder(const std::vector& plugins) { - if (plugins.empty() || !equal(begin(plugins), end(plugins), begin(state_.getCurrentGame().GetLoadOrder()))) - return; - - // Load order has not been changed, set it without asking for user input - // because there are no changes to accept and some plugins' positions - // may only be inferred and not written to loadorder.txt/plugins.txt. - state_.getCurrentGame().SetLoadOrder(plugins); - } - - YAML::Node generateDerivedMetadata(const std::shared_ptr& plugin, - const std::vector& loadOrder) { - YAML::Node pluginNode = MetadataQuery::generateDerivedMetadata(plugin->GetName()); - - pluginNode["name"] = plugin->GetName(); - pluginNode["crc"] = plugin->GetCRC(); - pluginNode["isEmpty"] = plugin->IsEmpty(); - pluginNode["loadOrderIndex"] = state_.getCurrentGame().GetActiveLoadOrderIndex(plugin->GetName(), loadOrder); - - return pluginNode; - } - - std::string generateJsonResponse(const std::vector& plugins) { - YAML::Node node; - - // Store global messages in case they have changed. - node["globalMessages"] = getGeneralMessages(); - - for (const auto &pluginName : plugins) { - auto plugin = state_.getCurrentGame().GetPlugin(pluginName); - node["plugins"].push_back(generateDerivedMetadata(plugin, plugins)); - } - - if (node.size() > 0) - return JSON::stringify(node); - else - return "null"; - } - - LootState& state_; - CefRefPtr frame_; -}; -} - -#endif diff --git a/src/gui/query/update_masterlist_query.h b/src/gui/query/update_masterlist_query.h deleted file mode 100644 index 01bb2048..00000000 --- a/src/gui/query/update_masterlist_query.h +++ /dev/null @@ -1,112 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_QUERY_UPDATE_MASTERLIST_QUERY -#define LOOT_GUI_QUERY_UPDATE_MASTERLIST_QUERY - -#include "gui/state/game.h" -#include "gui/query/json.h" -#include "gui/query/metadata_query.h" - -namespace loot { -class UpdateMasterlistQuery : public MetadataQuery { -public: - UpdateMasterlistQuery(LootState& state) : - MetadataQuery(state), - game_(state.getCurrentGame()) {} - - std::string executeLogic() { - BOOST_LOG_TRIVIAL(debug) << "Updating and parsing masterlist."; - - if (!updateMasterlist()) - return "null"; - - // Now regenerate the JS-side masterlist data if the masterlist was changed. - return generateJsonResponse(); - } - -private: - bool updateMasterlist() { - try { - return game_.UpdateMasterlist(); - } catch (std::exception&) { - try { - game_.LoadMetadata(); - } catch (...) {} - throw; - } - } - - std::string generateJsonResponse() { - YAML::Node gameMetadata; - gameMetadata["masterlist"] = getMasterlistInfo(); - - // Store bash tags in case they have changed. - gameMetadata["bashTags"] = game_.GetKnownBashTags(); - - // Store global messages in case they have changed. - gameMetadata["globalMessages"] = getGeneralMessages(); - - for (const auto& plugin : game_.GetPlugins()) { - gameMetadata["plugins"].push_back(generateDerivedMetadata(plugin)); - } - - return JSON::stringify(gameMetadata); - } - - YAML::Node generateDerivedMetadata(const std::shared_ptr& plugin) { - YAML::Node pluginNode; - - auto masterlistMetadata = game_.GetMasterlistMetadata(plugin->GetName()); - auto metadata = getNonUserMetadata(plugin, masterlistMetadata); - - if (!metadata.HasNameOnly()) { - // Now add the masterlist metadata to the pluginNode. - pluginNode["masterlist"]["after"] = metadata.GetLoadAfterFiles(); - pluginNode["masterlist"]["req"] = metadata.GetRequirements(); - pluginNode["masterlist"]["inc"] = metadata.GetIncompatibilities(); - pluginNode["masterlist"]["msg"] = metadata.GetMessages(); - pluginNode["masterlist"]["tag"] = metadata.GetTags(); - pluginNode["masterlist"]["dirty"] = metadata.GetDirtyInfo(); - pluginNode["masterlist"]["clean"] = metadata.GetCleanInfo(); - pluginNode["masterlist"]["url"] = metadata.GetLocations(); - } - - // Now merge masterlist and userlist metadata and evaluate, - // putting any resulting metadata into the base of the pluginNode. - YAML::Node derivedNode = MetadataQuery::generateDerivedMetadata(plugin->GetName()); - - for (const auto &pair : derivedNode) { - const std::string key = pair.first.as(); - pluginNode[key] = pair.second; - } - - return pluginNode; - } - - gui::Game& game_; -}; -} - -#endif diff --git a/src/gui/query_handler.cpp b/src/gui/query_handler.cpp deleted file mode 100644 index 2fd8f446..00000000 --- a/src/gui/query_handler.cpp +++ /dev/null @@ -1,174 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2014-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#include "query_handler.h" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "gui/editor_message.h" -#include "gui/loot_app.h" -#include "gui/loot_handler.h" -#include "gui/query/json.h" -#include "gui/query/apply_sort_query.h" -#include "gui/query/cancel_find_query.h" -#include "gui/query/cancel_sort_query.h" -#include "gui/query/change_game_query.h" -#include "gui/query/clear_all_metadata_query.h" -#include "gui/query/clear_plugin_metadata_query.h" -#include "gui/query/close_settings_query.h" -#include "gui/query/copy_content_query.h" -#include "gui/query/copy_load_order_query.h" -#include "gui/query/copy_metadata_query.h" -#include "gui/query/discard_unapplied_changes_query.h" -#include "gui/query/editor_opened_query.h" -#include "gui/query/editor_closed_query.h" -#include "gui/query/get_conflicting_plugins_query.h" -#include "gui/query/get_game_data_query.h" -#include "gui/query/get_game_types_query.h" -#include "gui/query/get_init_errors_query.h" -#include "gui/query/get_installed_games_query.h" -#include "gui/query/get_languages_query.h" -#include "gui/query/get_settings_query.h" -#include "gui/query/get_version_query.h" -#include "gui/query/open_log_location_query.h" -#include "gui/query/open_readme_query.h" -#include "gui/query/redate_plugins_query.h" -#include "gui/query/save_filter_state_query.h" -#include "gui/query/sort_plugins_query.h" -#include "gui/query/update_masterlist_query.h" -#include "gui/yaml_simple_message_helpers.h" - - -using boost::filesystem::exists; -using boost::format; -using boost::locale::translate; -using std::exception; -using std::list; -using std::set; -using std::string; -using std::vector; - -namespace loot { -QueryHandler::QueryHandler(LootState& lootState) : lootState_(lootState) {} - -// Called due to cefQuery execution in binding.html. -bool QueryHandler::OnQuery(CefRefPtr browser, - CefRefPtr frame, - int64 query_id, - const CefString& request, - bool persistent, - CefRefPtr callback) { - YAML::Node parsedRequest; - try { - parsedRequest = JSON::parse(request.ToString()); - } catch (exception &e) { - BOOST_LOG_TRIVIAL(error) << "Failed to parse CEF query request \"" << request.ToString() << "\": " << e.what(); - callback->Failure(-1, e.what()); - return true; - } - - auto query = createQuery(browser, frame, parsedRequest); - - if (!query) - return false; - - CefPostTask(TID_FILE, base::Bind(&Query::execute, query, callback)); - - return true; -} - -CefRefPtr QueryHandler::createQuery(CefRefPtr browser, - CefRefPtr frame, - const YAML::Node& request) { - const string name = request["name"].as(); - - if (name == "applySort") - return new ApplySortQuery(lootState_, request["args"][0].as>()); - else if (name == "cancelFind") - return new CancelFindQuery(browser); - else if (name == "cancelSort") - return new CancelSortQuery(lootState_); - else if (name == "changeGame") - return new ChangeGameQuery(lootState_, frame, request["args"][0].as()); - else if (name == "clearAllMetadata") - return new ClearAllMetadataQuery(lootState_); - else if (name == "clearPluginMetadata") - return new ClearPluginMetadataQuery(lootState_, request["args"][0].as()); - else if (name == "closeSettings") - return new CloseSettingsQuery(lootState_, request["args"][0]); - else if (name == "copyContent") - return new CopyContentQuery(request["args"][0]); - else if (name == "copyLoadOrder") - return new CopyLoadOrderQuery(lootState_, request["args"][0].as>()); - else if (name == "copyMetadata") - return new CopyMetadataQuery(lootState_, request["args"][0].as()); - else if (name == "discardUnappliedChanges") - return new DiscardUnappliedChangesQuery(lootState_); - else if (name == "editorClosed") - return new EditorClosedQuery(lootState_, request["args"][0]); - else if (name == "editorOpened") - return new EditorOpenedQuery(lootState_); - else if (name == "getConflictingPlugins") - return new GetConflictingPluginsQuery(lootState_, request["args"][0].as()); - else if (name == "getGameTypes") - return new GetGameTypesQuery(); - else if (name == "getGameData") - return new GetGameDataQuery(lootState_, frame); - else if (name == "getInitErrors") - return new GetInitErrorsQuery(lootState_); - else if (name == "getInstalledGames") - return new GetInstalledGamesQuery(lootState_); - else if (name == "getLanguages") - return new GetLanguagesQuery(); - else if (name == "getSettings") - return new GetSettingsQuery(lootState_); - else if (name == "getVersion") - return new GetVersionQuery(); - else if (name == "openLogLocation") - return new OpenLogLocationQuery(); - else if (name == "openReadme") - return new OpenReadmeQuery(); - else if (name == "redatePlugins") - return new RedatePluginsQuery(lootState_); - else if (name == "saveFilterState") - return new SaveFilterStateQuery(lootState_, request["args"][0].as(), request["args"][1].as()); - else if (name == "sortPlugins") - return new SortPluginsQuery(lootState_, frame); - else if (name == "updateMasterlist") - return new UpdateMasterlistQuery(lootState_); - - return nullptr; -} -} diff --git a/src/gui/query_handler.h b/src/gui/query_handler.h deleted file mode 100644 index 3f539a71..00000000 --- a/src/gui/query_handler.h +++ /dev/null @@ -1,55 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2014-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#ifndef LOOT_GUI_QUERY_HANDLER -#define LOOT_GUI_QUERY_HANDLER - -#include -#include - -#include "gui/state/loot_state.h" -#include "gui/query/query.h" - -namespace loot { -class QueryHandler : public CefMessageRouterBrowserSide::Handler { -public: - QueryHandler(LootState& lootState); - - // Called due to cefQuery execution in binding.html. - virtual bool OnQuery(CefRefPtr browser, - CefRefPtr frame, - int64 query_id, - const CefString& request, - bool persistent, - CefRefPtr callback) OVERRIDE; -private: - CefRefPtr createQuery(CefRefPtr browser, - CefRefPtr frame, - const YAML::Node& request); - - LootState& lootState_; -}; -} - -#endif diff --git a/src/gui/resource.h b/src/gui/resource.h deleted file mode 100644 index 85165f6e..00000000 --- a/src/gui/resource.h +++ /dev/null @@ -1,34 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef __LOOT_GUI_RESOURCE__ -#define __LOOT_GUI_RESOURCE__ - -#ifdef _WIN32 -#include - -#define MAINICON 101 -#endif - -#endif diff --git a/src/gui/resource.rc b/src/gui/resource.rc deleted file mode 100644 index deefcef4..00000000 --- a/src/gui/resource.rc +++ /dev/null @@ -1,22 +0,0 @@ -#include "gui/resource.h" -1 VERSIONINFO -FILEVERSION 0, 10, 3, 0 -PRODUCTVERSION 0, 10, 3, 0 -FILEOS VOS__WINDOWS32 -FILETYPE VFT_APP -BEGIN -BLOCK "StringFileInfo" -BEGIN -BLOCK "040904b0" -BEGIN -VALUE "FileVersion", "0.10.3" -VALUE "LegalCopyright", "Copyright (C) 2013-2016 WrinklyNinja" -VALUE "ProductVersion", "0.10.3" -END -END -BLOCK "VarFileInfo" -BEGIN -VALUE "Translation", 0x409, 1200 -END -END -MAINICON ICON "../build/icon/icon.ico" diff --git a/src/gui/state/game.cpp b/src/gui/state/game.cpp deleted file mode 100644 index f1d6f5fe..00000000 --- a/src/gui/state/game.cpp +++ /dev/null @@ -1,499 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2012-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#include "gui/state/game.h" - -#include -#include -#include - -#include -#include -#include -#include - -#include "gui/state/game_detection_error.h" -#include "loot/exception/file_access_error.h" -#include "loot/windows_encoding_converters.h" - -#ifdef _WIN32 -# ifndef UNICODE -# define UNICODE -# endif -# ifndef _UNICODE -# define _UNICODE -# endif -# define NOMINMAX -# include "windows.h" -# include "shlobj.h" -# include "shlwapi.h" -#endif - -using std::list; -using std::lock_guard; -using std::mutex; -using std::string; -using std::thread; -using std::vector; - -namespace fs = boost::filesystem; - -namespace loot { -namespace gui { -Game::Game(const GameSettings& gameSettings, - const boost::filesystem::path& lootDataPath, - const boost::filesystem::path& localDataPath) : - GameSettings(gameSettings), - lootDataPath_(lootDataPath), - pluginsFullyLoaded_(false), - loadOrderSortCount_(0) { - SetGamePath(DetectGamePath(*this)); - - if (GamePath().empty()) { - throw GameDetectionError("Game path could not be detected."); - } - - gameHandle_ = CreateGameHandle(Type(), GamePath().string(), localDataPath.string()); - gameHandle_->IdentifyMainMasterFile(Master()); -} - -Game::Game(const Game& game) : - GameSettings(game), - lootDataPath_(game.lootDataPath_), - gameHandle_(game.gameHandle_), - pluginsFullyLoaded_(game.pluginsFullyLoaded_), - messages_(game.messages_), - loadOrderSortCount_(0) {} - -Game& Game::operator=(const Game& game) { - if (&game != this) { - GameSettings::operator=(game); - - lootDataPath_ = game.lootDataPath_; - gameHandle_ = game.gameHandle_; - pluginsFullyLoaded_ = game.pluginsFullyLoaded_; - messages_ = game.messages_; - loadOrderSortCount_ = game.loadOrderSortCount_; - } - - return *this; -} - -bool Game::IsInstalled(const GameSettings& gameSettings) { - auto gamePath = DetectGamePath(gameSettings); - - return !gamePath.empty(); -} - -void Game::Init() { - BOOST_LOG_TRIVIAL(info) << "Initialising filesystem-related data for game: " << Name(); - - if (!lootDataPath_.empty()) { - //Make sure that the LOOT game path exists. - try { - if (!fs::exists(lootDataPath_ / FolderName())) - fs::create_directories(lootDataPath_ / FolderName()); - } catch (fs::filesystem_error& e) { - throw FileAccessError((boost::format("Could not create LOOT folder for game. Details: %1%") % e.what()).str()); - } - } -} - -std::shared_ptr Game::GetPlugin(const std::string & name) const { - return gameHandle_->GetPlugin(name); -} - -std::set> Game::GetPlugins() const { - return gameHandle_->GetLoadedPlugins(); -} - -std::vector Game::CheckInstallValidity(const std::shared_ptr& plugin, const PluginMetadata & metadata) { - BOOST_LOG_TRIVIAL(trace) << "Checking that the current install is valid according to " << plugin->GetName() << "'s data."; - std::vector messages; - if (IsPluginActive(plugin->GetName())) { - auto pluginExists = [&](const std::string& file) { - return boost::filesystem::exists(DataPath() / file) - || ((boost::iends_with(file, ".esp") || boost::iends_with(file, ".esm")) && boost::filesystem::exists(DataPath() / (file + ".ghost"))); - }; - auto tags = metadata.GetTags(); - if (tags.find(Tag("Filter")) == std::end(tags)) { - for (const auto &master : plugin->GetMasters()) { - if (!pluginExists(master)) { - BOOST_LOG_TRIVIAL(error) << "\"" << plugin->GetName() << "\" requires \"" << master << "\", but it is missing."; - messages.push_back(Message(MessageType::error, (boost::format(boost::locale::translate("This plugin requires \"%1%\" to be installed, but it is missing.")) % master).str())); - } else if (!IsPluginActive(master)) { - BOOST_LOG_TRIVIAL(error) << "\"" << plugin->GetName() << "\" requires \"" << master << "\", but it is inactive."; - messages.push_back(Message(MessageType::error, (boost::format(boost::locale::translate("This plugin requires \"%1%\" to be active, but it is inactive.")) % master).str())); - } - } - } - - for (const auto &req : metadata.GetRequirements()) { - if (!pluginExists(req.GetName())) { - BOOST_LOG_TRIVIAL(error) << "\"" << plugin->GetName() << "\" requires \"" << req.GetName() << "\", but it is missing."; - messages.push_back(Message(MessageType::error, (boost::format(boost::locale::translate("This plugin requires \"%1%\" to be installed, but it is missing.")) % req.GetName()).str())); - } - } - for (const auto &inc : metadata.GetIncompatibilities()) { - if (pluginExists(inc.GetName()) && IsPluginActive(inc.GetName())) { - BOOST_LOG_TRIVIAL(error) << "\"" << plugin->GetName() << "\" is incompatible with \"" << inc.GetName() << "\", but both are present."; - messages.push_back(Message(MessageType::error, (boost::format(boost::locale::translate("This plugin is incompatible with \"%1%\", but both are present.")) % inc.GetName()).str())); - } - } - } - - // Also generate dirty messages. - for (const auto &element : metadata.GetDirtyInfo()) { - messages.push_back(element.AsMessage()); - } - - return messages; -} - -void Game::RedatePlugins() { - if (Type() != GameType::tes5 && Type() != GameType::tes5se) { - BOOST_LOG_TRIVIAL(warning) << "Cannot redate plugins for game " << Name(); - return; - } - - vector loadorder = gameHandle_->GetLoadOrder(); - if (!loadorder.empty()) { - time_t lastTime = 0; - for (const auto &pluginName : loadorder) { - fs::path filepath = DataPath() / pluginName; - if (!fs::exists(filepath)) { - if (fs::exists(filepath.string() + ".ghost")) - filepath += ".ghost"; - else - continue; - } - - time_t thisTime = fs::last_write_time(filepath); - BOOST_LOG_TRIVIAL(info) << "Current timestamp for \"" << filepath.filename().string() << "\": " << thisTime; - if (thisTime >= lastTime) { - lastTime = thisTime; - BOOST_LOG_TRIVIAL(trace) << "No need to redate \"" << filepath.filename().string() << "\"."; - } else { - lastTime += 60; - fs::last_write_time(filepath, lastTime); //Space timestamps by a minute. - BOOST_LOG_TRIVIAL(info) << "Redated \"" << filepath.filename().string() << "\" to: " << lastTime; - } - } - } -} - -void Game::LoadAllInstalledPlugins(bool headersOnly) { - gameHandle_->LoadPlugins(GetInstalledPluginNames(), headersOnly); - - pluginsFullyLoaded_ = !headersOnly; -} - -bool Game::ArePluginsFullyLoaded() const { - return pluginsFullyLoaded_; -} - -boost::filesystem::path Game::DataPath() const { - if (GamePath().empty()) - throw std::logic_error("Cannot get data path from empty game path"); - return GamePath() / "Data"; -} - -fs::path Game::MasterlistPath() const { - return lootDataPath_ / FolderName() / "masterlist.yaml"; -} - -fs::path Game::UserlistPath() const { - return lootDataPath_ / FolderName() / "userlist.yaml"; -} - -std::vector Game::GetLoadOrder() const { - return gameHandle_->GetLoadOrder(); -} - -void Game::SetLoadOrder(const std::vector& loadOrder) { - BackupLoadOrder(GetLoadOrder(), lootDataPath_ / FolderName()); - gameHandle_->SetLoadOrder(loadOrder); -} - -bool Game::IsPluginActive(const std::string& pluginName) const { - return gameHandle_->IsPluginActive(pluginName); -} - -short Game::GetActiveLoadOrderIndex(const std::string& pluginName) const { - return GetActiveLoadOrderIndex(pluginName, gameHandle_->GetLoadOrder()); -} - -short Game::GetActiveLoadOrderIndex(const std::string& pluginName, const std::vector& loadOrder) const { - // Get the full load order, then count the number of active plugins until the - // given plugin is encountered. If the plugin isn't active or in the load - // order, return -1. - - if (!gameHandle_->IsPluginActive(pluginName)) - return -1; - - short numberOfActivePlugins = 0; - for (const std::string& plugin : loadOrder) { - if (boost::iequals(plugin, pluginName)) - return numberOfActivePlugins; - - if (gameHandle_->IsPluginActive(plugin)) - ++numberOfActivePlugins; - } - - return -1; -} - -std::vector Game::SortPlugins() { - std::vector plugins = GetInstalledPluginNames(); - try { - // Clear any existing game-specific messages, as these only relate to - // state that has been changed by sorting. - ClearMessages(); - - plugins = gameHandle_->SortPlugins(plugins); - - IncrementLoadOrderSortCount(); - } catch (CyclicInteractionError& e) { - BOOST_LOG_TRIVIAL(error) << "Failed to sort plugins. Details: " << e.what(); - AppendMessage(Message(MessageType::error, - (boost::format(boost::locale::translate("Cyclic interaction detected between plugins \"%1%\" and \"%2%\". Back cycle: %3%")) - % e.getFirstPlugin() % e.getLastPlugin() % e.getBackCycle()).str())); - plugins.clear(); - } catch (std::exception& e) { - BOOST_LOG_TRIVIAL(error) << "Failed to sort plugins. Details: " << e.what(); - plugins.clear(); - } - - return plugins; -} - -void Game::IncrementLoadOrderSortCount() { - lock_guard guard(mutex_); - - ++loadOrderSortCount_; -} - -void Game::DecrementLoadOrderSortCount() { - lock_guard guard(mutex_); - - if (loadOrderSortCount_ > 0) - --loadOrderSortCount_; -} - -std::vector Game::GetMessages() const { - std::vector output(gameHandle_->GetDatabase()->GetGeneralMessages(true)); - output.insert(end(output), begin(messages_), end(messages_)); - - if (loadOrderSortCount_ == 0) - output.push_back(Message(MessageType::warn, boost::locale::translate("You have not sorted your load order this session."))); - - return output; -} - -void Game::AppendMessage(const Message& message) { - lock_guard guard(mutex_); - - messages_.push_back(message); -} - -void Game::ClearMessages() { - lock_guard guard(mutex_); - - messages_.clear(); -} - -bool Game::UpdateMasterlist() { - return gameHandle_->GetDatabase()->UpdateMasterlist(MasterlistPath().string(), RepoURL(), RepoBranch()); -} - -MasterlistInfo Game::GetMasterlistInfo() const { - return gameHandle_->GetDatabase()->GetMasterlistRevision(MasterlistPath().string(), true); -} - -void Game::LoadMetadata() { - std::string masterlistPath; - std::string userlistPath; - if (boost::filesystem::exists(MasterlistPath())) { - BOOST_LOG_TRIVIAL(debug) << "Preparing to parse masterlist."; - masterlistPath = MasterlistPath().string(); - } - - if (boost::filesystem::exists(UserlistPath())) { - BOOST_LOG_TRIVIAL(debug) << "Preparing to parse userlist."; - userlistPath = UserlistPath().string(); - } - - BOOST_LOG_TRIVIAL(debug) << "Parsing metadata list(s)."; - try { - gameHandle_->GetDatabase()->LoadLists(masterlistPath, userlistPath); - } catch (std::exception& e) { - BOOST_LOG_TRIVIAL(error) << "An error occurred while parsing the metadata list(s): " << e.what(); - AppendMessage(Message(MessageType::error, (boost::format(boost::locale::translate( - "An error occurred while parsing the metadata list(s): %1%.\n\n" - "Try updating your masterlist to resolve the error. If the " - "error is with your user metadata, this probably happened because " - "an update to LOOT changed its metadata syntax support. Your " - "user metadata will have to be updated manually.\n\n" - "To do so, use the 'Open Debug Log Location' in LOOT's main " - "menu to open its data folder, then open your 'userlist.yaml' " - "file in the relevant game folder. You can then edit the " - "metadata it contains with reference to the " - "documentation, which is accessible through LOOT's main menu.\n\n" - "You can also seek support on LOOT's forum thread, which is " - "linked to on [LOOT's website](https://loot.github.io/)." - )) % e.what()).str())); - } -} - -std::set Game::GetKnownBashTags() const { - return gameHandle_->GetDatabase()->GetKnownBashTags(); -} - -PluginMetadata Game::GetMasterlistMetadata(const std::string & pluginName, - bool evaluateConditions) const { - return gameHandle_->GetDatabase()->GetPluginMetadata(pluginName, false, evaluateConditions); -} - -PluginMetadata Game::GetUserMetadata(const std::string & pluginName, - bool evaluateConditions) const { - return gameHandle_->GetDatabase()->GetPluginUserMetadata(pluginName, evaluateConditions); -} - -void Game::AddUserMetadata(const PluginMetadata & metadata) { - gameHandle_->GetDatabase()->SetPluginUserMetadata(metadata); -} - -void Game::ClearUserMetadata(const std::string & pluginName) { - gameHandle_->GetDatabase()->DiscardPluginUserMetadata(pluginName); -} - -void Game::ClearAllUserMetadata() { - gameHandle_->GetDatabase()->DiscardAllUserMetadata(); -} - -void Game::SaveUserMetadata() { - gameHandle_->GetDatabase()->WriteUserMetadata(UserlistPath().string(), true); -} - -boost::filesystem::path Game::DetectGamePath(const GameSettings & gameSettings) { - try { - BOOST_LOG_TRIVIAL(trace) << "Checking if game \"" << gameSettings.Name() << "\" is installed."; - if (!gameSettings.GamePath().empty() && fs::exists(gameSettings.GamePath() / "Data" / gameSettings.Master())) - return gameSettings.GamePath(); - - if (fs::exists(fs::path("..") / "Data" / gameSettings.Master())) { - return ".."; - } - -#ifdef _WIN32 - std::string path; - std::string key_parent = fs::path(gameSettings.RegistryKey()).parent_path().string(); - std::string key_name = fs::path(gameSettings.RegistryKey()).filename().string(); - path = RegKeyStringValue("HKEY_LOCAL_MACHINE", key_parent, key_name); - if (!path.empty() && fs::exists(fs::path(path) / "Data" / gameSettings.Master())) { - return path; - } -#endif - } catch (std::exception &e) { - BOOST_LOG_TRIVIAL(error) << "Error while checking if game \"" << gameSettings.Name() << "\" is installed: " << e.what(); - } - - return boost::filesystem::path(); -} - -void Game::BackupLoadOrder(const std::vector& loadOrder, - const boost::filesystem::path& backupDirectory) { - const int maxBackupIndex = 2; - boost::format filenameFormat = boost::format("loadorder.bak.%1%"); - - boost::filesystem::path backupFilePath = backupDirectory / (filenameFormat % 2).str(); - if (boost::filesystem::exists(backupFilePath)) - boost::filesystem::remove(backupFilePath); - - for (int i = maxBackupIndex - 1; i > -1; --i) { - const boost::filesystem::path backupFilePath = backupDirectory / (filenameFormat % i).str(); - if (boost::filesystem::exists(backupFilePath)) - boost::filesystem::rename(backupFilePath, backupDirectory / (filenameFormat % (i + 1)).str()); - } - - boost::filesystem::ofstream out(backupDirectory / (filenameFormat % 0).str()); - for (const auto &plugin : loadOrder) - out << plugin << std::endl; -} - -std::vector Game::GetInstalledPluginNames() { - std::vector plugins; - - BOOST_LOG_TRIVIAL(trace) << "Scanning for plugins in " << this->DataPath(); - for (fs::directory_iterator it(this->DataPath()); it != fs::directory_iterator(); ++it) { - if (fs::is_regular_file(it->status()) && gameHandle_->IsValidPlugin(it->path().filename().string())) { - string name = it->path().filename().string(); - BOOST_LOG_TRIVIAL(info) << "Found plugin: " << name; - - plugins.push_back(name); - } - } - - return plugins; -} - -#ifdef _WIN32 -std::string Game::RegKeyStringValue(const std::string& keyStr, const std::string& subkey, const std::string& value) { - HKEY hKey = NULL; - DWORD len = MAX_PATH; - std::wstring wstr(MAX_PATH, 0); - - if (keyStr == "HKEY_CLASSES_ROOT") - hKey = HKEY_CLASSES_ROOT; - else if (keyStr == "HKEY_CURRENT_CONFIG") - hKey = HKEY_CURRENT_CONFIG; - else if (keyStr == "HKEY_CURRENT_USER") - hKey = HKEY_CURRENT_USER; - else if (keyStr == "HKEY_LOCAL_MACHINE") - hKey = HKEY_LOCAL_MACHINE; - else if (keyStr == "HKEY_USERS") - hKey = HKEY_USERS; - else - throw std::invalid_argument("Invalid registry key given."); - - BOOST_LOG_TRIVIAL(trace) << "Getting string for registry key, subkey and value: " << keyStr << " + " << subkey << " + " << value; - LONG ret = RegGetValue(hKey, - ToWinWide(subkey).c_str(), - ToWinWide(value).c_str(), - RRF_RT_REG_SZ | KEY_WOW64_32KEY, - NULL, - &wstr[0], - &len); - - if (ret == ERROR_SUCCESS) { - BOOST_LOG_TRIVIAL(info) << "Found string: " << wstr.c_str(); - return FromWinWide(wstr.c_str()); // Passing c_str() cuts off any unused buffer. - } else { - BOOST_LOG_TRIVIAL(info) << "Failed to get string value."; - return ""; - } -} -#endif -} -} diff --git a/src/gui/state/game.h b/src/gui/state/game.h deleted file mode 100644 index 560c0b24..00000000 --- a/src/gui/state/game.h +++ /dev/null @@ -1,117 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2012-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#ifndef LOOT_GUI_STATE_GAME -#define LOOT_GUI_STATE_GAME - -#include -#include - -#include - -#include "gui/state/game_settings.h" -#include "loot/api.h" - -namespace loot { -namespace gui { -class Game : public GameSettings { -public: - Game(const GameSettings& gameSettings, - const boost::filesystem::path& lootDataPath, - const boost::filesystem::path& localDataPath = ""); - Game(const Game& game); - - Game& operator=(const Game& game); - - using GameSettings::Type; - - static bool IsInstalled(const GameSettings& gameSettings); - void Init(); - - std::shared_ptr GetPlugin(const std::string& name) const; - std::set> GetPlugins() const; - std::vector CheckInstallValidity(const std::shared_ptr& plugin, - const PluginMetadata& metadata); - - void RedatePlugins(); //Change timestamps to match load order (Skyrim only). - - void LoadAllInstalledPlugins(bool headersOnly); //Loads all installed plugins. - bool ArePluginsFullyLoaded() const; // Checks if the game's plugins have already been loaded. - - boost::filesystem::path DataPath() const; - boost::filesystem::path MasterlistPath() const; - boost::filesystem::path UserlistPath() const; - - std::vector GetLoadOrder() const; - void SetLoadOrder(const std::vector& loadOrder); - - bool IsPluginActive(const std::string& pluginName) const; - short GetActiveLoadOrderIndex(const std::string& pluginName) const; - short GetActiveLoadOrderIndex(const std::string& pluginName, const std::vector& loadOrder) const; - - std::vector SortPlugins(); - void IncrementLoadOrderSortCount(); - void DecrementLoadOrderSortCount(); - - std::vector GetMessages() const; - void AppendMessage(const Message& message); - void ClearMessages(); - - bool UpdateMasterlist(); - MasterlistInfo GetMasterlistInfo() const; - - void LoadMetadata(); - std::set GetKnownBashTags() const; - PluginMetadata GetMasterlistMetadata(const std::string& pluginName, - bool evaluateConditions = false) const; - PluginMetadata GetUserMetadata(const std::string& pluginName, - bool evaluateConditions = false) const; - - void AddUserMetadata(const PluginMetadata& metadata); - void ClearUserMetadata(const std::string& pluginName); - void ClearAllUserMetadata(); - void SaveUserMetadata(); -private: -#ifdef _WIN32 - static std::string RegKeyStringValue(const std::string& keyStr, const std::string& subkey, const std::string& value); -#endif - static boost::filesystem::path DetectGamePath(const GameSettings& gameSettings); - static void BackupLoadOrder(const std::vector& loadOrder, - const boost::filesystem::path& backupDirectory); - std::vector GetInstalledPluginNames(); - - boost::filesystem::path lootDataPath_; - - std::shared_ptr gameHandle_; - bool pluginsFullyLoaded_; - - std::vector messages_; - unsigned short loadOrderSortCount_; - - mutable std::mutex mutex_; -}; -} -} - -#endif diff --git a/src/gui/state/game_detection_error.h b/src/gui/state/game_detection_error.h deleted file mode 100644 index 09d1040f..00000000 --- a/src/gui/state/game_detection_error.h +++ /dev/null @@ -1,41 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2012-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#ifndef LOOT_GUI_GAME_DETECTION_ERROR -#define LOOT_GUI_GAME_DETECTION_ERROR - -#include - -namespace loot { -/** - * @brief An exception class thrown if an error occurs when detecting installed - * games. - */ -class GameDetectionError : public std::runtime_error { -public: - using std::runtime_error::runtime_error; -}; -} - -#endif diff --git a/src/gui/state/game_settings.cpp b/src/gui/state/game_settings.cpp deleted file mode 100644 index 81d0cc09..00000000 --- a/src/gui/state/game_settings.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2012-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#include "gui/state/game_settings.h" - -#include -#include -#include - -namespace fs = boost::filesystem; - -namespace loot { -const std::set GameSettings::oldDefaultBranches({ - "master", - "v0.7", - "v0.8", -}); - -GameSettings::GameSettings() : type_(GameType::tes4) {} - -GameSettings::GameSettings(const GameType gameCode, const std::string& folder) : type_(gameCode), repositoryBranch_("v0.10") { - if (Type() == GameType::tes4) { - name_ = "TES IV: Oblivion"; - registryKey_ = "Software\\Bethesda Softworks\\Oblivion\\Installed Path"; - lootFolderName_ = "Oblivion"; - masterFile_ = "Oblivion.esm"; - repositoryURL_ = "https://github.com/loot/oblivion.git"; - } else if (Type() == GameType::tes5) { - name_ = "TES V: Skyrim"; - registryKey_ = "Software\\Bethesda Softworks\\Skyrim\\Installed Path"; - lootFolderName_ = "Skyrim"; - masterFile_ = "Skyrim.esm"; - repositoryURL_ = "https://github.com/loot/skyrim.git"; - } else if (Type() == GameType::tes5se) { - name_ = "TES V: Skyrim Special Edition"; - registryKey_ = "Software\\Bethesda Softworks\\Skyrim Special Edition\\Installed Path"; - lootFolderName_ = "Skyrim Special Edition"; - masterFile_ = "Skyrim.esm"; - repositoryURL_ = "https://github.com/loot/skyrimse.git"; - } else if (Type() == GameType::fo3) { - name_ = "Fallout 3"; - registryKey_ = "Software\\Bethesda Softworks\\Fallout3\\Installed Path"; - lootFolderName_ = "Fallout3"; - masterFile_ = "Fallout3.esm"; - repositoryURL_ = "https://github.com/loot/fallout3.git"; - } else if (Type() == GameType::fonv) { - name_ = "Fallout: New Vegas"; - registryKey_ = "Software\\Bethesda Softworks\\FalloutNV\\Installed Path"; - lootFolderName_ = "FalloutNV"; - masterFile_ = "FalloutNV.esm"; - repositoryURL_ = "https://github.com/loot/falloutnv.git"; - } else if (Type() == GameType::fo4) { - name_ = "Fallout 4"; - registryKey_ = "Software\\Bethesda Softworks\\Fallout4\\Installed Path"; - lootFolderName_ = "Fallout4"; - masterFile_ = "Fallout4.esm"; - repositoryURL_ = "https://github.com/loot/fallout4.git"; - } - - if (!folder.empty()) - lootFolderName_ = folder; -} - -bool GameSettings::IsRepoBranchOldDefault() const { - return oldDefaultBranches.count(repositoryBranch_) == 1; -} - -bool GameSettings::operator == (const GameSettings& rhs) const { - return (boost::iequals(name_, rhs.Name()) || boost::iequals(lootFolderName_, rhs.FolderName())); -} - -GameType GameSettings::Type() const { - return type_; -} - -std::string GameSettings::Name() const { - return name_; -} - -std::string GameSettings::FolderName() const { - return lootFolderName_; -} - -std::string GameSettings::Master() const { - return masterFile_; -} - -std::string GameSettings::RegistryKey() const { - return registryKey_; -} - -std::string GameSettings::RepoURL() const { - return repositoryURL_; -} - -std::string GameSettings::RepoBranch() const { - return repositoryBranch_; -} - -fs::path GameSettings::GamePath() const { - return gamePath_; -} - -GameSettings& GameSettings::SetName(const std::string& name) { - BOOST_LOG_TRIVIAL(trace) << "Setting \"" << name_ << "\" name to: " << name; - name_ = name; - return *this; -} - -GameSettings& GameSettings::SetMaster(const std::string& masterFile) { - BOOST_LOG_TRIVIAL(trace) << "Setting \"" << name_ << "\" master file to: " << masterFile; - masterFile_ = masterFile; - return *this; -} - -GameSettings& GameSettings::SetRegistryKey(const std::string& registry) { - BOOST_LOG_TRIVIAL(trace) << "Setting \"" << name_ << "\" registry key to: " << registry; - registryKey_ = registry; - return *this; -} - -GameSettings& GameSettings::SetRepoURL(const std::string& repositoryURL) { - BOOST_LOG_TRIVIAL(trace) << "Setting \"" << name_ << "\" repo URL to: " << repositoryURL; - repositoryURL_ = repositoryURL; - return *this; -} - -GameSettings& GameSettings::SetRepoBranch(const std::string& repositoryBranch) { - BOOST_LOG_TRIVIAL(trace) << "Setting \"" << name_ << "\" repo branch to: " << repositoryBranch; - repositoryBranch_ = repositoryBranch; - return *this; -} - -GameSettings& GameSettings::SetGamePath(const boost::filesystem::path& path) { - BOOST_LOG_TRIVIAL(trace) << "Setting \"" << name_ << "\" game path to: " << path; - gamePath_ = path; - return *this; -} -} - -namespace YAML { -Emitter& operator << (Emitter& out, const loot::GameSettings& rhs) { - out << BeginMap - << Key << "type" << Value << YAML::SingleQuoted << loot::GameSettings(rhs.Type()).FolderName() - << Key << "folder" << Value << YAML::SingleQuoted << rhs.FolderName() - << Key << "name" << Value << YAML::SingleQuoted << rhs.Name() - << Key << "master" << Value << YAML::SingleQuoted << rhs.Master() - << Key << "repo" << Value << YAML::SingleQuoted << rhs.RepoURL() - << Key << "branch" << Value << YAML::SingleQuoted << rhs.RepoBranch() - << Key << "path" << Value << YAML::SingleQuoted << rhs.GamePath().string() - << Key << "registry" << Value << YAML::SingleQuoted << rhs.RegistryKey() - << EndMap; - - return out; -} -} diff --git a/src/gui/state/game_settings.h b/src/gui/state/game_settings.h deleted file mode 100644 index 2d01e280..00000000 --- a/src/gui/state/game_settings.h +++ /dev/null @@ -1,143 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2012-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#ifndef LOOT_GUI_STATE_GAME_SETTINGS -#define LOOT_GUI_STATE_GAME_SETTINGS - -#include -#include - -#include -#include - -#include "loot/enum/game_type.h" - -namespace loot { -class GameSettings { -public: - GameSettings(); - explicit GameSettings(const GameType gameType, const std::string& lootFolder = ""); - - bool IsRepoBranchOldDefault() const; - - bool operator == (const GameSettings& rhs) const; //Compares names and folder names. - - GameType Type() const; - std::string Name() const; //Returns the game's name, eg. "TES IV: Oblivion". - std::string FolderName() const; - std::string Master() const; - std::string RegistryKey() const; - std::string RepoURL() const; - std::string RepoBranch() const; - boost::filesystem::path GamePath() const; - - GameSettings& SetName(const std::string& name); - GameSettings& SetMaster(const std::string& masterFile); - GameSettings& SetRegistryKey(const std::string& registry); - GameSettings& SetRepoURL(const std::string& repositoryURL); - GameSettings& SetRepoBranch(const std::string& repositoryBranch); - GameSettings& SetGamePath(const boost::filesystem::path& path); - -private: - static const std::set oldDefaultBranches; - - GameType type_; - std::string name_; - std::string masterFile_; - - std::string registryKey_; - - std::string lootFolderName_; - std::string repositoryURL_; - std::string repositoryBranch_; - - boost::filesystem::path gamePath_; //Path to the game's folder. -}; -} - -namespace YAML { -template<> -struct convert { - static Node encode(const loot::GameSettings& rhs) { - Node node; - - node["type"] = loot::GameSettings(rhs.Type()).FolderName(); - node["name"] = rhs.Name(); - node["folder"] = rhs.FolderName(); - node["master"] = rhs.Master(); - node["repo"] = rhs.RepoURL(); - node["branch"] = rhs.RepoBranch(); - node["path"] = rhs.GamePath().string(); - node["registry"] = rhs.RegistryKey(); - - return node; - } - - static bool decode(const Node& node, loot::GameSettings& rhs) { - using loot::GameSettings; - using loot::GameType; - - if (!node.IsMap()) - throw RepresentationException(node.Mark(), "bad conversion: 'game settings' object must be a map"); - if (!node["folder"]) - throw RepresentationException(node.Mark(), "bad conversion: 'folder' key missing from 'game settings' object"); - if (!node["type"]) - throw RepresentationException(node.Mark(), "bad conversion: 'type' key missing from 'game settings' object"); - - if (node["type"].as() == GameSettings(GameType::tes4).FolderName()) - rhs = GameSettings(GameType::tes4, node["folder"].as()); - else if (node["type"].as() == GameSettings(GameType::tes5).FolderName()) - rhs = GameSettings(GameType::tes5, node["folder"].as()); - else if (node["type"].as() == GameSettings(GameType::tes5se).FolderName()) - rhs = GameSettings(GameType::tes5se, node["folder"].as()); - else if (node["type"].as() == GameSettings(GameType::fo3).FolderName()) - rhs = GameSettings(GameType::fo3, node["folder"].as()); - else if (node["type"].as() == GameSettings(GameType::fonv).FolderName()) - rhs = GameSettings(GameType::fonv, node["folder"].as()); - else if (node["type"].as() == GameSettings(GameType::fo4).FolderName()) - rhs = GameSettings(GameType::fo4, node["folder"].as()); - else - throw RepresentationException(node.Mark(), "bad conversion: invalid value for 'type' key in 'game settings' object"); - - if (node["name"]) - rhs.SetName(node["name"].as()); - if (node["master"]) - rhs.SetMaster(node["master"].as()); - if (node["repo"]) - rhs.SetRepoURL(node["repo"].as()); - if (node["branch"]) - rhs.SetRepoBranch(node["branch"].as()); - if (node["path"]) - rhs.SetGamePath(node["path"].as()); - if (node["registry"]) - rhs.SetRegistryKey(node["registry"].as()); - - return true; - } -}; - -Emitter& operator << (Emitter& out, const loot::GameSettings& rhs); -} - -#endif diff --git a/src/gui/state/loot_paths.cpp b/src/gui/state/loot_paths.cpp deleted file mode 100644 index d849b46e..00000000 --- a/src/gui/state/loot_paths.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - - Copyright(C) 2012 - 2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software : you can redistribute - it and / or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT.If not, see - . -*/ - -#include "loot_paths.h" - -#include - -#include - -#include "loot/windows_encoding_converters.h" - -#ifdef _WIN32 -# ifndef UNICODE -# define UNICODE -# endif -# ifndef _UNICODE -# define _UNICODE -# endif -# include "windows.h" -# include "shlobj.h" -#endif - -namespace loot { -boost::filesystem::path LootPaths::getReadmePath() { - return lootAppPath_ / "docs" / "index.html"; -} - -boost::filesystem::path LootPaths::getResourcesPath() { - return lootAppPath_ / "resources"; -} - -boost::filesystem::path LootPaths::getL10nPath() { - return getResourcesPath() / "l10n"; -} - -boost::filesystem::path LootPaths::getLootDataPath() { - return lootDataPath_; -} - -boost::filesystem::path LootPaths::getSettingsPath() { - return lootDataPath_ / "settings.yaml"; -} - -boost::filesystem::path LootPaths::getLogPath() { - return lootDataPath_ / "LOOTDebugLog.txt"; -} - -boost::filesystem::path LootPaths::getApiLogPath() { - return lootDataPath_ / "LOOTAPIDebugLog.txt"; -} - -void LootPaths::initialise(const std::string& lootDataPath) { - // Set the locale to get UTF-8 conversions working correctly. - std::locale::global(boost::locale::generator().generate("")); - boost::filesystem::path::imbue(std::locale()); - - lootAppPath_ = boost::filesystem::current_path(); - - if (!lootDataPath.empty()) - lootDataPath_ = lootDataPath; - else - lootDataPath_ = getLocalAppDataPath() / "LOOT"; -} - -boost::filesystem::path LootPaths::getLocalAppDataPath() { -#ifdef _WIN32 - HWND owner = 0; - PWSTR path; - - if (SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &path) != S_OK) - throw std::system_error(GetLastError(), std::system_category(), "Failed to get %LOCALAPPDATA% path."); - - boost::filesystem::path localAppDataPath(FromWinWide(path)); - CoTaskMemFree(path); - - return localAppDataPath; -#else - // Use XDG_CONFIG_HOME environmental variable if it's available. - const char * xdgConfigHome = getenv("XDG_CONFIG_HOME"); - - if (xdgConfigHome != nullptr) - return boost::filesystem::path(xdgConfigHome); - -// Otherwise, use the HOME env. var. if it's available. - xdgConfigHome = getenv("HOME"); - - if (xdgConfigHome != nullptr) - return boost::filesystem::path(xdgConfigHome) / ".config"; - -// If somehow both are missing, use the current path. - return boost::filesystem::current_path(); -#endif -} - -boost::filesystem::path LootPaths::lootAppPath_; -boost::filesystem::path LootPaths::lootDataPath_; -} diff --git a/src/gui/state/loot_paths.h b/src/gui/state/loot_paths.h deleted file mode 100644 index 9f560331..00000000 --- a/src/gui/state/loot_paths.h +++ /dev/null @@ -1,53 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_GUI_STATE_LOOT_PATHS -#define LOOT_GUI_STATE_LOOT_PATHS - -#include - -namespace loot { -class LootPaths { -public: - static boost::filesystem::path getReadmePath(); - static boost::filesystem::path getResourcesPath(); - static boost::filesystem::path getL10nPath(); - static boost::filesystem::path getLootDataPath(); - static boost::filesystem::path getSettingsPath(); - static boost::filesystem::path getLogPath(); - static boost::filesystem::path getApiLogPath(); - - // Sets the app path to the current path, and the data path to the given - // path or (if it is an empty string), local app data path / "LOOT". - static void initialise(const std::string& lootDataPath); -private: - //Get the local application data path. - static boost::filesystem::path getLocalAppDataPath(); - - static boost::filesystem::path lootAppPath_; - static boost::filesystem::path lootDataPath_; -}; -} - -#endif diff --git a/src/gui/state/loot_settings.cpp b/src/gui/state/loot_settings.cpp deleted file mode 100644 index 3cb0308e..00000000 --- a/src/gui/state/loot_settings.cpp +++ /dev/null @@ -1,306 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2014-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#include "gui/state/loot_settings.h" - -#include - -#include - -#include "gui/state/loot_paths.h" -#include "loot/loot_version.h" - -using std::lock_guard; -using std::recursive_mutex; -using std::string; - -namespace loot { -LootSettings::WindowPosition::WindowPosition() : top(0), bottom(0), left(0), right(0), maximised(false) {} - -LootSettings::LootSettings() : - gameSettings_({ - GameSettings(GameType::tes4), - GameSettings(GameType::tes5), - GameSettings(GameType::tes5se), - GameSettings(GameType::fo3), - GameSettings(GameType::fonv), - GameSettings(GameType::fo4), - GameSettings(GameType::tes4, "Nehrim") - .SetName("Nehrim - At Fate's Edge") - .SetMaster("Nehrim.esm") - .SetRegistryKey("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Nehrim - At Fate's Edge_is1\\InstallLocation"), -}), -enableDebugLogging_(false), -updateMasterlist_(true), -game_("auto"), -language_(Language(LanguageCode::english)), -lastGame_("auto") {} - -void LootSettings::load(YAML::Node& settings) { - lock_guard guard(mutex_); - - upgradeYaml(settings); - - if (settings["enableDebugLogging"]) - enableDebugLogging_ = settings["enableDebugLogging"].as(); - if (settings["updateMasterlist"]) - updateMasterlist_ = settings["updateMasterlist"].as(); - if (settings["game"]) - game_ = settings["game"].as(); - if (settings["language"]) - language_ = Language(settings["language"].as()); - if (settings["lastGame"]) - lastGame_ = settings["lastGame"].as(); - if (settings["lastVersion"]) - lastVersion_ = settings["lastVersion"].as(); - - if (settings["window"] - && settings["window"]["top"] && settings["window"]["bottom"] - && settings["window"]["left"] && settings["window"]["right"] - && settings["window"]["maximised"]) { - windowPosition_.top = settings["window"]["top"].as(); - windowPosition_.bottom = settings["window"]["bottom"].as(); - windowPosition_.left = settings["window"]["left"].as(); - windowPosition_.right = settings["window"]["right"].as(); - windowPosition_.maximised = settings["window"]["maximised"].as(); - } - - if (settings["games"]) { - gameSettings_ = settings["games"].as>(); - - // If a base game isn't in the settings, add it. - if (find(begin(gameSettings_), end(gameSettings_), GameSettings(GameType::tes4)) == end(gameSettings_)) - gameSettings_.push_back(GameSettings(GameType::tes4)); - - if (find(begin(gameSettings_), end(gameSettings_), GameSettings(GameType::tes5)) == end(gameSettings_)) - gameSettings_.push_back(GameSettings(GameType::tes5)); - - if (find(begin(gameSettings_), end(gameSettings_), GameSettings(GameType::tes5se)) == end(gameSettings_)) - gameSettings_.push_back(GameSettings(GameType::tes5se)); - - if (find(begin(gameSettings_), end(gameSettings_), GameSettings(GameType::fo3)) == end(gameSettings_)) - gameSettings_.push_back(GameSettings(GameType::fo3)); - - if (find(begin(gameSettings_), end(gameSettings_), GameSettings(GameType::fonv)) == end(gameSettings_)) - gameSettings_.push_back(GameSettings(GameType::fonv)); - - if (find(begin(gameSettings_), end(gameSettings_), GameSettings(GameType::fo4)) == end(gameSettings_)) - gameSettings_.push_back(GameSettings(GameType::fo4)); - } - - if (settings["filters"]) - filters_ = settings["filters"].as>(); -} - -void LootSettings::load(const boost::filesystem::path& file) { - boost::filesystem::ifstream in(file); - YAML::Node content = YAML::Load(in); - load(content); -} - -void LootSettings::save(const boost::filesystem::path& file) { - lock_guard guard(mutex_); - - YAML::Emitter yout; - yout.SetIndent(2); - yout << toYaml(); - - boost::filesystem::ofstream out(file); - out << yout.c_str(); -} - -bool LootSettings::isDebugLoggingEnabled() const { - lock_guard guard(mutex_); - - return enableDebugLogging_; -} - -bool LootSettings::isWindowPositionStored() const { - lock_guard guard(mutex_); - - return windowPosition_.top != 0 || windowPosition_.bottom != 0 || windowPosition_.left != 0 || windowPosition_.right != 0; -} - -std::string LootSettings::getGame() const { - lock_guard guard(mutex_); - - return game_; -} - -std::string LootSettings::getLastGame() const { - lock_guard guard(mutex_); - - return lastGame_; -} - -std::string LootSettings::getLastVersion() const { - lock_guard guard(mutex_); - - return lastVersion_; -} - -const Language& LootSettings::getLanguage() const { - lock_guard guard(mutex_); - - return language_; -} - -const LootSettings::WindowPosition& LootSettings::getWindowPosition() const { - lock_guard guard(mutex_); - - return windowPosition_; -} - -std::vector LootSettings::getGameSettings() const { - lock_guard guard(mutex_); - - return gameSettings_; -} - -void LootSettings::storeLastGame(const std::string& lastGame) { - lock_guard guard(mutex_); - - this->lastGame_ = lastGame; -} - -void LootSettings::storeWindowPosition(const WindowPosition& position) { - lock_guard guard(mutex_); - - windowPosition_ = position; -} - -void LootSettings::storeGameSettings(const std::vector& gameSettings) { - lock_guard guard(mutex_); - - this->gameSettings_ = gameSettings; -} - -void LootSettings::storeFilterState(const std::string& filterId, bool enabled) { - lock_guard guard(mutex_); - - filters_[filterId] = enabled; -} - -void LootSettings::updateLastVersion() { - lock_guard guard(mutex_); - - lastVersion_ = LootVersion::string(); -} - -YAML::Node LootSettings::toYaml() const { - lock_guard guard(mutex_); - - YAML::Node node; - - node["enableDebugLogging"] = enableDebugLogging_; - node["updateMasterlist"] = updateMasterlist_; - node["game"] = game_; - node["language"] = language_.GetLocale(); - node["lastGame"] = lastGame_; - node["lastVersion"] = lastVersion_; - - if (isWindowPositionStored()) { - node["window"]["top"] = windowPosition_.top; - node["window"]["bottom"] = windowPosition_.bottom; - node["window"]["left"] = windowPosition_.left; - node["window"]["right"] = windowPosition_.right; - node["window"]["maximised"] = windowPosition_.maximised; - } - - node["games"] = gameSettings_; - - if (!filters_.empty()) - node["filters"] = filters_; - - return node; -} - -void LootSettings::upgradeYaml(YAML::Node& yaml) { - // Upgrade YAML settings' keys and values from those used in earlier - // versions of LOOT. - - if (yaml["Debug Verbosity"] && !yaml["enableDebugLogging"]) - yaml["enableDebugLogging"] = yaml["Debug Verbosity"].as() > 0; - - if (yaml["Update Masterlist"] && !yaml["updateMasterlist"]) - yaml["updateMasterlist"] = yaml["Update Masterlist"]; - - if (yaml["Game"] && !yaml["game"]) - yaml["game"] = yaml["Game"]; - - if (yaml["Language"] && !yaml["language"]) - yaml["language"] = yaml["Language"]; - - if (yaml["Last Game"] && !yaml["lastGame"]) - yaml["lastGame"] = yaml["Last Game"]; - - if (yaml["Games"] && !yaml["games"]) { - yaml["games"] = yaml["Games"]; - - for (auto node : yaml["games"]) { - if (node["url"]) { - node["repo"] = node["url"]; - node["branch"] = "master"; // It'll get updated to the correct default - } - } - } - - if (yaml["games"]) { - // Handle exception if YAML is invalid, eg. if an unrecognised - // game type is used (which can happen if downgrading from a - // later version of LOOT that supports more game types). - // However, can't remove elements from a sequence Node, so have to - // copy the valid elements into a new node then overwrite the - // original. - YAML::Node validGames; - for (auto node : yaml["games"]) { - try { - if (node["type"].as() == "SkyrimSE" && node["folder"].as() == "SkyrimSE") { - node["type"] = GameSettings(GameType::tes5se).FolderName(); - node["folder"] = GameSettings(GameType::tes5se).FolderName(); - - boost::filesystem::rename(LootPaths::getLootDataPath() / "SkyrimSE", LootPaths::getLootDataPath() / node["folder"].as()); - } - - GameSettings settings(node.as()); - - if (!yaml["Games"]) { - // Update existing default branch, if the default - // repositories are used. - if (settings.RepoURL() == GameSettings(settings.Type()).RepoURL() - && settings.IsRepoBranchOldDefault()) { - settings.SetRepoBranch(GameSettings(settings.Type()).RepoBranch()); - } - } - - validGames.push_back(settings); - } catch (...) {} - } - yaml["games"] = validGames; - } - - if (yaml["filters"]) - yaml["filters"].remove("contentFilter"); -} -} diff --git a/src/gui/state/loot_settings.h b/src/gui/state/loot_settings.h deleted file mode 100644 index 2458c17c..00000000 --- a/src/gui/state/loot_settings.h +++ /dev/null @@ -1,91 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2014-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#ifndef LOOT_GUI_STATE_LOOT_SETTINGS -#define LOOT_GUI_STATE_LOOT_SETTINGS - -#include -#include -#include -#include - -#include -#include - -#include "gui/state/game_settings.h" -#include "loot/language.h" - -namespace loot { -class LootSettings { -public: - struct WindowPosition { - WindowPosition(); - - long top; - long bottom; - long left; - long right; - bool maximised; - }; - - LootSettings(); - - void load(YAML::Node& settings); - void load(const boost::filesystem::path& file); - void save(const boost::filesystem::path& file); - - bool isDebugLoggingEnabled() const; - bool isWindowPositionStored() const; - std::string getGame() const; - std::string getLastGame() const; - std::string getLastVersion() const; - const Language& getLanguage() const; - const WindowPosition& getWindowPosition() const; - std::vector getGameSettings() const; - - void storeLastGame(const std::string& lastGame); - void storeWindowPosition(const WindowPosition& position); - void storeGameSettings(const std::vector& gameSettings); - void storeFilterState(const std::string& filterId, bool enabled); - void updateLastVersion(); - - YAML::Node toYaml() const; -private: - static void upgradeYaml(YAML::Node& yaml); - - bool enableDebugLogging_; - bool updateMasterlist_; - std::string game_; - std::string lastGame_; - std::string lastVersion_; - Language language_; - WindowPosition windowPosition_; - std::vector gameSettings_; - std::map filters_; - - mutable std::recursive_mutex mutex_; -}; -} - -#endif diff --git a/src/gui/state/loot_state.cpp b/src/gui/state/loot_state.cpp deleted file mode 100644 index 08beaae0..00000000 --- a/src/gui/state/loot_state.cpp +++ /dev/null @@ -1,305 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2014-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#include "gui/state/loot_state.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "gui/state/game_detection_error.h" -#include "gui/state/loot_paths.h" -#include "loot/api.h" -#include "loot/windows_encoding_converters.h" - -#ifdef _WIN32 -#include -#endif - -using boost::format; -using boost::locale::translate; -using std::exception; -using std::locale; -using std::lock_guard; -using std::mutex; -using std::string; -using std::vector; - -namespace fs = boost::filesystem; - -namespace loot { -LootState::LootState() : unappliedChangeCounter_(0), currentGame_(installedGames_.end()) {} - -void LootState::load(YAML::Node& settings) { - lock_guard guard(mutex_); - - LootSettings::load(settings); - - // Enable/disable debug logging in case it has changed. - enableDebugLogging(isDebugLoggingEnabled()); - - // Update existing games, add new games. - std::unordered_set newGameFolders; - BOOST_LOG_TRIVIAL(trace) << "Updating existing games and adding new games."; - for (const auto &gameSettings : getGameSettings()) { - auto pos = find(installedGames_.begin(), installedGames_.end(), gameSettings); - - if (pos != installedGames_.end()) { - pos->SetName(gameSettings.Name()) - .SetMaster(gameSettings.Master()) - .SetRepoURL(gameSettings.RepoURL()) - .SetRepoBranch(gameSettings.RepoBranch()) - .SetGamePath(gameSettings.GamePath()) - .SetRegistryKey(gameSettings.RegistryKey()); - } else { - if (gui::Game::IsInstalled(gameSettings)) { - BOOST_LOG_TRIVIAL(trace) << "Adding new installed game entry for: " << gameSettings.FolderName(); - installedGames_.push_back(gui::Game(gameSettings, LootPaths::getLootDataPath())); - updateStoredGamePathSetting(installedGames_.back()); - } - } - - newGameFolders.insert(gameSettings.FolderName()); - } - - // Remove deleted games. As the current game is stored using its index, - // removing an earlier game may invalidate it. - BOOST_LOG_TRIVIAL(trace) << "Removing deleted games."; - for (auto it = installedGames_.begin(); it != installedGames_.end();) { - if (newGameFolders.find(it->FolderName()) == newGameFolders.end()) { - BOOST_LOG_TRIVIAL(trace) << "Removing game: " << it->FolderName(); - it = installedGames_.erase(it); - } else - ++it; - } - - if (currentGame_ == end(installedGames_)) { - selectGame(""); - } - - if (currentGame_ != end(installedGames_)) { - // Re-initialise the current game in case the game path setting was changed. - currentGame_->Init(); - } -} - -void LootState::init(const std::string& cmdLineGame) { - // Do some preliminary locale / UTF-8 support setup here, in case the settings file reading requires it. - //Boost.Locale initialisation: Specify location of language dictionaries. - boost::locale::generator gen; - gen.add_messages_path(LootPaths::getL10nPath().string()); - gen.add_messages_domain("loot"); - - //Boost.Locale initialisation: Generate and imbue locales. - locale::global(gen(Language(LanguageCode::english).GetLocale() + ".UTF-8")); - boost::filesystem::path::imbue(locale()); - - // Check if the LOOT local app data folder exists, and create it if not. - if (!fs::exists(LootPaths::getLootDataPath())) { - BOOST_LOG_TRIVIAL(info) << "Local app data LOOT folder doesn't exist, creating it."; - try { - fs::create_directory(LootPaths::getLootDataPath()); - } catch (exception& e) { - initErrors_.push_back((format(translate("Error: Could not create LOOT settings file. %1%")) % e.what()).str()); - } - } - if (fs::exists(LootPaths::getSettingsPath())) { - try { - LootSettings::load(LootPaths::getSettingsPath()); - } catch (exception& e) { - initErrors_.push_back((format(translate("Error: Settings parsing failed. %1%")) % e.what()).str()); - } - } - - //Set up logging. - boost::log::add_file_log( - boost::log::keywords::file_name = LootPaths::getLogPath().string().c_str(), - boost::log::keywords::auto_flush = true, - boost::log::keywords::format = ( - boost::log::expressions::stream - << "[" << boost::log::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "%H:%M:%S.%f") << "]" - << " [" << boost::log::trivial::severity << "]: " - << boost::log::expressions::smessage - ) - ); - boost::log::add_common_attributes(); - SetLogFile(LootPaths::getApiLogPath().string()); - enableDebugLogging(isDebugLoggingEnabled()); - - // Log some useful info. - BOOST_LOG_TRIVIAL(info) << "LOOT Version: " << LootVersion::major << "." << LootVersion::minor << "." << LootVersion::patch; - BOOST_LOG_TRIVIAL(info) << "LOOT Build Revision: " << LootVersion::revision; -#ifdef _WIN32 - // Check if LOOT is being run through Mod Organiser. - bool runFromMO = GetModuleHandle(ToWinWide("hook.dll").c_str()) != NULL; - if (runFromMO) { - BOOST_LOG_TRIVIAL(info) << "LOOT is being run through Mod Organiser."; - } -#endif - - // The CEF debug log is appended to, not overwritten, so it gets really long. - // Delete the current CEF debug log. - fs::remove(LootPaths::getLootDataPath() / "CEFDebugLog.txt"); - - // Now that settings have been loaded, set the locale again to handle translations. - if (getLanguage().GetCode() != LanguageCode::english) { - BOOST_LOG_TRIVIAL(debug) << "Initialising language settings."; - Language lang(getLanguage()); - BOOST_LOG_TRIVIAL(debug) << "Selected language: " << lang.GetName(); - - //Boost.Locale initialisation: Generate and imbue locales. - locale::global(gen(lang.GetLocale() + ".UTF-8")); - boost::filesystem::path::imbue(locale()); - } - - // Detect games & select startup game - //----------------------------------- - - //Detect installed games. - BOOST_LOG_TRIVIAL(debug) << "Detecting installed games."; - installedGames_.clear(); - for (const auto& gameSettings : getGameSettings()) { - if (gui::Game::IsInstalled(gameSettings)) { - BOOST_LOG_TRIVIAL(trace) << "Adding new installed game entry for: " << gameSettings.FolderName(); - installedGames_.push_back(gui::Game(gameSettings, LootPaths::getLootDataPath())); - updateStoredGamePathSetting(installedGames_.back()); - } - } - - try { - BOOST_LOG_TRIVIAL(debug) << "Selecting game."; - selectGame(cmdLineGame); - BOOST_LOG_TRIVIAL(debug) << "Game selected is " << currentGame_->Name(); - BOOST_LOG_TRIVIAL(debug) << "Initialising game-specific settings."; - currentGame_->Init(); - } catch (std::exception& e) { - BOOST_LOG_TRIVIAL(error) << "Game-specific settings could not be initialised. " << e.what(); - initErrors_.push_back((format(translate("Error: Game-specific settings could not be initialised. %1%")) % e.what()).str()); - } -} - -const std::vector& LootState::getInitErrors() const { - return initErrors_; -} - -void LootState::save(const boost::filesystem::path & file) { - storeLastGame(currentGame_->FolderName()); - updateLastVersion(); - LootSettings::save(file); -} - -void LootState::changeGame(const std::string& newGameFolder) { - lock_guard guard(mutex_); - - BOOST_LOG_TRIVIAL(debug) << "Changing current game to that with folder: " << newGameFolder; - currentGame_ = find_if(installedGames_.begin(), installedGames_.end(), [&](const gui::Game& game) { - return boost::iequals(newGameFolder, game.FolderName()); - }); - currentGame_->Init(); - BOOST_LOG_TRIVIAL(debug) << "New game is " << currentGame_->Name(); -} - -gui::Game& LootState::getCurrentGame() { - lock_guard guard(mutex_); - - return *currentGame_; -} - -std::vector LootState::getInstalledGames() const { - vector installedGames; - for (const auto &game : installedGames_) { - installedGames.push_back(game.FolderName()); - } - return installedGames; -} - -bool LootState::hasUnappliedChanges() const { - return unappliedChangeCounter_ > 0; -} - -void LootState::incrementUnappliedChangeCounter() { - ++unappliedChangeCounter_; -} - -void LootState::decrementUnappliedChangeCounter() { - if (unappliedChangeCounter_ > 0) - --unappliedChangeCounter_; -} - -void LootState::selectGame(std::string preferredGame) { - if (preferredGame.empty()) { - // Get preferred game from settings. - if (getGame() != "auto") - preferredGame = getGame(); - else if (getLastGame() != "auto") - preferredGame = getLastGame(); - } - - // Get iterator to preferred game. - currentGame_ = find_if(begin(installedGames_), end(installedGames_), [&](gui::Game& game) { - return preferredGame.empty() || preferredGame == game.FolderName(); - }); - // If the preferred game cannot be found, get the first installed game. - if (currentGame_ == end(installedGames_)) { - currentGame_ = begin(installedGames_); - } - - // If no game can be selected, throw an exception. - if (currentGame_ == end(installedGames_)) { - throw GameDetectionError("None of the supported games were detected."); - } -} - -void LootState::enableDebugLogging(bool enable) { - if (enable) { - boost::log::core::get()->reset_filter(); - SetLoggingVerbosity(LogVerbosity::trace); - } else { - boost::log::core::get()->set_filter(boost::log::trivial::severity >= boost::log::trivial::warning); - SetLoggingVerbosity(LogVerbosity::warning); - } -} - -void LootState::updateStoredGamePathSetting(const gui::Game& game) { - auto gameSettings = getGameSettings(); - auto pos = find_if(begin(gameSettings), end(gameSettings), [&](const GameSettings& gameSettings) { - return boost::iequals(game.FolderName(), gameSettings.FolderName()); - }); - if (pos == end(gameSettings)) { - BOOST_LOG_TRIVIAL(error) << "Could not find the settings for the current game (" << game.Name() << ")"; - } else { - pos->SetGamePath(game.GamePath()); - storeGameSettings(gameSettings); - } -} -} diff --git a/src/gui/state/loot_state.h b/src/gui/state/loot_state.h deleted file mode 100644 index 22b4ed81..00000000 --- a/src/gui/state/loot_state.h +++ /dev/null @@ -1,69 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2014-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#ifndef LOOT_GUI_STATE_LOOT_STATE -#define LOOT_GUI_STATE_LOOT_STATE - -#include "gui/state/loot_settings.h" -#include "gui/state/game.h" - -namespace loot { -class LootState : public LootSettings { -public: - LootState(); - - void load(YAML::Node& settings); - void init(const std::string& cmdLineGame); - const std::vector& getInitErrors() const; - - void save(const boost::filesystem::path& file); - - gui::Game& getCurrentGame(); - void changeGame(const std::string& newGameFolder); - - // Get the folder names of the installed games. - std::vector getInstalledGames() const; - - bool hasUnappliedChanges() const; - void incrementUnappliedChangeCounter(); - void decrementUnappliedChangeCounter(); -private: - // Select initial game. - void selectGame(std::string cmdLineGame); - void enableDebugLogging(bool enable); - void updateStoredGamePathSetting(const gui::Game& game); - - std::list installedGames_; - std::list::iterator currentGame_; - std::vector initErrors_; - - // Used to check if LOOT has unaccepted sorting or metadata changes on quit. - size_t unappliedChangeCounter_; - - // Mutex used to protect access to member variables. - std::mutex mutex_; -}; -} - -#endif diff --git a/src/gui/yaml_simple_message_helpers.h b/src/gui/yaml_simple_message_helpers.h deleted file mode 100644 index 7aa4d538..00000000 --- a/src/gui/yaml_simple_message_helpers.h +++ /dev/null @@ -1,96 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2012-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#ifndef LOOT_GUI_YAML_SIMPLE_MESSAGE_HELPERS -#define LOOT_GUI_YAML_SIMPLE_MESSAGE_HELPERS - -#include - -#include "loot/struct/simple_message.h" - -namespace YAML { -template<> -struct convert { - static Node encode(const loot::SimpleMessage& rhs) { - Node node; - - if (rhs.type == loot::MessageType::say) - node["type"] = "say"; - else if (rhs.type == loot::MessageType::warn) - node["type"] = "warn"; - else - node["type"] = "error"; - - node["text"] = rhs.text; - node["language"] = loot::Language(rhs.language).GetLocale(); - - return node; - } - - static bool decode(const Node& node, loot::SimpleMessage& rhs) { - // Treat SimpleMessage as a MessageContent with a type. - if (!node.IsMap()) - throw RepresentationException(node.Mark(), "bad conversion: 'simple message' object must be a map"); - if (!node["type"]) - throw RepresentationException(node.Mark(), "bad conversion: 'type' key missing from 'simple message' object"); - if (!node["text"]) - throw RepresentationException(node.Mark(), "bad conversion: 'text' key missing from 'simple message' object"); - if (!node["language"]) - throw RepresentationException(node.Mark(), "bad conversion: 'language' key missing from 'simple message' object"); - - rhs.text = node["text"].as(); - rhs.language = loot::Language(node["language"].as()).GetCode(); - - std::string type; - type = node["type"].as(); - - loot::MessageType typeNo = loot::MessageType::say; - if (boost::iequals(type, "warn")) - typeNo = loot::MessageType::warn; - else if (boost::iequals(type, "error")) - typeNo = loot::MessageType::error; - - return true; - } -}; - -Emitter& operator << (Emitter& out, const loot::SimpleMessage& rhs) { - out << BeginMap; - - if (rhs.type == loot::MessageType::say) - out << Key << "type" << Value << "say"; - else if (rhs.type == loot::MessageType::warn) - out << Key << "type" << Value << "warn"; - else - out << Key << "type" << Value << "error"; - - out << Key << "language" << Value << loot::Language(rhs.language).GetLocale(); - - out << Key << "text" << Value << YAML::SingleQuoted << rhs.text; - - return out; -} -} - -#endif diff --git a/src/tests/gui/html/elements/test_editable-table.html b/src/tests/gui/html/elements/test_editable-table.html deleted file mode 100644 index f5e16662..00000000 --- a/src/tests/gui/html/elements/test_editable-table.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - test_editable-table.html - - - - - - - - - - - - - - -
FilenameDisplay NameCondition
- - - - - - - -
TypeContentConditionLanguage
- - - - - - - -
Add/RemoveBash TagCondition
- - - - - - - -
CRCITM CountDeleted ReferencesDeleted NavmeshesCleaning Utility
- - - - - - - -
URLName
- diff --git a/src/tests/gui/html/elements/test_loot-custom-icons.html b/src/tests/gui/html/elements/test_loot-custom-icons.html deleted file mode 100644 index c860b917..00000000 --- a/src/tests/gui/html/elements/test_loot-custom-icons.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - test_loot-custom-icons.html - - - - - - - - - - - - - - - diff --git a/src/tests/gui/html/elements/test_loot-dropdown-menu.html b/src/tests/gui/html/elements/test_loot-dropdown-menu.html deleted file mode 100644 index d004fe1d..00000000 --- a/src/tests/gui/html/elements/test_loot-dropdown-menu.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - test_loot-dropdown-menu.html - - - - - - - - - -
- A dropdown: - - Note - Warning - Error - - - - 1 - 2 - 3 - -
- -
- - 1 - 2 - 3 - - - - 1 - 2 - 3 - -
- diff --git a/src/tests/gui/html/elements/test_loot-menu.html b/src/tests/gui/html/elements/test_loot-menu.html deleted file mode 100644 index dceef923..00000000 --- a/src/tests/gui/html/elements/test_loot-menu.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - test_loot-menu.html - - - - - - - - - - - Note - Warning - Error - - diff --git a/src/tests/gui/html/elements/test_loot-message-dialog.html b/src/tests/gui/html/elements/test_loot-message-dialog.html deleted file mode 100644 index 9923be27..00000000 --- a/src/tests/gui/html/elements/test_loot-message-dialog.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - test_loot-message-dialog.html - - - - - - - - - - Show Message Box - Show Message Dialog - - - diff --git a/src/tests/gui/html/elements/test_loot-plugin-card.html b/src/tests/gui/html/elements/test_loot-plugin-card.html deleted file mode 100644 index 12ac1d49..00000000 --- a/src/tests/gui/html/elements/test_loot-plugin-card.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - test_loot-plugin-card.html - - - - - - - - - - - - - - - - - - - - diff --git a/src/tests/gui/html/elements/test_loot-plugin-editor.html b/src/tests/gui/html/elements/test_loot-plugin-editor.html deleted file mode 100644 index 0af28fa6..00000000 --- a/src/tests/gui/html/elements/test_loot-plugin-editor.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - test_loot-plugin-editor.html - - - - - - - - - - - - -

Skyrim.esm

- 1.9 - ABCDEF01 -
- - - diff --git a/src/tests/gui/html/elements/test_loot-plugin-item.html b/src/tests/gui/html/elements/test_loot-plugin-item.html deleted file mode 100644 index 6e28adaf..00000000 --- a/src/tests/gui/html/elements/test_loot-plugin-item.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - test_loot-plugin-item.html - - - - - - - - - - Skyrim.esm - diff --git a/src/tests/gui/html/elements/test_loot-search-toolbar.html b/src/tests/gui/html/elements/test_loot-search-toolbar.html deleted file mode 100644 index 8ab4b078..00000000 --- a/src/tests/gui/html/elements/test_loot-search-toolbar.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - test_loot-search-toolbar.html - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/tests/gui/html/js/mock_dom.js b/src/tests/gui/html/js/mock_dom.js deleted file mode 100644 index 898e269d..00000000 --- a/src/tests/gui/html/js/mock_dom.js +++ /dev/null @@ -1,20 +0,0 @@ -/* Mock the DOM interactions */ -window.loot = window.loot || {}; - -loot.DOM = { - elementShownStates: new Map(), - elementEnabledStates: new Map(), - state: undefined, - - show(elementId, showElement = true) { - this.elementShownStates.set(elementId, showElement); - }, - - enable(elementId, enableElement = true) { - this.elementEnabledStates.set(elementId, enableElement); - }, - - setUIState(state) { - this.state = state; - }, -}; diff --git a/src/tests/gui/html/js/mock_octokat.js b/src/tests/gui/html/js/mock_octokat.js deleted file mode 100644 index c160f367..00000000 --- a/src/tests/gui/html/js/mock_octokat.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict'; - -/* Mock the octokat methods used. */ -function Octokat() { - this.repos = function(owner, repo) { - return { - releases: { - latest: { - fetch() { - return Promise.resolve({ - tagName: '0.9.2', - }); - }, - }, - }, - tags: { - fetch() { - return Promise.resolve([{ - name: '0.9.2', - commit: { - sha: '6b58f92a5d41f5d7f149a1263dac78687a065ff5', - }, - }, { - name: '0.9.1', - commit: { - sha: 'dc24e10a4774903ede4e94165e7d6fa806466e4a', - }, - }, { - name: '0.9.0', - commit: { - sha: '44a0d8505d5402dd24cf0fda9540da9557866c80', - }, - }]); - }, - }, - }; - } -} diff --git a/src/tests/gui/html/js/test_filters.js b/src/tests/gui/html/js/test_filters.js deleted file mode 100644 index 12640fae..00000000 --- a/src/tests/gui/html/js/test_filters.js +++ /dev/null @@ -1,333 +0,0 @@ -'use strict'; - -describe('Filters', () => { - /* Mock the Translator class. */ - class Translator { - translate(text) { // eslint-disable-line class-methods-use-this - return text; - } - } - - let l10n; - - beforeEach(() => { - l10n = new Translator(); - }); - - describe('#constructor()', () => { - it('should throw if no parameter is passed', () => { - (() => { new loot.Filters(); }).should.throw(); // eslint-disable-line no-new - }); - - it('should throw if an empty object is passed', () => { - (() => { new loot.Filters({}); }).should.throw(); // eslint-disable-line no-new - }); - - it('should not throw if a valid Translator object is passed', () => { - (() => { new loot.Filters(l10n); }).should.not.throw(); // eslint-disable-line no-new - }); - - it('should initialise filters as not enabled', () => { - const filters = new loot.Filters(l10n); - - filters.hideMessagelessPlugins.should.be.false; - filters.hideInactivePlugins.should.be.false; - filters.conflictingPluginNames.should.deep.equal([]); - filters.contentSearchString.should.equal(''); - - filters.hideVersionNumbers.should.be.false; - filters.hideCRCs.should.be.false; - filters.hideBashTags.should.be.false; - filters.hideAllPluginMessages.should.be.false; - filters.hideNotes.should.be.false; - filters.hideDoNotCleanMessages.should.be.false; - }); - - it('should initialise "do not clean" search string', () => { - const filters = new loot.Filters(l10n); - - filters._doNotCleanString.should.equal('do not clean'); - }); - }); - - describe('#pluginFilter()', () => { - let filters; - let plugin; - - /* Mock the PluginCardContent class */ - class PluginCardContent { - constructor(pluginObj, filtersObj) { - this._messages = pluginObj.messages; - this._hideMessages = filtersObj.hideAllPluginMessages; - } - - get messages() { - if (this._hideMessages) { - return []; - } - return this._messages; - } - - containsText(text) { // eslint-disable-line class-methods-use-this - return text === 'found text'; - } - } - - /* Mock the Plugin class */ - class Plugin { - constructor() { - this.name = 'test'; - this.isActive = false; - this.messages = []; - } - - getCardContent(filtersObj) { - return new PluginCardContent(this, filtersObj); - } - } - - beforeEach(() => { - filters = new loot.Filters(l10n); - plugin = new Plugin(); - }); - - it('should return true if no filters are enabled', () => { - filters.pluginFilter(plugin).should.be.true; - }); - - it('should return false if inactive plugins filter is enabled', () => { - filters.hideInactivePlugins = true; - filters.pluginFilter(plugin).should.be.false; - }); - - it('should return true if inactive plugins filter is enabled and plugin is active', () => { - filters.hideInactivePlugins = true; - plugin.isActive = true; - filters.pluginFilter(plugin).should.be.true; - }); - - it('should return false if messageless plugins filter is enabled', () => { - filters.hideMessagelessPlugins = true; - filters.pluginFilter(plugin).should.be.false; - }); - - it('should return true if messageless plugins filter is enabled and plugin has a non-zero message array', () => { - filters.hideMessagelessPlugins = true; - plugin.messages = [0]; - filters.pluginFilter(plugin).should.be.true; - }); - - it('should return false if all plugin messages and messageless plugin filters are enabled and plugin has a non-zero message array', () => { - filters.hideAllPluginMessages = true; - filters.hideMessagelessPlugins = true; - plugin.messages = [0]; - filters.pluginFilter(plugin).should.be.false; - }); - - it('should return false if conflicting plugins filter is enabled', () => { - filters.conflictingPluginNames = ['conflicting plugin']; - filters.pluginFilter(plugin).should.be.false; - }); - - it('should return true if conflicting plugins filter is enabled and plugin name is in the conflicting plugins array', () => { - filters.conflictingPluginNames = [ - 'conflicting plugin', - plugin.name, - ]; - filters.pluginFilter(plugin).should.be.true; - }); - - it('should return false if plugin content filter is enabled', () => { - filters.contentSearchString = 'unfound text'; - filters.pluginFilter(plugin).should.be.false; - }); - - it('should return true if plugin content filter is enabled and plugin contains the filter text', () => { - filters.contentSearchString = 'found text'; - filters.pluginFilter(plugin).should.be.true; - }); - }); - - describe('#messageFilter()', () => { - let filters; - let note; - let doNotCleanMessage; - - beforeEach(() => { - filters = new loot.Filters(l10n); - note = { - type: 'say', - text: 'test message', - }; - doNotCleanMessage = { - type: 'warn', - text: 'do not clean', - }; - }); - - it('should return true for a note message when no filters are enabled', () => { - filters.messageFilter(note).should.be.true; - }); - - it('should return true for a warning "do not clean" message when no filters are enabled', () => { - filters.messageFilter(doNotCleanMessage).should.be.true; - }); - - it('should return false for a note message when the notes filter is enabled', () => { - filters.hideNotes = true; - filters.messageFilter(note).should.be.false; - }); - - it('should return true for a warning message when the notes filter is enabled', () => { - filters.hideNotes = true; - filters.messageFilter(doNotCleanMessage).should.be.true; - }); - - it('should return false for a "do not clean" message when the "do not clean" messages filter is enabled', () => { - filters.hideDoNotCleanMessages = true; - filters.messageFilter(doNotCleanMessage).should.be.false; - }); - - it('should return true for a message not containing "do not clean" when the "do not clean" messages filter is enabled', () => { - filters.hideDoNotCleanMessages = true; - filters.messageFilter(note).should.be.true; - }); - - it('should return false for a note message when the all messages filter is enabled', () => { - filters.hideAllPluginMessages = true; - filters.messageFilter(note).should.be.false; - }); - - it('should return false for a "do not clean" message when the all messages filter is enabled', () => { - filters.hideAllPluginMessages = true; - filters.messageFilter(doNotCleanMessage).should.be.false; - }); - }); - - describe('#deactivateConflictsFilter', () => { - let filters; - let handleEvent; - - beforeEach(() => { - filters = new loot.Filters(l10n); - }); - - afterEach(() => { - document.removeEventListener('loot-filter-conflicts-deactivate', handleEvent); - }); - - it('should return false if the conflicts filter was not active', () => { - filters.deactivateConflictsFilter().should.be.false; - }); - - it('should return true if the conflicts filter was active', () => { - filters.conflictingPluginNames = ['Skyrim.esm']; - - filters.deactivateConflictsFilter().should.be.true; - }); - - it('should empty the conflicting plugin names array', () => { - filters.conflictingPluginNames = ['Skyrim.esm']; - - filters.deactivateConflictsFilter().should.be.true; - filters.conflictingPluginNames.should.have.length(0); - }); - - it('should fire an event', (done) => { - handleEvent = () => { - done(); - }; - - document.addEventListener('loot-filter-conflicts-deactivate', handleEvent); - - filters.deactivateConflictsFilter(); - }); - }); - - describe('#activateConflictsFilter', () => { - let filters; - - beforeEach(() => { - filters = new loot.Filters(l10n); - }); - - it('should return a promise that resolves to an empty array if the argument is falsy', () => { - filters.activateConflictsFilter().then((result) => { - result.should.be.an('array'); - return result.should.be.empty; - }); - }); - }); - - describe('#areAnyFiltersActive', () => { - let filters; - - beforeEach(() => { - filters = new loot.Filters(l10n); - }); - - it('should return false if all the boolean filters are false, and the content and conflict filter lengths are zero', () => { - filters.areAnyFiltersActive().should.be.false; - }); - - it('should return true if hideMessagelessPlugins is true', () => { - filters.hideMessagelessPlugins = true; - - filters.areAnyFiltersActive().should.be.true; - }); - - it('should return true if hideInactivePlugins is true', () => { - filters.hideInactivePlugins = true; - - filters.areAnyFiltersActive().should.be.true; - }); - - it('should return true if hideVersionNumbers is true', () => { - filters.hideVersionNumbers = true; - - filters.areAnyFiltersActive().should.be.true; - }); - - it('should return true if hideCRCs is true', () => { - filters.hideCRCs = true; - - filters.areAnyFiltersActive().should.be.true; - }); - - it('should return true if hideBashTags is true', () => { - filters.hideBashTags = true; - - filters.areAnyFiltersActive().should.be.true; - }); - - it('should return true if hideAllPluginMessages is true', () => { - filters.hideAllPluginMessages = true; - - filters.areAnyFiltersActive().should.be.true; - }); - - it('should return true if hideNotes is true', () => { - filters.hideNotes = true; - - filters.areAnyFiltersActive().should.be.true; - }); - - it('should return true if hideDoNotCleanMessages is true', () => { - filters.hideDoNotCleanMessages = true; - - filters.areAnyFiltersActive().should.be.true; - }); - - it('should return true if conflictingPluginNames is a non-empty array', () => { - filters.conflictingPluginNames = ['foo']; - - filters.areAnyFiltersActive().should.be.true; - }); - - it('should return true if contentSearchString is a non-empty string', () => { - filters.contentSearchString = 'foo'; - - filters.areAnyFiltersActive().should.be.true; - }); - }); -}); diff --git a/src/tests/gui/html/js/test_game.js b/src/tests/gui/html/js/test_game.js deleted file mode 100644 index af7caa6e..00000000 --- a/src/tests/gui/html/js/test_game.js +++ /dev/null @@ -1,658 +0,0 @@ -'use strict'; - -describe('Game', () => { - /* Mock the Translator class. */ - class Translator { - translate(text) { // eslint-disable-line class-methods-use-this - return text; - } - } - let l10n; - - beforeEach(() => { - l10n = new Translator(); - }); - - describe('#constructor()', () => { - it('should throw if passed no paramters', () => { - (() => { new loot.Game(); }).should.throw(); // eslint-disable-line no-new - }); - - it('should throw if passed no l10n parameter', () => { - (() => { new loot.Game({}); }).should.throw(); // eslint-disable-line no-new - }); - - it('should not throw if passed an empty object as the first parameter', () => { - (() => { new loot.Game({}, l10n); }).should.not.throw(); // eslint-disable-line no-new - }); - - it('should set folder to a blank string by default', () => { - const game = new loot.Game({}, l10n); - game.folder.should.equal(''); - }); - - it('should set folder to the object\'s value if defined', () => { - const game = new loot.Game({ folder: 'test' }, l10n); - game.folder.should.equal('test'); - }); - - it('should set globalMessages to an empty array by default', () => { - const game = new loot.Game({}, l10n); - game.globalMessages.should.deep.equal([]); - }); - - it('should set globalMessages to the object\'s value if defined', () => { - const game = new loot.Game({ globalMessages: ['test'] }, l10n); - game.globalMessages.should.deep.equal(['test']); - }); - - it('should set masterlist to an empty object by default', () => { - const game = new loot.Game({}, l10n); - game.masterlist.should.deep.equal({}); - }); - - it('should set masterlist to the object\'s value if defined', () => { - const game = new loot.Game({ masterlist: { revision: 0 } }, l10n); - game.masterlist.should.deep.equal({ revision: 0 }); - }); - - it('should set plugins to an empty array by default', () => { - const game = new loot.Game({}, l10n); - game.plugins.should.deep.equal([]); - }); - - it('should set plugins to the object\'s value if defined', () => { - const game = new loot.Game({ plugins: ['test'] }, l10n); - game.plugins.should.deep.equal(['test']); - }); - - it('should set loadOrder to undefined by default', () => { - const game = new loot.Game({}, l10n); - should.equal(undefined, game.loadOrder); - }); - - it('should set loadOrder to undefined even if the object\'s value if defined', () => { - const game = new loot.Game({ loadOrder: ['test'] }, l10n); - should.equal(undefined, game.loadOrder); - }); - - it('should set oldLoadOrder to undefined by default', () => { - const game = new loot.Game({}, l10n); - should.equal(undefined, game.oldLoadOrder); - }); - - it('should set oldLoadOrder to undefined even if the object\'s value if defined', () => { - const game = new loot.Game({ oldLoadOrder: ['test'] }, l10n); - should.equal(undefined, game.oldLoadOrder); - }); - - it('should initialise _notApplicableString', () => { - const game = new loot.Game({ oldLoadOrder: ['test'] }, l10n); - game._notApplicableString.should.equal('N/A'); - }); - }); - - describe('#folder', () => { - let game; - let handleEvent; - - beforeEach(() => { - game = new loot.Game({}, l10n); - }); - - afterEach(() => { - document.removeEventListener('loot-game-folder-change', handleEvent); - }); - - it('setting value should not dispatch an event if the new value is equal to the old one', (done) => { - handleEvent = () => { - done(new Error('Should not have fired an event')); - }; - document.addEventListener('loot-game-folder-change', handleEvent); - - game.folder = game.folder; - setTimeout(done, 100); - }); - - it('setting value should dispatch an event if the new value differs from the old one', (done) => { - handleEvent = (evt) => { - evt.detail.folder.should.equal('test'); - done(); - }; - document.addEventListener('loot-game-folder-change', handleEvent); - - game.folder = 'test'; - }); - }); - - describe('#globalMessages', () => { - let game; - let handleEvent; - - beforeEach(() => { - game = new loot.Game({}, l10n); - }); - - afterEach(() => { - document.removeEventListener('loot-game-global-messages-change', handleEvent); - }); - - it('setting value should not dispatch an event if the new value is equal to the old one', (done) => { - handleEvent = () => { - done(new Error('Should not have fired an event')); - }; - document.addEventListener('loot-game-global-messages-change', handleEvent); - - game.globalMessages = game.globalMessages; - setTimeout(done, 100); - }); - - it('setting value should dispatch an event if the new value differs from the old one', (done) => { - const newMessages = [ - { type: 'warn' }, - { type: 'error' }, - ]; - handleEvent = (evt) => { - evt.detail.messages.should.deep.equal(newMessages); - evt.detail.totalDiff.should.equal(2); - evt.detail.errorDiff.should.equal(1); - evt.detail.warningDiff.should.equal(1); - done(); - }; - document.addEventListener('loot-game-global-messages-change', handleEvent); - - game.globalMessages = newMessages; - }); - }); - - describe('#masterlist', () => { - let game; - let handleEvent; - - beforeEach(() => { - game = new loot.Game({}, l10n); - }); - - afterEach(() => { - document.removeEventListener('loot-game-masterlist-change', handleEvent); - }); - - it('setting value should not dispatch an event if the new value is equal to the old one', (done) => { - handleEvent = () => { - done(new Error('Should not have fired an event')); - }; - document.addEventListener('loot-game-masterlist-change', handleEvent); - - game.masterlist = game.masterlist; - setTimeout(done, 100); - }); - - it('setting value should dispatch an event if the new value differs from the old one', (done) => { - const newMasterlist = { - revision: 'foo', - date: 'bar', - }; - handleEvent = (evt) => { - evt.detail.should.deep.equal(newMasterlist); - done(); - }; - document.addEventListener('loot-game-masterlist-change', handleEvent); - - game.masterlist = newMasterlist; - }); - - it('setting value to undefined should dispatch an event with the details being the not applicable string', (done) => { - handleEvent = (evt) => { - evt.detail.revision.should.equal(game._notApplicableString); - evt.detail.date.should.equal(game._notApplicableString); - done(); - }; - document.addEventListener('loot-game-masterlist-change', handleEvent); - - game.masterlist = undefined; - }); - }); - - describe('#plugins', () => { - let game; - let handleEvent; - - beforeEach(() => { - game = new loot.Game({}, l10n); - }); - - afterEach(() => { - document.removeEventListener('loot-game-plugins-change', handleEvent); - }); - - it('setting value should dispatch an event if the new value is equal to the old one', (done) => { - handleEvent = () => { - done(); - }; - document.addEventListener('loot-game-plugins-change', handleEvent); - - game.plugins = game.plugins; - }); - - it('setting value should dispatch an event if the new value differs from the old one', (done) => { - const newPlugins = [ - { - isActive: true, - messages: [{ type: 'warn' }], - }, - { - isDirty: true, - messages: [{ type: 'say' }], - }, - ]; - handleEvent = (evt) => { - evt.detail.valuesAreTotals.should.be.true; - evt.detail.totalMessageNo.should.equal(4); - evt.detail.warnMessageNo.should.equal(2); - evt.detail.errorMessageNo.should.equal(1); - evt.detail.totalPluginNo.should.equal(2); - evt.detail.activePluginNo.should.equal(1); - evt.detail.dirtyPluginNo.should.equal(1); - done(); - }; - document.addEventListener('loot-game-plugins-change', handleEvent); - - /* Set global messages to check they are also counted in the totals. */ - game.globalMessages = [ - { type: 'warn' }, - { type: 'error' }, - ]; - - game.plugins = newPlugins; - }); - }); - - describe('#appendPlugin()', () => { - let game; - let handleEvent; - - beforeEach(() => { - game = new loot.Game({}, l10n); - }); - - afterEach(() => { - document.removeEventListener('loot-game-plugins-change', handleEvent); - }); - - it('should append the passed plugin to the plugins array', () => { - const newPlugin = { - isActive: true, - messages: [{ type: 'warn' }], - }; - game.appendPlugin(newPlugin); - - game.plugins[0].should.deep.equal(newPlugin); - }); - - it('should dispatch an event with the correct counter differences', (done) => { - handleEvent = (evt) => { - evt.detail.valuesAreTotals.should.be.false; - evt.detail.totalMessageNo.should.equal(1); - evt.detail.warnMessageNo.should.equal(1); - evt.detail.errorMessageNo.should.equal(0); - evt.detail.totalPluginNo.should.equal(1); - evt.detail.activePluginNo.should.equal(1); - evt.detail.dirtyPluginNo.should.equal(0); - done(); - }; - document.addEventListener('loot-game-plugins-change', handleEvent); - - /* Set global messages to check they are also counted in the totals. */ - game.globalMessages = [ - { type: 'warn' }, - { type: 'error' }, - ]; - - game.appendPlugin({ - isActive: true, - messages: [{ type: 'warn' }], - }); - }); - }); - - describe('#removePluginAtIndex()', () => { - let game; - let handleEvent; - - beforeEach(() => { - game = new loot.Game({}, l10n); - game._plugins = [{ - isActive: true, - messages: [{ type: 'warn' }], - }]; - }); - - afterEach(() => { - document.removeEventListener('loot-game-plugins-change', handleEvent); - }); - - it('should remove the passed plugin to the plugins array', () => { - game.removePluginAtIndex(0); - game.plugins.length.should.equal(0); - }); - - it('should dispatch an event with the correct counter differences', (done) => { - handleEvent = (evt) => { - evt.detail.valuesAreTotals.should.be.false; - evt.detail.totalMessageNo.should.equal(-1); - evt.detail.warnMessageNo.should.equal(-1); - evt.detail.errorMessageNo.should.equal(0); - evt.detail.totalPluginNo.should.equal(-1); - evt.detail.activePluginNo.should.equal(-1); - evt.detail.dirtyPluginNo.should.equal(0); - done(); - }; - document.addEventListener('loot-game-plugins-change', handleEvent); - - /* Set global messages to check they are also counted in the totals. */ - game.globalMessages = [ - { type: 'warn' }, - { type: 'error' }, - ]; - - game.removePluginAtIndex(0); - }); - }); - - describe('#getContent()', () => { - let game; - - beforeEach(() => { - game = new loot.Game({}, l10n); - }); - - it('should return an object of two empty arrays if there is no game data', () => { - game.getContent().should.deep.equal({ - messages: [], - plugins: [], - }); - }); - - it('should return a structure containing converted plugin and message structures', () => { - game._globalMessages = [{ - type: 'say', - condition: 'file("foo.esp")', - language: 'fr', - text: 'Bonjour le monde', - }]; - game._plugins = [{ - name: 'foo', - crc: 0xDEADBEEF, - version: '1.0', - isActive: true, - isEmpty: true, - loadsArchive: true, - - masterlist: {}, - userlist: {}, - - priority: -100, - globalPriority: 100, - messages: [{ - type: 'warn', - condition: 'file("bar.esp")', - language: 'en', - text: 'Hello world', - }], - tags: ['invalidStructure'], - isDirty: true, - - id: '', - _isEditorOpen: true, - _isSearchResult: true, - }]; - - game.getContent().should.deep.equal({ - messages: game._globalMessages, - plugins: [{ - name: game._plugins[0].name, - crc: game._plugins[0].crc, - version: game._plugins[0].version, - isActive: game._plugins[0].isActive, - isEmpty: game._plugins[0].isEmpty, - loadsArchive: game._plugins[0].loadsArchive, - - priority: game._plugins[0].priority, - globalPriority: game._plugins[0].globalPriority, - messages: game._plugins[0].messages, - tags: game._plugins[0].tags, - isDirty: game._plugins[0].isDirty, - }], - }); - }); - }); - - describe('#getPluginNames()', () => { - let game; - - beforeEach(() => { - game = new loot.Game({}, l10n); - }); - - it('should return an empty array if there are no plugins', () => { - game.getPluginNames().should.be.empty; - }); - - it('should return an array of plugin filenames if there are plugins', () => { - game._plugins = [{ - name: 'foo', - isActive: true, - messages: [{ type: 'warn' }], - }]; - - game.getPluginNames().should.deep.equal(['foo']); - }); - }); - - describe('#setSortedPlugins', () => { - let game; - let handleEvent; - - beforeEach(() => { - game = new loot.Game({}, l10n); - }); - - afterEach(() => { - document.removeEventListener('loot-game-plugins-change', handleEvent); - }); - - it('should append new plugins to the plugins array', () => { - game.setSortedPlugins([{ - name: 'foo', - }]); - - game.plugins[0].name.should.equal('foo'); - }); - - it('should update existing plugins with new data', () => { - game._plugins = [new loot.Plugin({ - name: 'foo', - isActive: true, - messages: [{ type: 'warn' }], - })]; - - game.setSortedPlugins([{ - name: 'foo', - crc: 0xDEADBEEF, - }]); - - game.plugins[0].crc.should.equal(0xDEADBEEF); - game.plugins[0].isActive.should.be.true; - }); - - it('should reorder plugins to given order', () => { - game._plugins = [new loot.Plugin({ - name: 'foo', - }), new loot.Plugin({ - name: 'bar', - })]; - - game.setSortedPlugins([{ - name: 'bar', - }, { - name: 'foo', - }]); - - game.plugins[0].name.should.equal('bar'); - game.plugins[1].name.should.equal('foo'); - }); - - it('should store old load order', () => { - game._plugins = [new loot.Plugin({ - name: 'foo', - }), new loot.Plugin({ - name: 'bar', - })]; - - game.setSortedPlugins([{ - name: 'bar', - }, { - name: 'foo', - }]); - - game.oldLoadOrder[0].name.should.equal('foo'); - game.oldLoadOrder[1].name.should.equal('bar'); - }); - - it('should dispatch an event', (done) => { - handleEvent = () => { - done(); - }; - document.addEventListener('loot-game-plugins-change', handleEvent); - - game.setSortedPlugins([{ - name: 'foo', - }]); - }); - }); - - describe('#applySort', () => { - let game; - - beforeEach(() => { - game = new loot.Game({}, l10n); - }); - - it('should delete the stored old load order', () => { - game.oldLoadOrder = [0, 1, 2]; - - game.applySort(); - - should.equal(undefined, game.oldLoadOrder); - }); - }); - - describe('#cancelSort', () => { - let game; - - beforeEach(() => { - game = new loot.Game({}, l10n); - }); - - it('should throw if no parameters are supplied', () => { - (() => { game.cancelSort(); }).should.throw(); - }); - - it('should set the current load order to the old load order', () => { - const oldLoadOrder = [new loot.Plugin({ - name: 'foo', - }), new loot.Plugin({ - name: 'bar', - })]; - game.oldLoadOrder = oldLoadOrder; - game.plugins = [new loot.Plugin({ - name: 'bar', - }), new loot.Plugin({ - name: 'foo', - })]; - - game.cancelSort([]); - - game.plugins.should.deep.equal(oldLoadOrder); - }); - - it('should delete the stored old load order', () => { - game.oldLoadOrder = [new loot.Plugin({ - name: 'foo', - }), new loot.Plugin({ - name: 'bar', - })]; - - game.cancelSort([]); - - should.equal(undefined, game.oldLoadOrder); - }); - - it('should set plugin load order indices using the array passed as the first parameter', () => { - game.oldLoadOrder = [new loot.Plugin({ - name: 'foo', - loadOrderIndex: 1, - }), new loot.Plugin({ - name: 'bar', - loadOrderIndex: 0, - })]; - - game.cancelSort([new loot.Plugin({ - name: 'bar', - loadOrderIndex: 1, - }), new loot.Plugin({ - name: 'foo', - loadOrderIndex: 0, - })]); - - game.plugins[0].name.should.equal('foo'); - game.plugins[0].loadOrderIndex.should.equal(0); - game.plugins[1].name.should.equal('bar'); - game.plugins[1].loadOrderIndex.should.equal(1); - }); - - it('should set the global messages to the second passed parameter', () => { - game.oldLoadOrder = [0, 1, 2]; - - game.cancelSort([], ['foo']); - - game.globalMessages.should.deep.equal(['foo']); - }); - }); - - describe('#clearMetadata', () => { - let game; - - beforeEach(() => { - game = new loot.Game({}, l10n); - }); - - it('should delete stored userlist data for existing plugins', () => { - game._plugins = [new loot.Plugin({ - name: 'foo', - userlist: {}, - })]; - - game.clearMetadata([{ - name: 'foo', - }]); - - should.equal(undefined, game.plugins[0].userlist); - }); - - it('should update existing plugin data', () => { - game._plugins = [new loot.Plugin({ - name: 'foo', - isActive: true, - })]; - - game.clearMetadata([{ - name: 'foo', - crc: 0xDEADBEEF, - }]); - - game.plugins[0].crc.should.equal(0xDEADBEEF); - game.plugins[0].isActive.should.be.true; - }); - }); -}); diff --git a/src/tests/gui/html/js/test_plugin.js b/src/tests/gui/html/js/test_plugin.js deleted file mode 100644 index 3c97d23f..00000000 --- a/src/tests/gui/html/js/test_plugin.js +++ /dev/null @@ -1,1341 +0,0 @@ -'use strict'; - -/* Mock the filters class. */ -class Filters { - constructor() { - this.hideVersionNumbers = false; - this.hideCRCs = false; - this.hideBashTags = false; - this.hideAllPluginMessages = false; - this.hideNotes = false; - this.hideDoNotCleanMessages = false; - } - - messageFilter(message, index) { - if (this.hideAllPluginMessages) { - return false; - } - - if (this.hideNotes && index === 0) { - return false; - } - - if (this.hideDoNotCleanMessages && index === 1) { - return false; - } - - return true; - } -} - -describe('Plugin', () => { - describe('#Plugin()', () => { - it('should throw if nothing is passed', () => { - (() => { new loot.Plugin(); }).should.throw(); // eslint-disable-line no-new - }); - - it('should throw if an object with no name key is passed', () => { - (() => { new loot.Plugin({}); }).should.throw(); // eslint-disable-line no-new - }); - - it('should not throw if some members are undefined', () => { - (() => { new loot.Plugin({ name: 'test' }); }).should.not.throw(); // eslint-disable-line no-new - }); - - it('should set name to passed key\'s value', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.name.should.equal('test'); - }); - - it('should set crc to zero if no key was passed', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.crc.should.equal(0); - }); - - it('should set crc to passed key\'s value', () => { - const plugin = new loot.Plugin({ - name: 'test', - crc: 0xDEADBEEF, - }); - - plugin.crc.should.equal(0xDEADBEEF); - }); - - it('should set version to an empty string if no key was passed', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.version.should.equal(''); - }); - - it('should set version to passed key\'s value', () => { - const plugin = new loot.Plugin({ - name: 'test', - version: 'foo', - }); - - plugin.version.should.equal('foo'); - }); - - it('should set isActive value to false if no key was passed', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.isActive.should.be.false; - }); - - it('should set isActive to passed key\'s value', () => { - const plugin = new loot.Plugin({ - name: 'test', - isActive: true, - }); - - plugin.isActive.should.be.true; - }); - - it('should set isEmpty value to false if no key was passed', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.isEmpty.should.be.false; - }); - - it('should set isEmpty to passed key\'s value', () => { - const plugin = new loot.Plugin({ - name: 'test', - isEmpty: true, - }); - - plugin.isEmpty.should.be.true; - }); - - it('should set isMaster value to false if no key was passed', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.isMaster.should.be.false; - }); - - it('should set isMaster to passed key\'s value', () => { - const plugin = new loot.Plugin({ - name: 'test', - isMaster: true, - }); - - plugin.isMaster.should.be.true; - }); - - it('should set loadsArchive value to false if no key was passed', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.loadsArchive.should.be.false; - }); - - it('should set loadsArchive to passed key\'s value', () => { - const plugin = new loot.Plugin({ - name: 'test', - loadsArchive: true, - }); - - plugin.loadsArchive.should.be.true; - }); - - it('should set masterlist value to undefined if no key was passed', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - should.equal(undefined, plugin.masterlist); - }); - - it('should set masterlist to passed key\'s value', () => { - const plugin = new loot.Plugin({ - name: 'test', - masterlist: {}, - }); - - plugin.masterlist.should.be.deep.equal({}); - }); - - it('should set userlist value to undefined if no key was passed', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - should.equal(undefined, plugin.userlist); - }); - - it('should set userlist to passed key\'s value', () => { - const plugin = new loot.Plugin({ - name: 'test', - userlist: {}, - }); - - plugin.userlist.should.be.deep.equal({}); - }); - - it('should set priority to 0 if no key was passed', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.priority.should.equal(0); - }); - - it('should set priority to passed key\'s value', () => { - const plugin = new loot.Plugin({ - name: 'test', - priority: 5, - }); - - plugin.priority.should.equal(5); - }); - - it('should set global priority to 0 if no key was passed', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.globalPriority.should.equal(0); - }); - - it('should set global priority to passed key\'s value', () => { - const plugin = new loot.Plugin({ - name: 'test', - globalPriority: 5, - }); - - plugin.globalPriority.should.equal(5); - }); - - it('should set messages value to an empty array if no key was passed', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.messages.length.should.equal(0); - }); - - it('should set messages to passed key\'s value', () => { - const messages = [{ - type: 'say', - text: 'test message', - }]; - const plugin = new loot.Plugin({ - name: 'test', - messages, - }); - - plugin.messages.should.deep.equal(messages); - }); - - it('should set tags value to an empty array if no key was passed', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.tags.length.should.equal(0); - }); - - it('should set tags to passed key\'s value', () => { - const tags = [{ - name: 'Delev', - }]; - const plugin = new loot.Plugin({ - name: 'test', - tags, - }); - - plugin.tags.should.deep.equal(tags); - }); - - it('should set isDirty value to false if no key was passed', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.isDirty.should.be.false; - }); - - it('should set isDirty to passed key\'s value', () => { - const plugin = new loot.Plugin({ - name: 'test', - isDirty: true, - }); - - plugin.isDirty.should.be.true; - }); - - it('should set cleanedWith value to an empty string if no key was passed', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.cleanedWith.should.equal(''); - }); - - it('should set cleanedWith to passed key\'s value', () => { - const plugin = new loot.Plugin({ - name: 'test', - cleanedWith: 'TES5Edit 3.11', - }); - - plugin.cleanedWith.should.equal('TES5Edit 3.11'); - }); - - it('should set id to the plugins name without spaces', () => { - const plugin = new loot.Plugin({ name: 'test plugin name' }); - - plugin.id.should.equal('testpluginname'); - }); - - it('should set isEditorOpen to false', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.isEditorOpen.should.be.false; - }); - - it('should set isSearchResult to false', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.isSearchResult.should.be.false; - }); - }); - - describe('#update()', () => { - let plugin; - const updatedPlugin = { - name: 'test', - foo: 'bar', - crc: 0xDEADBEEF, - }; - - beforeEach(() => { - plugin = new loot.Plugin({ name: 'test' }); - }); - - it('should do nothing if its argument is undefined', () => { - plugin.update(); - - plugin.should.deep.equal(new loot.Plugin({ name: 'test' })); - }); - - it('should throw if the argument has no name property', () => { - (() => { plugin.update({}); }).should.throw(Error); - }); - - it('should throw if the argument\'s name property doesn\'t match the plugin\'s name', () => { - (() => { plugin.update({ name: 'other test' }); }).should.throw(Error); - }); - - it('should set property values for all the given argument\'s properties', () => { - plugin.update(updatedPlugin); - - plugin.foo.should.equal(updatedPlugin.foo); - plugin.crc.should.equal(updatedPlugin.crc); - }); - - it('should not change property values for properties not present in the argument', () => { - plugin.isActive = true; - - plugin.update(updatedPlugin); - - plugin.foo.should.equal(updatedPlugin.foo); - plugin.crc.should.equal(updatedPlugin.crc); - plugin.isActive.should.be.true; - }); - - it('should set explicitly undefined values', () => { - plugin.isActive = true; - - plugin.update({ - name: plugin.name, - isActive: undefined, - }); - - should.equal(undefined, plugin.isActive); - }); - }); - - describe('#fromJson()', () => { - it('should return the value object if the JSON is not of the Plugin type', () => { - const testInputObj = { - name: 'test', - crc: 0xDEADBEEF, - }; - const testInputJson = JSON.stringify(testInputObj); - - JSON.parse(testInputJson, loot.Plugin.fromJson).should.deep.equal(testInputObj); - }); - - it('should return a Plugin object if the JSON is of the Plugin type', () => { - const testInputObj = { - name: 'test', - crc: 0xDEADBEEF, - __type: 'Plugin', - }; - const testInputJson = JSON.stringify(testInputObj); - - JSON.parse(testInputJson, loot.Plugin.fromJson).should.be.instanceof(loot.Plugin); - }); - }); - - describe('#tagFromRowData()', () => { - it('should throw if passed nothing', () => { - (() => { loot.Plugin.tagFromRowData(); }).should.throw(); - }); - - it('should return an empty object if passed nothing', () => { - (() => { loot.Plugin.tagFromRowData({}); }).should.throw(); - }); - - it('should return a raw metadata object if passed a row data object that removes a tag', () => { - loot.Plugin.tagFromRowData({ - condition: 'foo', - type: 'remove', - name: 'bar', - }).should.deep.equal({ - condition: 'foo', - name: '-bar', - }); - }); - - it('should return a raw metadata object if passed a row data object that adds a tag', () => { - loot.Plugin.tagFromRowData({ - condition: 'foo', - type: 'add', - name: 'bar', - }).should.deep.equal({ - condition: 'foo', - name: 'bar', - }); - }); - }); - - describe('#tagToRowData()', () => { - it('should throw if passed nothing', () => { - (() => { loot.Plugin.tagToRowData(); }).should.throw(); - }); - - it('should return an empty object if passed nothing', () => { - (() => { loot.Plugin.tagToRowData({}); }).should.throw(); - }); - - it('should return a row data object if passed a raw metadata object that removes a tag', () => { - loot.Plugin.tagToRowData({ - condition: 'foo', - name: '-bar', - }).should.deep.equal({ - condition: 'foo', - type: 'remove', - name: 'bar', - }); - }); - - it('should return a row data object if passed a raw metadata object that adds a tag', () => { - loot.Plugin.tagToRowData({ - condition: 'foo', - name: 'bar', - }).should.deep.equal({ - condition: 'foo', - type: 'add', - name: 'bar', - }); - }); - }); - - describe('#messages', () => { - let handleEvent; - - afterEach(() => { - document.removeEventListener('loot-plugin-message-change', handleEvent); - }); - - it('getting messages if they are undefined should return undefined', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.should.not.have.ownProperty('messages'); - }); - - it('getting messages if the array is empty should return an empty array', () => { - const plugin = new loot.Plugin({ - name: 'test', - messages: [], - }); - - plugin.messages.should.be.an('array'); - plugin.messages.should.be.empty; - }); - - it('getting messages should return any that are set', () => { - const messages = [{ - type: 'say', - text: 'test message', - }]; - const plugin = new loot.Plugin({ - name: 'test', - messages, - }); - - plugin.messages.should.be.deep.equal(messages); - }); - - it('setting messages should store any set', () => { - const plugin = new loot.Plugin({ - name: 'test', - messages: [], - }); - const messages = [{ - type: 'say', - text: 'test message', - }]; - - plugin.messages = messages; - - plugin.messages.should.be.deep.equal(messages); - }); - - it('setting messages should not fire an event if no messages were changed', (done) => { - const plugin = new loot.Plugin({ - name: 'test', - messages: [{ - type: 'say', - text: 'test message', - }], - }); - - handleEvent = () => { - done(new Error('Should not have fired an event')); - }; - - document.addEventListener('loot-plugin-message-change', handleEvent); - - plugin.messages = plugin.messages; - - setTimeout(done, 100); - }); - - it('setting messages should fire an event if the messages were changed', (done) => { - const plugin = new loot.Plugin({ - name: 'test', - messages: [], - }); - const messages = [{ - type: 'error', - text: 'test message', - }]; - - handleEvent = (evt) => { - evt.detail.pluginId.should.equal(plugin.id); - evt.detail.totalDiff.should.equal(1); - evt.detail.warningDiff.should.equal(0); - evt.detail.errorDiff.should.equal(1); - done(); - }; - - document.addEventListener('loot-plugin-message-change', handleEvent); - - plugin.messages = messages; - }); - }); - - describe('#isDirty', () => { - let handleEvent; - - afterEach(() => { - document.removeEventListener('loot-plugin-cleaning-data-change', handleEvent); - }); - - it('getting value should return false if isDirty has not been set in the constructor', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.isDirty.should.be.false; - }); - - it('getting value should return true if isDirty is set to true in the constructor', () => { - const plugin = new loot.Plugin({ - name: 'test', - isDirty: true, - }); - - plugin.isDirty.should.be.true; - }); - - it('setting value should store set value', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.isDirty = true; - - plugin.isDirty.should.be.true; - }); - - it('setting value to the current value should not fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - - handleEvent = () => { - done(new Error('Should not have fired an event')); - }; - - document.addEventListener('loot-plugin-cleaning-data-change', handleEvent); - - plugin.isDirty = plugin.isDirty; - - setTimeout(done, 100); - }); - - it('setting value not equal to the current value should fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - - handleEvent = (evt) => { - evt.detail.isDirty.should.be.true; - done(); - }; - - document.addEventListener('loot-plugin-cleaning-data-change', handleEvent); - - plugin.isDirty = !plugin.isDirty; - }); - }); - - describe('#cleanedWith', () => { - let handleEvent; - - afterEach(() => { - document.removeEventListener('loot-plugin-cleaning-data-change', handleEvent); - }); - - it('getting value should return an empty string if cleanedWith has not been set in the constructor', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.cleanedWith.should.equal(''); - }); - - it('getting value should return a string if cleanedWith is set in the constructor', () => { - const plugin = new loot.Plugin({ - name: 'test', - cleanedWith: 'utility', - }); - - plugin.cleanedWith.should.equal('utility'); - }); - - it('setting value should store set value', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.cleanedWith = 'utility'; - - plugin.cleanedWith.should.equal('utility'); - }); - - it('setting value to the current value should not fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - - handleEvent = () => { - done(new Error('Should not have fired an event')); - }; - - document.addEventListener('loot-plugin-cleaning-data-change', handleEvent); - - plugin.cleanedWith = plugin.cleanedWith; - - setTimeout(done, 100); - }); - - it('setting value not equal to the current value should fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - - handleEvent = (evt) => { - evt.detail.cleanedWith.should.equal('utility'); - done(); - }; - - document.addEventListener('loot-plugin-cleaning-data-change', handleEvent); - - plugin.cleanedWith = 'utility'; - }); - }); - - describe('#crc', () => { - let handleEvent; - - afterEach(() => { - document.removeEventListener('loot-plugin-card-content-change', handleEvent); - }); - - it('getting value should return 0 if crc has not been set in the constructor', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.crc.should.equal(0); - }); - - it('getting value should return 0xDEADBEEF if it was set in the constructor', () => { - const plugin = new loot.Plugin({ - name: 'test', - crc: 0xDEADBEEF, - }); - - plugin.crc.should.equal(0xDEADBEEF); - }); - - it('setting value should store set value', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.crc = 0xDEADBEEF; - - plugin.crc.should.equal(0xDEADBEEF); - }); - - it('setting value to the current value should not fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - - handleEvent = () => { - done(new Error('Should not have fired an event')); - }; - - document.addEventListener('loot-plugin-card-content-change', handleEvent); - - plugin.crc = plugin.crc; - - setTimeout(done, 100); - }); - - it('setting value not equal to the current value should fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - - handleEvent = (evt) => { - evt.detail.pluginId.should.equal(plugin.id); - done(); - }; - - document.addEventListener('loot-plugin-card-content-change', handleEvent); - - plugin.crc = 0xDEADBEEF; - }); - }); - - describe('#tags', () => { - let handleEvent; - - afterEach(() => { - document.removeEventListener('loot-plugin-card-content-change', handleEvent); - }); - - it('getting value should return an empty array if tags have not been set in the constructor', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.tags.length.should.equal(0); - }); - - it('getting value should return any tags that are set', () => { - const tags = [{ - name: 'Delev', - }]; - const plugin = new loot.Plugin({ - name: 'test', - tags, - }); - - plugin.tags.should.deep.equal(tags); - }); - - it('setting value should store set value', () => { - const plugin = new loot.Plugin({ name: 'test' }); - const tags = [{ - name: 'Delev', - }]; - - plugin.tags = tags; - - plugin.tags.should.deep.equal(tags); - }); - - it('setting value to the current value should not fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - - handleEvent = () => { - done(new Error('Should not have fired an event')); - }; - - document.addEventListener('loot-plugin-card-content-change', handleEvent); - - plugin.tags = plugin.tags; - - setTimeout(done, 100); - }); - - it('setting value not equal to the current value should fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - const tags = [{ - name: 'Delev', - }]; - - handleEvent = (evt) => { - evt.detail.pluginId.should.equal(plugin.id); - done(); - }; - - document.addEventListener('loot-plugin-card-content-change', handleEvent); - - plugin.tags = tags; - }); - }); - - describe('#userlist', () => { - let handleEvent; - - afterEach(() => { - document.removeEventListener('loot-plugin-item-content-change', handleEvent); - }); - - it('getting value should return undefined if it has not been set in the constructor', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - should.equal(undefined, plugin.userlist); - }); - - it('getting value should return the value that was set', () => { - const plugin = new loot.Plugin({ - name: 'test', - userlist: {}, - }); - - plugin.userlist.should.deep.equal({}); - }); - - it('setting value should store set value', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.userlist = {}; - - plugin.userlist.should.deep.equal({}); - }); - - it('setting value to the current value should not fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - - handleEvent = () => { - done(new Error('Should not have fired an event')); - }; - - document.addEventListener('loot-plugin-item-content-change', handleEvent); - - plugin.userlist = plugin.userlist; - - setTimeout(done, 100); - }); - - it('setting value not equal to the current value should fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - - handleEvent = (evt) => { - evt.detail.pluginId.should.equal(plugin.id); - evt.detail.priority.should.equal(plugin.priority); - evt.detail.globalPriority.should.equal(plugin.globalPriority); - evt.detail.isEditorOpen.should.equal(plugin.isEditorOpen); - evt.detail.hasUserEdits.should.equal(plugin.hasUserEdits); - done(); - }; - - document.addEventListener('loot-plugin-item-content-change', handleEvent); - - plugin.userlist = { priority: 1 }; - }); - }); - - describe('#priority', () => { - let handleEvent; - - afterEach(() => { - document.removeEventListener('loot-plugin-item-content-change', handleEvent); - }); - - it('getting value should return 0 if it has not been set in the constructor', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.priority.should.equal(0); - }); - - it('getting value should return the value that was set', () => { - const plugin = new loot.Plugin({ - name: 'test', - priority: 5, - }); - - plugin.priority.should.equal(5); - }); - - it('setting value should store set value', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.priority = 5; - - plugin.priority.should.equal(5); - }); - - it('setting value to the current value should not fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - - handleEvent = () => { - done(new Error('Should not have fired an event')); - }; - - document.addEventListener('loot-plugin-item-content-change', handleEvent); - - plugin.priority = plugin.priority; - - setTimeout(done, 100); - }); - - it('setting value not equal to the current value should fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - - handleEvent = (evt) => { - evt.detail.pluginId.should.equal(plugin.id); - evt.detail.priority.should.equal(plugin.priority); - evt.detail.globalPriority.should.equal(plugin.globalPriority); - evt.detail.isEditorOpen.should.equal(plugin.isEditorOpen); - evt.detail.hasUserEdits.should.equal(plugin.hasUserEdits); - done(); - }; - - document.addEventListener('loot-plugin-item-content-change', handleEvent); - - plugin.priority = 5; - }); - }); - - describe('#globalPriority', () => { - let handleEvent; - - afterEach(() => { - document.removeEventListener('loot-plugin-item-content-change', handleEvent); - }); - - it('getting value should return 0 if it has not been set in the constructor', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.globalPriority.should.equal(0); - }); - - it('getting value should return the value that was set', () => { - const plugin = new loot.Plugin({ - name: 'test', - globalPriority: 5, - }); - - plugin.globalPriority.should.equal(5); - }); - - it('setting value should store set value', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.globalPriority = 5; - - plugin.globalPriority.should.equal(5); - }); - - it('setting value to the current value should not fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - - handleEvent = () => { - done(new Error('Should not have fired an event')); - }; - - document.addEventListener('loot-plugin-item-content-change', handleEvent); - - plugin.globalPriority = plugin.globalPriority; - - setTimeout(done, 100); - }); - - it('setting value not equal to the current value should fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - - handleEvent = (evt) => { - evt.detail.pluginId.should.equal(plugin.id); - evt.detail.priority.should.equal(plugin.priority); - evt.detail.globalPriority.should.equal(plugin.globalPriority); - evt.detail.isEditorOpen.should.equal(plugin.isEditorOpen); - evt.detail.hasUserEdits.should.equal(plugin.hasUserEdits); - done(); - }; - - document.addEventListener('loot-plugin-item-content-change', handleEvent); - - plugin.globalPriority = 5; - }); - }); - - describe('#isEditorOpen', () => { - let handleEvent; - - afterEach(() => { - document.removeEventListener('loot-plugin-item-content-change', handleEvent); - }); - - it('getting value should return false if it has not been set in the constructor', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.isEditorOpen.should.be.false; - }); - - it('setting value should store set value', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.isEditorOpen = true; - - plugin.isEditorOpen.should.be.true; - }); - - it('setting value to the current value should not fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - - handleEvent = () => { - done(new Error('Should not have fired an event')); - }; - - document.addEventListener('loot-plugin-item-content-change', handleEvent); - - plugin.isEditorOpen = plugin.isEditorOpen; - - setTimeout(done, 100); - }); - - it('setting value not equal to the current value should fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - - handleEvent = (evt) => { - evt.detail.pluginId.should.equal(plugin.id); - evt.detail.priority.should.equal(plugin.priority); - evt.detail.globalPriority.should.equal(plugin.globalPriority); - evt.detail.isEditorOpen.should.equal(plugin.isEditorOpen); - evt.detail.hasUserEdits.should.equal(plugin.hasUserEdits); - done(); - }; - - document.addEventListener('loot-plugin-item-content-change', handleEvent); - - plugin.isEditorOpen = true; - }); - }); - - describe('#isSearchResult', () => { - let handleEvent; - - afterEach(() => { - document.removeEventListener('loot-plugin-card-styling-change', handleEvent); - }); - - it('getting value should return false if it has not been set in the constructor', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.isSearchResult.should.be.false; - }); - - it('setting value should store set value', () => { - const plugin = new loot.Plugin({ name: 'test' }); - - plugin.isSearchResult = true; - - plugin.isSearchResult.should.be.true; - }); - - it('setting value to the current value should not fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - - handleEvent = () => { - done(new Error('Should not have fired an event')); - }; - - document.addEventListener('loot-plugin-card-styling-change', handleEvent); - - plugin.isSearchResult = plugin.isSearchResult; - - setTimeout(done, 100); - }); - - it('setting value not equal to the current value should fire an event', (done) => { - const plugin = new loot.Plugin({ name: 'test' }); - - handleEvent = (evt) => { - evt.detail.pluginId.should.equal(plugin.id); - done(); - }; - - document.addEventListener('loot-plugin-card-styling-change', handleEvent); - - plugin.isSearchResult = true; - }); - }); - - describe('#getCardContent()', () => { - let plugin; - beforeEach(() => { - plugin = new loot.Plugin({ name: 'test' }); - }); - - it('should throw if no argument was passed', () => { - (() => { plugin.getCardContent(); }).should.throw(); - }); - - it('should throw with an empty object', () => { - plugin.messages = [{ - type: 'say', - text: 'test message', - }]; - - (() => { plugin.getCardContent({}); }).should.throw(); - }); - - it('should succeed if passed a filters object', () => { - (() => { plugin.getCardContent(new Filters()); }).should.not.throw(); - }); - }); -}); - -describe('PluginCardContent', () => { - let plugin; - let filters; - - beforeEach(() => { - plugin = new loot.Plugin({ - name: 'test', - version: 'foo', - messages: [ - { - type: 'say', - text: 'test message', - language: 'en', - }, - { - type: 'warn', - text: 'do not clean', - language: 'en', - }, - ], - }); - - filters = new Filters(); - }); - - describe('#name', () => { - it('getting value should return plugin\'s value', () => { - plugin.getCardContent(filters).name.should.equal(plugin.name); - }); - - it('setting value should throw', () => { - (() => { plugin.getCardContent(filters).name = ''; }).should.throw(); - }); - }); - - describe('#isActive', () => { - it('getting value should return plugin\'s value', () => { - plugin.getCardContent(filters).isActive.should.equal(plugin.isActive); - }); - - it('setting value should throw', () => { - (() => { plugin.getCardContent(filters).isActive = true; }).should.throw(); - }); - }); - - describe('#isEmpty', () => { - it('getting value should return plugin\'s value', () => { - plugin.getCardContent(filters).isEmpty.should.equal(plugin.isEmpty); - }); - - it('setting value should throw', () => { - (() => { plugin.getCardContent(filters).isEmpty = true; }).should.throw(); - }); - }); - - describe('#isMaster', () => { - it('getting value should return plugin\'s value', () => { - plugin.getCardContent(filters).isMaster.should.equal(plugin.isMaster); - }); - - it('setting value should throw', () => { - (() => { plugin.getCardContent(filters).isMaster = true; }).should.throw(); - }); - }); - - describe('#loadsArchive', () => { - it('getting value should return plugin\'s value', () => { - plugin.getCardContent(filters).loadsArchive.should.equal(plugin.loadsArchive); - }); - - it('setting value should throw', () => { - (() => { plugin.getCardContent(filters).loadsArchive = true; }).should.throw(); - }); - }); - - describe('#version', () => { - it('getting value should return plugin\'s value if the version filter is not enabled', () => { - plugin.getCardContent(filters).version.should.equal(plugin.version); - }); - - it('getting value should return empty string if the version filter is enabled', () => { - filters.hideVersionNumbers = true; - plugin.getCardContent(filters).version.should.equal(''); - }); - - it('setting value should throw', () => { - (() => { plugin.getCardContent(filters).version = ''; }).should.throw(); - }); - }); - - describe('#tags', () => { - it('should return an object containing empty strings if no tags are set', () => { - plugin.getCardContent(filters).tags.should.deep.equal({ - added: '', - removed: '', - }); - }); - - it('should return an object containing strings of comma-separated tag names if tags are set', () => { - plugin.tags = [ - { name: 'Relev' }, - { name: 'Delev' }, - { name: 'Names' }, - { name: '-C.Climate' }, - { name: '-Actor.ABCS' }, - ]; - - plugin.getCardContent(filters).tags.should.deep.equal({ - added: 'Relev, Delev, Names', - removed: 'C.Climate, Actor.ABCS', - }); - }); - - it('should return an object containing empty strings if tags are set and the tags filter is enabled', () => { - plugin.tags = [ - { name: 'Relev' }, - { name: 'Delev' }, - { name: 'Names' }, - { name: '-C.Climate' }, - { name: '-Actor.ABCS' }, - ]; - filters.hideBashTags = true; - - plugin.getCardContent(filters).tags.should.deep.equal({ - added: '', - removed: '', - }); - }); - - it('should output a tag in the removed string if it appears as both added and removed', () => { - plugin.tags = [ - { name: 'Relev' }, - { name: '-Relev' }, - ]; - - plugin.getCardContent(filters).tags.should.deep.equal({ - added: '', - removed: 'Relev', - }); - }); - - it('setting value should throw', () => { - (() => { - plugin.getCardContent(filters).tags = { - added: 'Relev', - removed: 'Delev', - }; - }).should.throw(); - }); - }); - - describe('#crc', () => { - it('should return an empty string if crc is undefined', () => { - plugin.getCardContent(filters).crc.should.equal(''); - }); - - it('should return an empty string if crc is zero', () => { - plugin.crc = 0; - - plugin.getCardContent(filters).crc.should.equal(''); - }); - - it('should return crc value as string if non zero', () => { - plugin.crc = 0xDEADBEEF; - - plugin.getCardContent(filters).crc.should.equal('DEADBEEF'); - }); - - it('should return an empty string if crc is non-zero and the CRC filter is enabled', () => { - plugin.crc = 0xDEADBEEF; - filters.hideCRCs = true; - - plugin.getCardContent(filters).crc.should.equal(''); - }); - - it('should pad crc value to eight digits', () => { - plugin.crc = 0xBEEF; - - plugin.getCardContent(filters).crc.should.equal('0000BEEF'); - }); - - it('setting value should throw', () => { - (() => { plugin.getCardContent(filters).crc = 0xBECADECA; }).should.throw(); - }); - }); - - describe('#messages', () => { - it('should return message objects mapped from the plugin\'s message objects', () => { - plugin.getCardContent(filters).messages.should.deep.equal(plugin.messages); - }); - - it('should return an array missing the note message when the notes filter is enabled', () => { - filters.hideNotes = true; - plugin.getCardContent(filters).messages.should.deep.equal([ - plugin.messages[1], - ]); - }); - - it('should return an array missing the "do not clean" message when the "do not clean" messages filter is enabled', () => { - filters.hideDoNotCleanMessages = true; - plugin.getCardContent(filters).messages.should.deep.equal([ - plugin.messages[0], - ]); - }); - - it('should return an empty array when the all messages filter is enabled', () => { - filters.hideAllPluginMessages = true; - plugin.getCardContent(filters).messages.should.deep.equal([]); - }); - - it('setting value should throw', () => { - (() => { plugin.getCardContent(filters).messages = []; }).should.throw(); - }); - }); - - describe('#containsText()', () => { - it('should return true if argument is undefined', () => { - plugin.getCardContent(filters).containsText().should.be.true; - }); - - it('should return true if argument is an empty string', () => { - plugin.getCardContent(filters).containsText('').should.be.true; - }); - - it('should search name case-insensitively', () => { - plugin.getCardContent(filters).containsText('Tes').should.be.true; - }); - - it('should search CRC case-insensitively', () => { - plugin.crc = 0xDEADBEEF; - plugin.getCardContent(filters).containsText('dead').should.be.true; - }); - - it('should search added tags case-insensitively', () => { - plugin.tags = [ - { name: 'Relev' }, - { name: 'Delev' }, - { name: 'Names' }, - { name: '-C.Climate' }, - { name: '-Actor.ABCS' }, - ]; - plugin.getCardContent(filters).containsText('climate').should.be.true; - }); - - it('should search removed tags case-insensitively', () => { - plugin.tags = [ - { name: 'Relev' }, - { name: 'Delev' }, - { name: 'Names' }, - { name: '-C.Climate' }, - { name: '-Actor.ABCS' }, - ]; - plugin.getCardContent(filters).containsText('.abc').should.be.true; - }); - - it('should search message content case-insensitively', () => { - plugin.getCardContent(filters).containsText('Clean').should.be.true; - }); - - it('should not find text that is not present', () => { - plugin.getCardContent(filters).containsText('say').should.be.false; - }); - }); -}); diff --git a/src/tests/gui/html/js/test_query.js b/src/tests/gui/html/js/test_query.js deleted file mode 100644 index dea7df03..00000000 --- a/src/tests/gui/html/js/test_query.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; - -describe('query()', () => { - it('should throw if no arguments are passed', () => { - (() => { loot.query(); }).should.throw(); - }); - - it('should return a promise', () => { - loot.query('test').should.be.a('promise'); // eslint-disable-line new-cap - }); - - it('should succeed if a request name is passed', () => - loot.query('discardUnappliedChanges').then((result) => - result.should.be.empty - ) - ); - - it('should succeed if a request name and arguments are passed', () => - loot.query('copyContent', 'foo').then((result) => - result.should.be.empty - ) - ); - - it('should fail with an Error object when an error occurs', () => - loot.query('copyContent').catch((error) => - error.should.be.an('error') - ) - ); -}); diff --git a/src/tests/gui/html/js/test_state.js b/src/tests/gui/html/js/test_state.js deleted file mode 100644 index 1ca9e883..00000000 --- a/src/tests/gui/html/js/test_state.js +++ /dev/null @@ -1,273 +0,0 @@ -'use strict'; - -function getShown(elementId) { - return loot.DOM.elementShownStates.get(elementId); -} - -function getEnabled(elementId) { - return loot.DOM.elementEnabledStates.get(elementId); -} - -function getDomState() { - return loot.DOM.state; -} - -beforeEach(() => { - loot.DOM.elementShownStates.clear(); - loot.DOM.elementEnabledStates.clear(); -}); - -describe('State', () => { - describe('State()', () => { - it('should set the current state to DEFAULT_STATE', () => { - const state = new loot.State(); - state.currentState.should.equal(loot.State.DEFAULT_STATE); - }); - }); - - describe('DEFAULT_STATE', () => { - it('should not equal EDITING_STATE', () => { - loot.State.DEFAULT_STATE.should.not.equal(loot.State.EDITING_STATE); - }); - - it('should not equal SORTING_STATE', () => { - loot.State.DEFAULT_STATE.should.not.equal(loot.State.SORTING_STATE); - }); - }); - - describe('EDITING_STATE', () => { - it('should not equal SORTING_STATE', () => { - loot.State.EDITING_STATE.should.not.equal(loot.State.SORTING_STATE); - }); - }); - - describe('isInDefaultState()', () => { - it('should return true if the default state is the current state', () => { - const state = new loot.State(); - - state.isInDefaultState().should.be.true; - }); - - it('should return false if the editing state is the current state', () => { - const state = new loot.State(); - state.enterEditingState(); - - state.isInDefaultState().should.be.false; - }); - - it('should return false if the sorting state is the current state', () => { - const state = new loot.State(); - state.enterSortingState(); - - state.isInDefaultState().should.be.false; - }); - }); - - describe('isInEditingState()', () => { - it('should return true if the editing state is the current state', () => { - const state = new loot.State(); - state.enterEditingState(); - - state.isInEditingState().should.be.true; - }); - - it('should return false if the default state is the current state', () => { - const state = new loot.State(); - - state.isInEditingState().should.be.false; - }); - - it('should return false if the sorting state is the current state', () => { - const state = new loot.State(); - state.enterSortingState(); - - state.isInEditingState().should.be.false; - }); - }); - - describe('isInSortingState()', () => { - it('should return true if the sorting state is the current state', () => { - const state = new loot.State(); - state.enterSortingState(); - - state.isInSortingState().should.be.true; - }); - - it('should return false if the editing state is the current state', () => { - const state = new loot.State(); - state.enterEditingState(); - - state.isInSortingState().should.be.false; - }); - - it('should return false if the default state is the current state', () => { - const state = new loot.State(); - - state.isInSortingState().should.be.false; - }); - }); - - describe('enterSortingState()', () => { - it('should change state to the sorting state from the default state', () => { - const state = new loot.State(); - state.enterSortingState(); - - state.currentState.should.equal(loot.State.SORTING_STATE); - - getShown('updateMasterlistButton').should.be.false; - getShown('sortButton').should.be.false; - getShown('applySortButton').should.be.true; - getShown('cancelSortButton').should.be.true; - getEnabled('gameMenu').should.be.false; - getEnabled('refreshContentButton').should.be.false; - - getDomState().should.equal('sorting'); - }); - - it('should throw an error if called in the editing state', () => { - const state = new loot.State(); - state.enterEditingState(); - - should.throw(() => { state.enterSortingState(); }, Error); - }); - - it('should have no effect if already in the sorting state', () => { - const state = new loot.State(); - state.enterSortingState(); - state.enterSortingState(); - - state.currentState.should.equal(loot.State.SORTING_STATE); - - getShown('updateMasterlistButton').should.be.false; - getShown('sortButton').should.be.false; - getShown('applySortButton').should.be.true; - getShown('cancelSortButton').should.be.true; - getEnabled('gameMenu').should.be.false; - getEnabled('refreshContentButton').should.be.false; - }); - }); - - describe('exitSortingState()', () => { - it('should change state to the default state from the sorting state', () => { - const state = new loot.State(); - state.enterSortingState(); - state.exitSortingState(); - - state.currentState.should.equal(loot.State.DEFAULT_STATE); - - getShown('updateMasterlistButton').should.be.true; - getShown('sortButton').should.be.true; - getShown('applySortButton').should.be.false; - getShown('cancelSortButton').should.be.false; - getEnabled('gameMenu').should.be.true; - getEnabled('refreshContentButton').should.be.true; - - getDomState().should.equal('default'); - }); - - it('should throw an error if called in the editing state', () => { - const state = new loot.State(); - state.enterEditingState(); - - should.throw(() => { state.exitSortingState(); }, Error); - }); - - it('should have no effect if already in the default state', () => { - const state = new loot.State(); - state.exitSortingState(); - - state.currentState.should.equal(loot.State.DEFAULT_STATE); - - should.equal(undefined, getShown('updateMasterlistButton')); - should.equal(undefined, getShown('sortButton')); - should.equal(undefined, getShown('applySortButton')); - should.equal(undefined, getShown('cancelSortButton')); - should.equal(undefined, getEnabled('gameMenu')); - should.equal(undefined, getEnabled('refreshContentButton')); - }); - }); - - describe('enterEditingState()', () => { - it('should change state to the editing state from the default state', () => { - const state = new loot.State(); - state.enterEditingState(); - - state.currentState.should.equal(loot.State.EDITING_STATE); - - getEnabled('wipeUserlistButton').should.be.false; - getEnabled('copyContentButton').should.be.false; - getEnabled('refreshContentButton').should.be.false; - getEnabled('settingsButton').should.be.false; - getEnabled('gameMenu').should.be.false; - getEnabled('updateMasterlistButton').should.be.false; - getEnabled('sortButton').should.be.false; - - getDomState().should.equal('editing'); - }); - - it('should throw an error if called in the sorting state', () => { - const state = new loot.State(); - state.enterSortingState(); - - should.throw(() => { state.enterEditingState(); }, Error); - }); - - it('should have no effect if already in the editing state', () => { - const state = new loot.State(); - state.enterEditingState(); - state.enterEditingState(); - - state.currentState.should.equal(loot.State.EDITING_STATE); - - getEnabled('wipeUserlistButton').should.be.false; - getEnabled('copyContentButton').should.be.false; - getEnabled('refreshContentButton').should.be.false; - getEnabled('settingsButton').should.be.false; - getEnabled('gameMenu').should.be.false; - getEnabled('updateMasterlistButton').should.be.false; - getEnabled('sortButton').should.be.false; - }); - }); - - describe('exitEditingState()', () => { - it('should change state to the default state from the editing state', () => { - const state = new loot.State(); - state.enterEditingState(); - state.exitEditingState(); - - state.currentState.should.equal(loot.State.DEFAULT_STATE); - - getEnabled('wipeUserlistButton').should.be.true; - getEnabled('copyContentButton').should.be.true; - getEnabled('refreshContentButton').should.be.true; - getEnabled('settingsButton').should.be.true; - getEnabled('gameMenu').should.be.true; - getEnabled('updateMasterlistButton').should.be.true; - getEnabled('sortButton').should.be.true; - - getDomState().should.equal('default'); - }); - - it('should throw an error if called in the sorting state', () => { - const state = new loot.State(); - state.enterSortingState(); - - should.throw(() => { state.exitEditingState(); }, Error); - }); - - it('should have no effect if already in the default state', () => { - const state = new loot.State(); - state.exitEditingState(); - - state.currentState.should.equal(loot.State.DEFAULT_STATE); - - should.equal(undefined, getEnabled('wipeUserlistButton')); - should.equal(undefined, getEnabled('copyContentButton')); - should.equal(undefined, getEnabled('refreshContentButton')); - should.equal(undefined, getEnabled('settingsButton')); - should.equal(undefined, getEnabled('gameMenu')); - should.equal(undefined, getEnabled('updateMasterlistButton')); - should.equal(undefined, getEnabled('sortButton')); - }); - }); -}); diff --git a/src/tests/gui/html/js/test_translator.js b/src/tests/gui/html/js/test_translator.js deleted file mode 100644 index 55533d64..00000000 --- a/src/tests/gui/html/js/test_translator.js +++ /dev/null @@ -1,140 +0,0 @@ -'use strict'; - -describe('Translator', () => { - describe('#Tranlsator()', () => { - it('should set locale to "en" if no locale is given', () => { - const l10n = new loot.Translator(); - l10n.locale.should.equal('en'); - }); - - it('should set the locale to the given value', () => { - const l10n = new loot.Translator('de'); - l10n.locale.should.equal('de'); - }); - }); - - describe('#load()', () => { - it('should return a Promise', () => { - const l10n = new loot.Translator(); - - l10n.load().should.be.a('promise'); // eslint-disable-line new-cap - }); - - it('should be fulfilled for a locale of "en"', () => { - const l10n = new loot.Translator('en'); - - return l10n.load(); - }); - - /* Cannot test rejection or other locales as the URL uses is invalid in the - browser, causing a CORS error that cannot be handled in JavaScript. */ - }); - - describe('#translate()', () => { - let l10n; - - beforeEach(() => { - l10n = new loot.Translator(); - }); - - it('should return original string if the translator has not been loaded', () => { - l10n.translate('foo').should.equal('foo'); - }); - - it('should return an empty string if nothing is passed', () => - l10n.load().then(() => { - l10n.translate().should.equal(''); - }) - ); - - it('should return the input string if the current locale is "en"', () => - l10n.load().then(() => { - l10n.translate('foo').should.equal('foo'); - }) - ); - - it('should return the translated string if locale data has been loaded', () => { - /* Since loading data doesn't work in the browser, hack it by setting some - data manually. */ - l10n.jed = new window.Jed({ - locale_data: { - messages: { - '': { - domain: 'messages', - lang: 'en', - plural_forms: 'nplurals=2; plural=(n != 1);', - }, - foo: ['bar'], - }, - }, - domain: 'messages', - }); - - l10n.translate('foo').should.equal('bar'); - }); - }); - - describe('#translateFormatted()', () => { - let l10n; - - beforeEach(() => { - l10n = new loot.Translator(); - }); - - it('should return original string if the translator has not been loaded', () => { - l10n.translateFormatted('foo').should.equal('foo'); - }); - - it('should return an empty string if nothing is passed', () => - l10n.load().then(() => { - l10n.translateFormatted().should.equal(''); - }) - ); - - it('should return the input string if the current locale is "en"', () => - l10n.load().then(() => { - l10n.translateFormatted('foo').should.equal('foo'); - }) - ); - - it('should return the translated string if locale data has been loaded', () => { - /* Since loading data doesn't work in the browser, hack it by setting some - data manually. */ - l10n.jed = new window.Jed({ - locale_data: { - messages: { - '': { - domain: 'messages', - lang: 'en', - plural_forms: 'nplurals=2; plural=(n != 1);', - }, - foo: ['bar'], - }, - }, - domain: 'messages', - }); - - l10n.translateFormatted('foo').should.equal('bar'); - }); - - it('should subsitute additional arguments into string', () => { - /* Since loading data doesn't work in the browser, hack it by setting some - data manually. */ - l10n.jed = new window.Jed({ - locale_data: { - messages: { - '': { - domain: 'messages', - lang: 'en', - plural_forms: 'nplurals=2; plural=(n != 1);', - }, - 'foo %1$s %2$s': ['%2$s is bar'], - }, - }, - domain: 'messages', - }); - - l10n.translateFormatted('foo %1$s %2$s', 'is not', 'bar').should.equal('bar is bar'); - }); - }); -}); diff --git a/src/tests/gui/html/js/test_updateExists.js b/src/tests/gui/html/js/test_updateExists.js deleted file mode 100644 index 42aaf006..00000000 --- a/src/tests/gui/html/js/test_updateExists.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -describe('updateExists()', () => { - it('should reject if no arguments are passed', () => - loot.updateExists().catch((error) => - error.should.be.an('error') - ) - ); - - it('should reject if one argument is passed', () => - loot.updateExists('1.0.0').catch((error) => - error.should.be.an('error') - ) - ); - - it('should reject if passed a version number has less than three parts', () => - loot.updateExists('1.0', 'deadbeef').catch((error) => - error.should.be.an('error') - ) - ); - - it('should reject if passed a version number has more than three parts', () => - loot.updateExists('1.0.0.0', 'deadbeef').catch((error) => - error.should.be.an('error') - ) - ); - - it('should reject if the version number given contains non-digit, non-period characters', () => - loot.updateExists('1.0a.0', 'deadbeef').catch((error) => - error.should.be.an('error') - ) - ); - - it('should resolve to true if the given version is less than the latest version', () => - loot.updateExists('0.9.1', 'deadbeef').then((result) => - result.should.be.true - ) - ); - - it('should resolve to false if the given version is greater than the latest version', () => - loot.updateExists('0.10.0', 'deadbeef').then((result) => - result.should.be.false - ) - ); - - it('should resolve to true if the given version equals the latest version but the short build SHAs are unequal', () => - loot.updateExists('0.9.2', 'deadbeef').then((result) => - result.should.be.true - ) - ); - - it('should resolve to false if the given version equals the latest version and the short build SHAs are equal', () => - loot.updateExists('0.9.2', '6b58f92').then((result) => - result.should.be.false - ) - ); -}); diff --git a/src/tests/gui/main.cpp b/src/tests/gui/main.cpp deleted file mode 100644 index d93c40bc..00000000 --- a/src/tests/gui/main.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* LOOT - - A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and - Fallout: New Vegas. - - Copyright (C) 2014-2016 WrinklyNinja - - This file is part of LOOT. - - LOOT is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - LOOT is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LOOT. If not, see - . - */ - -#include -#include - -#include "tests/gui/state/game_test.h" -#include "tests/gui/state/game_settings_test.h" -#include "tests/gui/state/loot_paths_test.h" -#include "tests/gui/state/loot_settings_test.h" -#include "tests/gui/state/loot_state_test.h" - -int main(int argc, char **argv) { - //Set the locale to get encoding conversions working correctly. - std::locale::global(boost::locale::generator().generate("")); - boost::filesystem::path::imbue(std::locale()); - - //Disable logging or else stdout will get overrun. - boost::log::core::get()->set_logging_enabled(false); - loot::SetLoggingVerbosity(loot::LogVerbosity::off); - - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/src/tests/gui/state/game_settings_test.h b/src/tests/gui/state/game_settings_test.h deleted file mode 100644 index eb8cc6c3..00000000 --- a/src/tests/gui/state/game_settings_test.h +++ /dev/null @@ -1,259 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_TESTS_GUI_STATE_GAME_SETTINGS_TEST -#define LOOT_TESTS_GUI_STATE_GAME_SETTINGS_TEST - -#include "gui/state/game_settings.h" - -#include "tests/common_game_test_fixture.h" - -namespace loot { -namespace test { -class GameSettingsTest : public CommonGameTestFixture { -protected: - GameSettings settings_; -}; - -// Pass an empty first argument, as it's a prefix for the test instantation, -// but we only have the one so no prefix is necessary. -// Just test with one game because if it works for one it will work for them -// all. -INSTANTIATE_TEST_CASE_P(, - GameSettingsTest, - ::testing::Values( - GameType::tes5)); - -TEST_P(GameSettingsTest, defaultConstructorShouldInitialiseIdToTes4AndAllOtherSettingsToEmptyStrings) { - EXPECT_EQ(GameType::tes4, settings_.Type()); - EXPECT_EQ("", settings_.Name()); - EXPECT_EQ("", settings_.FolderName()); - EXPECT_EQ("", settings_.Master()); - EXPECT_EQ("", settings_.RegistryKey()); - EXPECT_EQ("", settings_.RepoURL()); - EXPECT_EQ("", settings_.RepoBranch()); - - EXPECT_EQ("", settings_.GamePath()); -} - -TEST_P(GameSettingsTest, idConstructorShouldInitialiseSettingsToDefaultsForThatGame) { - settings_ = GameSettings(GameType::tes5); - - EXPECT_EQ(GameType::tes5, settings_.Type()); - EXPECT_EQ("TES V: Skyrim", settings_.Name()); - EXPECT_EQ("Skyrim", settings_.FolderName()); - EXPECT_EQ("Skyrim.esm", settings_.Master()); - EXPECT_EQ("Software\\Bethesda Softworks\\Skyrim\\Installed Path", settings_.RegistryKey()); - EXPECT_EQ("https://github.com/loot/skyrim.git", settings_.RepoURL()); - // Repo branch changes between LOOT versions, so don't check an exact value. - EXPECT_NE("", settings_.RepoBranch()); - - EXPECT_EQ("", settings_.GamePath()); -} - -TEST_P(GameSettingsTest, idConstructorShouldSetGameFolderIfGiven) { - settings_ = GameSettings(GameType::tes5, "folder"); - - EXPECT_EQ("folder", settings_.FolderName()); -} - -TEST_P(GameSettingsTest, isRepoBranchOldDefaultShouldBeTrueIfValueIsMaster) { - settings_ = GameSettings(GameType::tes5); - settings_.SetRepoBranch("master"); - - EXPECT_TRUE(settings_.IsRepoBranchOldDefault()); -} - -TEST_P(GameSettingsTest, isRepoBranchOldDefaultShouldBeFalseIfValueIsTheDefault) { - settings_ = GameSettings(GameType::tes5); - - EXPECT_FALSE(settings_.IsRepoBranchOldDefault()); -} - -TEST_P(GameSettingsTest, gameSettingsWithTheSameIdsShouldBeEqual) { - GameSettings game1 = GameSettings(GameType::tes5, "game1") - .SetMaster("master1") - .SetRegistryKey("key1") - .SetRepoURL("url1") - .SetRepoBranch("branch1") - .SetGamePath("path1"); - GameSettings game2 = GameSettings(GameType::tes5, "game2") - .SetMaster("master2") - .SetRegistryKey("key2") - .SetRepoURL("url2") - .SetRepoBranch("branch2") - .SetGamePath("path2"); - - EXPECT_TRUE(game1 == game2); -} - -TEST_P(GameSettingsTest, gameSettingsWithTheSameNameShouldBeEqual) { - GameSettings game1 = GameSettings(GameType::tes4) - .SetName("name"); - GameSettings game2 = GameSettings(GameType::tes5) - .SetName("name"); - - EXPECT_TRUE(game1 == game2); -} - -TEST_P(GameSettingsTest, gameSettingsWithDifferentIdsAndNamesShouldNotBeEqual) { - GameSettings game1 = GameSettings(GameType::tes4); - GameSettings game2 = GameSettings(GameType::tes5); - - EXPECT_FALSE(game1 == game2); -} - -TEST_P(GameSettingsTest, setNameShouldStoreGivenValue) { - GameSettings settings_; - settings_.SetName("name"); - EXPECT_EQ("name", settings_.Name()); -} - -TEST_P(GameSettingsTest, setMasterShouldStoreGivenValue) { - GameSettings settings_; - settings_.SetMaster("master"); - EXPECT_EQ("master", settings_.Master()); -} - -TEST_P(GameSettingsTest, setRegistryKeyShouldStoreGivenValue) { - GameSettings settings_; - settings_.SetRegistryKey("key"); - EXPECT_EQ("key", settings_.RegistryKey()); -} - -TEST_P(GameSettingsTest, setRepoUrlShouldStoreGivenValue) { - GameSettings settings_; - settings_.SetRepoURL("url"); - EXPECT_EQ("url", settings_.RepoURL()); -} - -TEST_P(GameSettingsTest, setRepoBranchShouldStoreGivenValue) { - GameSettings settings_; - settings_.SetRepoBranch("branch"); - EXPECT_EQ("branch", settings_.RepoBranch()); -} - -TEST_P(GameSettingsTest, setGamePathShouldStoreGivenValue) { - std::string pathValue = "path"; - GameSettings settings_; - - settings_.SetGamePath(pathValue); - EXPECT_EQ(pathValue, settings_.GamePath().string()); -} - -TEST_P(GameSettingsTest, emittingYamlShouldSerialiseDataCorrectly) { - GameSettings settings_(GameType::tes5, "folder1"); - settings_.SetName("name1") - .SetMaster("master1") - .SetRegistryKey("key1") - .SetRepoURL("url1") - .SetRepoBranch("branch1") - .SetGamePath("path1"); - - YAML::Emitter e; - e << settings_; - EXPECT_STREQ("type: 'Skyrim'\n" - "folder: 'folder1'\n" - "name: 'name1'\n" - "master: 'master1'\n" - "repo: 'url1'\n" - "branch: 'branch1'\n" - "path: 'path1'\n" - "registry: 'key1'", e.c_str()); -} - -TEST_P(GameSettingsTest, encodingAsYamlShouldConvertDataCorrectly) { - GameSettings settings_(GameType::tes5, "folder1"); - settings_.SetName("name1") - .SetMaster("master1") - .SetRegistryKey("key1") - .SetRepoURL("url1") - .SetRepoBranch("branch1") - .SetGamePath("path1"); - - YAML::Node node; - node = settings_; - EXPECT_EQ("Skyrim", node["type"].as()); - EXPECT_EQ("folder1", node["folder"].as()); - EXPECT_EQ("name1", node["name"].as()); - EXPECT_EQ("master1", node["master"].as()); - EXPECT_EQ("url1", node["repo"].as()); - EXPECT_EQ("branch1", node["branch"].as()); - EXPECT_EQ("path1", node["path"].as()); - EXPECT_EQ("key1", node["registry"].as()); -} - -TEST_P(GameSettingsTest, decodingFromYamlShouldInterpretTheYamlCorrectly) { - YAML::Node node = YAML::Load("type: 'Skyrim'\n" - "folder: 'folder1'\n" - "name: 'name1'\n" - "master: 'master1'\n" - "repo: 'url1'\n" - "branch: 'branch1'\n" - "path: 'path1'\n" - "registry: 'key1'"); - - GameSettings settings_ = node.as(); - EXPECT_EQ(GameType::tes5, settings_.Type()); - EXPECT_EQ("name1", settings_.Name()); - EXPECT_EQ("folder1", settings_.FolderName()); - EXPECT_EQ("master1", settings_.Master()); - EXPECT_EQ("key1", settings_.RegistryKey()); - EXPECT_EQ("url1", settings_.RepoURL()); - EXPECT_EQ("branch1", settings_.RepoBranch()); - EXPECT_EQ("path1", settings_.GamePath()); -} - -TEST_P(GameSettingsTest, decodingFromAnInvalidYamlMapShouldThrowAnException) { - YAML::Node node = YAML::Load("type: 'Invalid'\n"); - EXPECT_THROW(node.as(), YAML::RepresentationException); -} - -TEST_P(GameSettingsTest, decodingFromAYamlScalarShouldThrowAnException) { - YAML::Node node = YAML::Load("scalar"); - EXPECT_THROW(node.as(), YAML::RepresentationException); -} - -TEST_P(GameSettingsTest, decodingFromAYamlListShouldThrowAnException) { - YAML::Node node = YAML::Load("[0, 1, 2]"); - EXPECT_THROW(node.as(), YAML::RepresentationException); -} - -TEST_P(GameSettingsTest, decodingFromAnIncompleteYamlMapShouldUseDefaultValuesForMissingSettings) { - // Test inheritance of unspecified settings. - YAML::Node node = YAML::Load("type: 'Skyrim'\n" - "folder: 'folder1'\n" - "master: 'master1'\n" - "repo: 'url1'\n" - "branch: 'branch1'\n"); - - settings_ = node.as(); - EXPECT_EQ(GameType::tes5, settings_.Type()); - EXPECT_EQ("TES V: Skyrim", settings_.Name()); - EXPECT_EQ("Software\\Bethesda Softworks\\Skyrim\\Installed Path", settings_.RegistryKey()); - EXPECT_EQ("", settings_.GamePath()); -} -} -} -#endif diff --git a/src/tests/gui/state/game_test.h b/src/tests/gui/state/game_test.h deleted file mode 100644 index 26bcf4ba..00000000 --- a/src/tests/gui/state/game_test.h +++ /dev/null @@ -1,538 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_TESTS_GUI_STATE_GAME_TEST -#define LOOT_TESTS_GUI_STATE_GAME_TEST - -#include "gui/state/game.h" - -#include "gui/state/game_detection_error.h" -#include "tests/common_game_test_fixture.h" - -namespace loot { -namespace gui { -namespace test { -class GameTest : public loot::test::CommonGameTestFixture { -protected: - GameTest() : loadOrderToSet_({ - masterFile, - blankEsm, - blankMasterDependentEsm, - blankDifferentEsm, - blankDifferentMasterDependentEsm, - blankDifferentEsp, - blankDifferentPluginDependentEsp, - blankEsp, - blankMasterDependentEsp, - blankDifferentMasterDependentEsp, - blankPluginDependentEsp, - }), - loadOrderBackupFile0("loadorder.bak.0"), - loadOrderBackupFile1("loadorder.bak.1"), - loadOrderBackupFile2("loadorder.bak.2"), - loadOrderBackupFile3("loadorder.bak.3") { - SetLoggingVerbosity(LogVerbosity::off); - } - - void TearDown() { - CommonGameTestFixture::TearDown(); - } - - std::vector loadOrderToSet_; - const std::string loadOrderBackupFile0; - const std::string loadOrderBackupFile1; - const std::string loadOrderBackupFile2; - const std::string loadOrderBackupFile3; -}; - -// Pass an empty first argument, as it's a prefix for the test instantation, -// but we only have the one so no prefix is necessary. -INSTANTIATE_TEST_CASE_P(, - GameTest, - ::testing::Values( - GameType::tes4, - GameType::tes5, - GameType::fo3, - GameType::fonv, - GameType::fo4, - GameType::tes5se)); - -TEST_P(GameTest, constructingFromGameSettingsShouldUseTheirValues) { - GameSettings settings = GameSettings(GetParam(), "folder"); - settings.SetName("foo"); - settings.SetMaster(blankEsm); - settings.SetRegistryKey("foo"); - settings.SetRepoURL("foo"); - settings.SetRepoBranch("foo"); - settings.SetGamePath(dataPath.parent_path()); - Game game(settings, lootDataPath, localPath); - - EXPECT_EQ(GetParam(), game.Type()); - EXPECT_EQ(settings.Name(), game.Name()); - EXPECT_EQ(settings.FolderName(), game.FolderName()); - EXPECT_EQ(settings.Master(), game.Master()); - EXPECT_EQ(settings.RegistryKey(), game.RegistryKey()); - EXPECT_EQ(settings.RepoURL(), game.RepoURL()); - EXPECT_EQ(settings.RepoBranch(), game.RepoBranch()); - - EXPECT_EQ(settings.GamePath(), game.GamePath()); - EXPECT_EQ(lootDataPath / "folder" / "masterlist.yaml", game.MasterlistPath()); - EXPECT_EQ(lootDataPath / "folder" / "userlist.yaml", game.UserlistPath()); -} - -#ifndef _WIN32 -// Testing on Windows will find real game installs in the Registry, so cannot -// test autodetection fully unless on Linux. -TEST_P(GameTest, constructingShouldThrowOnLinuxIfGamePathIsNotGiven) { - EXPECT_THROW(Game(GameSettings(GetParam()), "", localPath), GameDetectionError); -} - -TEST_P(GameTest, constructingShouldThrowOnLinuxIfLocalPathIsNotGiven) { - auto settings = GameSettings(GetParam()).SetGamePath(dataPath.parent_path()); - EXPECT_THROW(Game(settings, lootDataPath), std::system_error); -} -#else -TEST_P(GameTest, constructingShouldNotThrowOnWindowsIfLocalPathIsNotGiven) { - auto settings = GameSettings(GetParam()).SetGamePath(dataPath.parent_path()); - EXPECT_NO_THROW(Game(settings, lootDataPath, "")); -} -#endif - -TEST_P(GameTest, copyConstructorShouldCopyGameData) { - Game game1(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), lootDataPath, localPath); - game1.AppendMessage(Message(MessageType::say, "1")); - - Game game2(game1); - - EXPECT_EQ(game1.MasterlistPath(), game2.MasterlistPath()); - EXPECT_EQ(game1.ArePluginsFullyLoaded(), game2.ArePluginsFullyLoaded()); - EXPECT_EQ(game1.GetMessages(), game2.GetMessages()); -} - -TEST_P(GameTest, assignmentOperatorShouldCopyGameData) { - Game game1(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), lootDataPath, localPath); - game1.AppendMessage(Message(MessageType::say, "1")); - - Game game2 = game1; - - EXPECT_EQ(game1.MasterlistPath(), game2.MasterlistPath()); - EXPECT_EQ(game1.ArePluginsFullyLoaded(), game2.ArePluginsFullyLoaded()); - EXPECT_EQ(game1.GetMessages(), game2.GetMessages()); -} - -TEST_P(GameTest, isInstalledShouldBeFalseIfGamePathIsNotSet) { - EXPECT_FALSE(Game::IsInstalled(GameSettings(GetParam()))); -} - -TEST_P(GameTest, isInstalledShouldBeTrueIfGamePathIsValid) { - EXPECT_TRUE(Game::IsInstalled(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()))); -} - -TEST_P(GameTest, initShouldNotCreateAGameFolderIfTheLootDataPathIsEmpty) { - Game game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), "", localPath); - - ASSERT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName())); - EXPECT_NO_THROW(game.Init()); - - EXPECT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName())); -} - -TEST_P(GameTest, initShouldCreateAGameFolderIfTheCreateFolderArgumentIsTrue) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), lootDataPath, localPath); - - ASSERT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName())); - EXPECT_NO_THROW(game.Init()); - - EXPECT_TRUE(boost::filesystem::exists(lootDataPath / game.FolderName())); -} - -TEST_P(GameTest, initShouldNotThrowIfGameAndLocalPathsAreNotEmpty) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), "", localPath); - - EXPECT_NO_THROW(game.Init()); -} - -TEST_P(GameTest, checkInstallValidityShouldCheckThatRequirementsArePresent) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), "", localPath); - game.LoadAllInstalledPlugins(true); - - PluginMetadata metadata(blankEsm); - metadata.SetRequirements({ - File(missingEsp), - File(blankEsp), - }); - - auto messages = game.CheckInstallValidity(game.GetPlugin(blankEsm), metadata); - EXPECT_EQ(std::vector({ - Message(MessageType::error, "This plugin requires \"" + missingEsp + "\" to be installed, but it is missing."), - }), messages); -} - -TEST_P(GameTest, checkInstallValidityShouldCheckThatIncompatibilitiesAreAbsent) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), "", localPath); - game.LoadAllInstalledPlugins(true); - - PluginMetadata metadata(blankEsm); - metadata.SetIncompatibilities({ - File(missingEsp), - File(masterFile), - }); - - auto messages = game.CheckInstallValidity(game.GetPlugin(blankEsm), metadata); - EXPECT_EQ(std::vector({ - Message(MessageType::error, "This plugin is incompatible with \"" + masterFile + "\", but both are present."), - }), messages); -} - -TEST_P(GameTest, checkInstallValidityShouldGenerateMessagesFromDirtyInfo) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), "", localPath); - game.LoadAllInstalledPlugins(true); - - PluginMetadata metadata(blankEsm); - const std::vector info = std::vector({ - MessageContent("info", LanguageCode::english), - }); - - metadata.SetDirtyInfo({ - PluginCleaningData(blankEsmCrc, "utility1", info, 0, 1, 2), - PluginCleaningData(0xDEADBEEF, "utility2", info, 0, 5, 10), - }); - - auto messages = game.CheckInstallValidity(game.GetPlugin(blankEsm), metadata); - EXPECT_EQ(std::vector({ - PluginCleaningData(blankEsmCrc, "utility1", info, 0, 1, 2).AsMessage(), - PluginCleaningData(0xDEADBEEF, "utility2", info, 0, 5, 10).AsMessage(), - }), messages); -} - -TEST_P(GameTest, checkInstallValidityShouldCheckIfAPluginsMastersAreAllPresentAndActiveIfNoFilterTagIsPresent) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), "", localPath); - game.LoadAllInstalledPlugins(true); - - PluginMetadata metadata(blankDifferentMasterDependentEsp); - - auto messages = game.CheckInstallValidity(game.GetPlugin(blankDifferentMasterDependentEsp), metadata); - EXPECT_EQ(std::vector({ - Message(MessageType::error, "This plugin requires \"" + blankDifferentEsm + "\" to be active, but it is inactive."), - }), messages); -} - -TEST_P(GameTest, checkInstallValidityShouldNotCheckIfAPluginsMastersAreAllActiveIfAFilterTagIsPresent) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), "", localPath); - game.LoadAllInstalledPlugins(true); - - PluginMetadata metadata(blankDifferentMasterDependentEsp); - metadata.SetTags({Tag("Filter")}); - - auto messages = game.CheckInstallValidity(game.GetPlugin(blankDifferentMasterDependentEsp), metadata); - EXPECT_TRUE(messages.empty()); -} - -TEST_P(GameTest, redatePluginsShouldRedatePluginsForSkyrimAndSkyrimSEAndDoNothingForOtherGames) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), "", localPath); - game.Init(); - - std::vector> loadOrder = getInitialLoadOrder(); - - // First set reverse timestamps to be sure. - time_t time = boost::filesystem::last_write_time(dataPath / masterFile); - for (size_t i = 1; i < loadOrder.size(); ++i) { - if (!boost::filesystem::exists(dataPath / loadOrder[i].first)) - loadOrder[i].first += ".ghost"; - - boost::filesystem::last_write_time(dataPath / loadOrder[i].first, time - i * 60); - ASSERT_EQ(time - i * 60, boost::filesystem::last_write_time(dataPath / loadOrder[i].first)); - } - - EXPECT_NO_THROW(game.RedatePlugins()); - - time_t interval = 60; - if (GetParam() != GameType::tes5 && GetParam() != GameType::tes5se) - interval *= -1; - - for (size_t i = 0; i < loadOrder.size(); ++i) { - EXPECT_EQ(time + i * interval, boost::filesystem::last_write_time(dataPath / loadOrder[i].first)); - } -} - -TEST_P(GameTest, loadAllInstalledPluginsWithHeadersOnlyTrueShouldLoadTheHeadersOfAllInstalledPlugins) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), "", localPath); - ASSERT_NO_THROW(game.Init()); - - EXPECT_NO_THROW(game.LoadAllInstalledPlugins(true)); - EXPECT_EQ(11, game.GetPlugins().size()); - - // Check that one plugin's header has been read. - ASSERT_NO_THROW(game.GetPlugin(masterFile)); - auto plugin = game.GetPlugin(masterFile); - EXPECT_EQ("5.0", plugin->GetVersion()); - - // Check that only the header has been read. - EXPECT_EQ(0, plugin->GetCRC()); -} - -TEST_P(GameTest, loadAllInstalledPluginsWithHeadersOnlyFalseShouldFullyLoadAllInstalledPlugins) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), "", localPath); - ASSERT_NO_THROW(game.Init()); - - EXPECT_NO_THROW(game.LoadAllInstalledPlugins(false)); - EXPECT_EQ(11, game.GetPlugins().size()); - - // Check that one plugin's header has been read. - ASSERT_NO_THROW(game.GetPlugin(blankEsm)); - auto plugin = game.GetPlugin(blankEsm); - EXPECT_EQ("5.0", plugin->GetVersion()); - - // Check that not only the header has been read. - EXPECT_EQ(blankEsmCrc, plugin->GetCRC()); -} - -TEST_P(GameTest, pluginsShouldNotBeFullyLoadedByDefault) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), "", localPath); - - EXPECT_FALSE(game.ArePluginsFullyLoaded()); -} - -TEST_P(GameTest, pluginsShouldNotBeFullyLoadedAfterLoadingHeadersOnly) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), "", localPath); - - ASSERT_NO_THROW(game.LoadAllInstalledPlugins(true)); - - EXPECT_FALSE(game.ArePluginsFullyLoaded()); -} - -TEST_P(GameTest, pluginsShouldBeFullyLoadedAfterFullyLoadingThem) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), "", localPath); - - ASSERT_NO_THROW(game.LoadAllInstalledPlugins(false)); - - EXPECT_TRUE(game.ArePluginsFullyLoaded()); -} - -TEST_P(GameTest, GetActiveLoadOrderIndexShouldReturnNegativeOneForAPluginThatIsNotActive) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), "", localPath); - game.Init(); - - short index = game.GetActiveLoadOrderIndex(blankEsp); - - EXPECT_EQ(-1, index); -} - -TEST_P(GameTest, GetActiveLoadOrderIndexShouldReturnTheLoadOrderIndexOmittingInactivePlugins) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), "", localPath); - game.Init(); - - short index = game.GetActiveLoadOrderIndex(masterFile); - EXPECT_EQ(0, index); - - index = game.GetActiveLoadOrderIndex(blankEsm); - EXPECT_EQ(1, index); - - index = game.GetActiveLoadOrderIndex(blankDifferentMasterDependentEsp); - EXPECT_EQ(2, index); -} - -TEST_P(GameTest, setLoadOrderShouldCreateABackupOfTheCurrentLoadOrder) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), lootDataPath, localPath); - game.Init(); - - ASSERT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile0)); - ASSERT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile1)); - ASSERT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile2)); - ASSERT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile3)); - - auto initialLoadOrder = getLoadOrder(); - ASSERT_NO_THROW(game.SetLoadOrder(loadOrderToSet_)); - - EXPECT_TRUE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile0)); - EXPECT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile1)); - EXPECT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile2)); - EXPECT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile3)); - - auto loadOrder = readFileLines(lootDataPath / game.FolderName() / loadOrderBackupFile0); - - EXPECT_EQ(initialLoadOrder, loadOrder); -} - -TEST_P(GameTest, setLoadOrderShouldRollOverExistingBackups) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), lootDataPath, localPath); - game.Init(); - - ASSERT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile0)); - ASSERT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile1)); - ASSERT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile2)); - ASSERT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile3)); - - auto initialLoadOrder = getLoadOrder(); - ASSERT_NO_THROW(game.SetLoadOrder(loadOrderToSet_)); - - auto firstSetLoadOrder = loadOrderToSet_; - - ASSERT_NE(blankPluginDependentEsp, loadOrderToSet_[9]); - ASSERT_NE(blankDifferentMasterDependentEsp, loadOrderToSet_[10]); - loadOrderToSet_[9] = blankPluginDependentEsp; - loadOrderToSet_[10] = blankDifferentMasterDependentEsp; - - ASSERT_NO_THROW(game.SetLoadOrder(loadOrderToSet_)); - - EXPECT_TRUE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile0)); - EXPECT_TRUE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile1)); - EXPECT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile2)); - EXPECT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile3)); - - auto loadOrder = readFileLines(lootDataPath / game.FolderName() / loadOrderBackupFile0); - EXPECT_EQ(firstSetLoadOrder, loadOrder); - - loadOrder = readFileLines(lootDataPath / game.FolderName() / loadOrderBackupFile1); - EXPECT_EQ(initialLoadOrder, loadOrder); -} - -TEST_P(GameTest, setLoadOrderShouldKeepUpToThreeBackups) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), lootDataPath, localPath); - game.Init(); - - ASSERT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile0)); - ASSERT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile1)); - ASSERT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile2)); - ASSERT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile3)); - - auto initialLoadOrder = getLoadOrder(); - ASSERT_NO_THROW(game.SetLoadOrder(loadOrderToSet_)); - - auto firstSetLoadOrder = loadOrderToSet_; - - ASSERT_NE(blankPluginDependentEsp, loadOrderToSet_[9]); - ASSERT_NE(blankDifferentMasterDependentEsp, loadOrderToSet_[10]); - loadOrderToSet_[9] = blankPluginDependentEsp; - loadOrderToSet_[10] = blankDifferentMasterDependentEsp; - - ASSERT_NO_THROW(game.SetLoadOrder(loadOrderToSet_)); - - auto secondSetLoadOrder = loadOrderToSet_; - - ASSERT_NE(blankMasterDependentEsp, loadOrderToSet_[7]); - ASSERT_NE(blankEsp, loadOrderToSet_[8]); - loadOrderToSet_[7] = blankMasterDependentEsp; - loadOrderToSet_[8] = blankEsp; - - ASSERT_NO_THROW(game.SetLoadOrder(loadOrderToSet_)); - - auto thirdSetLoadOrder = loadOrderToSet_; - - ASSERT_NE(blankDifferentMasterDependentEsm, loadOrderToSet_[3]); - ASSERT_NE(blankDifferentEsm, loadOrderToSet_[4]); - loadOrderToSet_[3] = blankDifferentMasterDependentEsm; - loadOrderToSet_[4] = blankDifferentEsm; - - ASSERT_NO_THROW(game.SetLoadOrder(loadOrderToSet_)); - - EXPECT_TRUE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile0)); - EXPECT_TRUE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile1)); - EXPECT_TRUE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile2)); - EXPECT_FALSE(boost::filesystem::exists(lootDataPath / game.FolderName() / loadOrderBackupFile3)); - - auto loadOrder = readFileLines(lootDataPath / game.FolderName() / loadOrderBackupFile0); - EXPECT_EQ(thirdSetLoadOrder, loadOrder); - - loadOrder = readFileLines(lootDataPath / game.FolderName() / loadOrderBackupFile1); - EXPECT_EQ(secondSetLoadOrder, loadOrder); - - loadOrder = readFileLines(lootDataPath / game.FolderName() / loadOrderBackupFile2); - EXPECT_EQ(firstSetLoadOrder, loadOrder); -} - -TEST_P(GameTest, aMessageShouldBeCachedByDefault) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), lootDataPath, localPath); - - ASSERT_EQ(1, game.GetMessages().size()); -} - -TEST_P(GameTest, incrementLoadOrderSortCountShouldSupressTheDefaultCachedMessage) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), lootDataPath, localPath); - game.IncrementLoadOrderSortCount(); - - EXPECT_TRUE(game.GetMessages().empty()); -} - -TEST_P(GameTest, decrementingLoadOrderSortCountToZeroShouldShowTheDefaultCachedMessage) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), lootDataPath, localPath); - auto expectedMessages = game.GetMessages(); - game.IncrementLoadOrderSortCount(); - game.DecrementLoadOrderSortCount(); - - EXPECT_EQ(expectedMessages, game.GetMessages()); -} - -TEST_P(GameTest, decrementingLoadOrderSortCountThatIsAlreadyZeroShouldShowTheDefaultCachedMessage) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), lootDataPath, localPath); - auto expectedMessages = game.GetMessages(); - game.DecrementLoadOrderSortCount(); - - EXPECT_EQ(expectedMessages, game.GetMessages()); -} - -TEST_P(GameTest, decrementingLoadOrderSortCountToANonZeroValueShouldSupressTheDefaultCachedMessage) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), lootDataPath, localPath); - auto expectedMessages = game.GetMessages(); - game.IncrementLoadOrderSortCount(); - game.IncrementLoadOrderSortCount(); - game.DecrementLoadOrderSortCount(); - - EXPECT_TRUE(game.GetMessages().empty()); -} - -TEST_P(GameTest, appendingMessagesShouldStoreThemInTheGivenOrder) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), lootDataPath, localPath); - std::vector messages({ - Message(MessageType::say, "1"), - Message(MessageType::error, "2"), - }); - for (const auto& message : messages) - game.AppendMessage(message); - - ASSERT_EQ(3, game.GetMessages().size()); - EXPECT_EQ(messages[0], game.GetMessages()[0]); - EXPECT_EQ(messages[1], game.GetMessages()[1]); -} - -TEST_P(GameTest, clearingMessagesShouldRemoveAllAppendedMessages) { - Game game = Game(GameSettings(GetParam()).SetGamePath(dataPath.parent_path()), lootDataPath, localPath); - std::vector messages({ - Message(MessageType::say, "1"), - Message(MessageType::error, "2"), - }); - for (const auto& message : messages) - game.AppendMessage(message); - - auto previousSize = game.GetMessages().size(); - - game.ClearMessages(); - - EXPECT_EQ(previousSize - messages.size(), game.GetMessages().size()); -} -} -} -} - -#endif diff --git a/src/tests/gui/state/loot_paths_test.h b/src/tests/gui/state/loot_paths_test.h deleted file mode 100644 index a222c796..00000000 --- a/src/tests/gui/state/loot_paths_test.h +++ /dev/null @@ -1,88 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_TESTS_GUI_STATE_LOOT_PATHS_TEST -#define LOOT_TESTS_GUI_STATE_LOOT_PATHS_TEST - -#include "gui/state/loot_paths.h" - -#include - -namespace loot { -namespace test { -TEST(LootPaths, getReadmePathShouldUseLootAppPath) { - LootPaths::initialise(""); - - EXPECT_EQ(boost::filesystem::current_path() / "docs" / "index.html", LootPaths::getReadmePath()); -} - -TEST(LootPaths, getResourcesPathShouldUseLootAppPath) { - LootPaths::initialise(""); - - EXPECT_EQ(boost::filesystem::current_path() / "resources", LootPaths::getResourcesPath()); -} - -TEST(LootPaths, getL10nPathShouldUseLootAppPath) { - LootPaths::initialise(""); - - EXPECT_EQ(boost::filesystem::current_path() / "resources" / "l10n", LootPaths::getL10nPath()); -} - -TEST(LootPaths, getSettingsPathShouldUseLootDataPath) { - LootPaths::initialise(""); - - EXPECT_EQ(LootPaths::getLootDataPath() / "settings.yaml", LootPaths::getSettingsPath()); -} - -TEST(LootPaths, getLogPathShouldUseLootDataPath) { - LootPaths::initialise(""); - - EXPECT_EQ(LootPaths::getLootDataPath() / "LOOTDebugLog.txt", LootPaths::getLogPath()); -} - -TEST(LootPaths, initialiseShouldSetTheAppPathToTheCurrentPath) { - LootPaths::initialise(""); - - EXPECT_EQ(boost::filesystem::current_path(), LootPaths::getReadmePath().parent_path().parent_path()); -} - -TEST(LootPaths, initialiseShouldSetTheDataPathToTheLocalAppDataPathSlashLootIfGivenAnEmptyString) { - LootPaths::initialise(""); - - // Can't actually know what the path should be, but we can check - // its properties. - EXPECT_EQ("LOOT", LootPaths::getLootDataPath().filename()); - EXPECT_FALSE(LootPaths::getLootDataPath().parent_path().empty()); - EXPECT_TRUE(boost::filesystem::exists(LootPaths::getLootDataPath().parent_path())); -} - -TEST(LootPaths, initialiseShouldSetTheDataPathToGivenStringIfNonEmpty) { - LootPaths::initialise("foo"); - - EXPECT_EQ("foo", LootPaths::getLootDataPath()); -} -} -} - -#endif diff --git a/src/tests/gui/state/loot_settings_test.h b/src/tests/gui/state/loot_settings_test.h deleted file mode 100644 index 90dfe082..00000000 --- a/src/tests/gui/state/loot_settings_test.h +++ /dev/null @@ -1,486 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_TESTS_GUI_STATE_LOOT_SETTINGS_TEST -#define LOOT_TESTS_GUI_STATE_LOOT_SETTINGS_TEST - -#include "gui/state/loot_settings.h" - -#include - -#include "loot/loot_version.h" - -namespace loot { -namespace test { -class LootSettingsTest : public ::testing::Test { -protected: - LootSettingsTest() : settingsFile_("./settings_.yaml") {} - - ~LootSettingsTest() { - boost::filesystem::remove(settingsFile_); - } - - boost::filesystem::path settingsFile_; - LootSettings settings_; -}; - -TEST_F(LootSettingsTest, defaultConstructorShouldSetDefaultValues) { - const std::string currentVersion = LootVersion::string(); - const std::vector expectedGameSettings({ - GameSettings(GameType::tes4), - GameSettings(GameType::tes5), - GameSettings(GameType::tes5se), - GameSettings(GameType::fo3), - GameSettings(GameType::fonv), - GameSettings(GameType::fo4), - GameSettings(GameType::tes4, "Nehrim") - .SetName("Nehrim - At Fate's Edge") - .SetMaster("Nehrim.esm") - .SetRegistryKey("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Nehrim - At Fate's Edge_is1\\InstallLocation"), - }); - - EXPECT_FALSE(settings_.isDebugLoggingEnabled()); - EXPECT_EQ("auto", settings_.getGame()); - EXPECT_EQ("en", settings_.getLanguage().GetLocale()); - EXPECT_EQ("auto", settings_.getLastGame()); - EXPECT_FALSE(settings_.isWindowPositionStored()); - - const YAML::Node node = settings_.toYaml(); - EXPECT_TRUE(node["updateMasterlist"].as()); - EXPECT_TRUE(node["lastVersion"].as().empty()); - EXPECT_FALSE(node["filters"]); - - // GameSettings equality only checks name and folder, so check - // other settings_ individually. - const std::vector actualGameSettings = settings_.getGameSettings(); - EXPECT_EQ(expectedGameSettings, actualGameSettings); - - EXPECT_EQ(expectedGameSettings[0].Type(), actualGameSettings[0].Type()); - EXPECT_EQ(expectedGameSettings[0].Master(), actualGameSettings[0].Master()); - EXPECT_EQ(expectedGameSettings[0].RegistryKey(), actualGameSettings[0].RegistryKey()); - EXPECT_EQ(expectedGameSettings[0].RepoURL(), actualGameSettings[0].RepoURL()); - EXPECT_EQ(expectedGameSettings[0].RepoBranch(), actualGameSettings[0].RepoBranch()); - - EXPECT_EQ(expectedGameSettings[1].Type(), actualGameSettings[1].Type()); - EXPECT_EQ(expectedGameSettings[1].Master(), actualGameSettings[1].Master()); - EXPECT_EQ(expectedGameSettings[1].RegistryKey(), actualGameSettings[1].RegistryKey()); - EXPECT_EQ(expectedGameSettings[1].RepoURL(), actualGameSettings[1].RepoURL()); - EXPECT_EQ(expectedGameSettings[1].RepoBranch(), actualGameSettings[1].RepoBranch()); - - EXPECT_EQ(expectedGameSettings[2].Type(), actualGameSettings[2].Type()); - EXPECT_EQ(expectedGameSettings[2].Master(), actualGameSettings[2].Master()); - EXPECT_EQ(expectedGameSettings[2].RegistryKey(), actualGameSettings[2].RegistryKey()); - EXPECT_EQ(expectedGameSettings[2].RepoURL(), actualGameSettings[2].RepoURL()); - EXPECT_EQ(expectedGameSettings[2].RepoBranch(), actualGameSettings[2].RepoBranch()); - - EXPECT_EQ(expectedGameSettings[3].Type(), actualGameSettings[3].Type()); - EXPECT_EQ(expectedGameSettings[3].Master(), actualGameSettings[3].Master()); - EXPECT_EQ(expectedGameSettings[3].RegistryKey(), actualGameSettings[3].RegistryKey()); - EXPECT_EQ(expectedGameSettings[3].RepoURL(), actualGameSettings[3].RepoURL()); - EXPECT_EQ(expectedGameSettings[3].RepoBranch(), actualGameSettings[3].RepoBranch()); - - EXPECT_EQ(expectedGameSettings[4].Type(), actualGameSettings[4].Type()); - EXPECT_EQ(expectedGameSettings[4].Master(), actualGameSettings[4].Master()); - EXPECT_EQ(expectedGameSettings[4].RegistryKey(), actualGameSettings[4].RegistryKey()); - EXPECT_EQ(expectedGameSettings[4].RepoURL(), actualGameSettings[4].RepoURL()); - EXPECT_EQ(expectedGameSettings[4].RepoBranch(), actualGameSettings[4].RepoBranch()); - - EXPECT_EQ(expectedGameSettings[5].Type(), actualGameSettings[5].Type()); - EXPECT_EQ(expectedGameSettings[5].Master(), actualGameSettings[5].Master()); - EXPECT_EQ(expectedGameSettings[5].RegistryKey(), actualGameSettings[5].RegistryKey()); - EXPECT_EQ(expectedGameSettings[5].RepoURL(), actualGameSettings[5].RepoURL()); - EXPECT_EQ(expectedGameSettings[5].RepoBranch(), actualGameSettings[5].RepoBranch()); -} - -TEST_F(LootSettingsTest, loadingFromFileShouldLoadContentAsYaml) { - boost::filesystem::ofstream out(settingsFile_); - out << "enableDebugLogging: true" << std::endl; - out.close(); - - settings_.load(settingsFile_); - - EXPECT_TRUE(settings_.isDebugLoggingEnabled()); -} - -TEST_F(LootSettingsTest, loadingFromYamlShouldStoreLoadedValues) { - const bool enableDebugLogging = true; - const bool updateMasterlist = true; - const std::string game = "Oblivion"; - const std::string language = "fr"; - const std::string lastGame = "Skyrim"; - const std::string lastVersion = "0.7.1"; - const std::map window({ - {"top", 1}, - {"bottom", 2}, - {"left", 3}, - {"right", 4}, - }); - const std::vector games({ - GameSettings(GameType::tes4).SetName("Game Name"), - }); - const std::map filters({ - {"hideBashTags", false}, - {"hideCRCs", true}, - }); - - YAML::Node inputYaml; - inputYaml["enableDebugLogging"] = enableDebugLogging; - inputYaml["updateMasterlist"] = updateMasterlist; - inputYaml["game"] = game; - inputYaml["language"] = language; - inputYaml["lastGame"] = lastGame; - inputYaml["lastVersion"] = lastVersion; - inputYaml["window"] = window; - inputYaml["window"]["maximised"] = true; - inputYaml["games"] = games; - inputYaml["filters"] = filters; - - settings_.load(inputYaml); - - EXPECT_EQ(enableDebugLogging, settings_.isDebugLoggingEnabled()); - EXPECT_EQ(game, settings_.getGame()); - EXPECT_EQ(language, settings_.getLanguage().GetLocale()); - EXPECT_EQ(lastGame, settings_.getLastGame()); - - EXPECT_EQ(1, settings_.getWindowPosition().top); - EXPECT_EQ(2, settings_.getWindowPosition().bottom); - EXPECT_EQ(3, settings_.getWindowPosition().left); - EXPECT_EQ(4, settings_.getWindowPosition().right); - EXPECT_TRUE(settings_.getWindowPosition().maximised); - - const YAML::Node outputYaml = settings_.toYaml(); - EXPECT_EQ(updateMasterlist, outputYaml["updateMasterlist"].as()); - EXPECT_EQ(lastVersion, outputYaml["lastVersion"].as()); - - for (const auto& filter : filters) { - EXPECT_EQ(filter.second, outputYaml["filters"][filter.first].as()); - } - - EXPECT_EQ(games[0].Name(), settings_.getGameSettings()[0].Name()); -} - -TEST_F(LootSettingsTest, loadingFromEmptyYamlShouldNotThrow) { - YAML::Node yaml; - EXPECT_NO_THROW(settings_.load(yaml)); -} - -TEST_F(LootSettingsTest, loadingFromYamlShouldUpgradeFromVersion0Point6Format) { - const unsigned int DebugVerbosity = 3; - const bool UpdateMasterlist = true; - const std::string Game = "Oblivion"; - const std::string Language = "fr"; - const std::string LastGame = "Skyrim"; - const std::vector Games({ - GameSettings(GameType::tes4).SetName("Game Name"), - }); - - YAML::Node inputYaml; - inputYaml["Debug Verbosity"] = DebugVerbosity; - inputYaml["Update Masterlist"] = UpdateMasterlist; - inputYaml["Game"] = Game; - inputYaml["Language"] = Language; - inputYaml["Last Game"] = LastGame; - - inputYaml["Games"] = Games; - inputYaml["Games"][0]["url"] = inputYaml["Games"][0]["repo"]; - inputYaml["Games"][0].remove("repo"); - inputYaml["Games"][0].remove("branch"); - - settings_.load(inputYaml); - - const YAML::Node outputYaml = settings_.toYaml(); - EXPECT_TRUE(settings_.isDebugLoggingEnabled()); - EXPECT_EQ(UpdateMasterlist, outputYaml["updateMasterlist"].as()); - EXPECT_EQ(Game, settings_.getGame()); - EXPECT_EQ(Language, settings_.getLanguage().GetLocale()); - EXPECT_EQ(LastGame, settings_.getLastGame()); - - EXPECT_EQ(Games[0].Name(), settings_.getGameSettings()[0].Name()); - EXPECT_EQ(Games[0].RepoURL(), settings_.getGameSettings()[0].RepoURL()); - EXPECT_EQ("master", settings_.getGameSettings()[0].RepoBranch()); -} - -TEST_F(LootSettingsTest, loadingFromYamlShouldNotUpgradeVersion0Point6SettingsIfEquivalentsAlreadyExist) { - const unsigned int DebugVerbosity = 3; - const bool enableDebugLogging = false; - const bool UpdateMasterlist = true; - const bool updateMasterlist = false; - const std::string Game = "Oblivion"; - const std::string game = "auto"; - const std::string Language = "fr"; - const std::string language = "en"; - const std::string LastGame = "Skyrim"; - const std::string lastGame = "auto"; - const std::vector Games({ - GameSettings(GameType::tes4).SetName("Old Game Name"), - }); - const std::vector games({ - GameSettings(GameType::fo3).SetName("Game Name"), - }); - - YAML::Node inputYaml; - inputYaml["Debug Verbosity"] = DebugVerbosity; - inputYaml["enableDebugLogging"] = enableDebugLogging; - inputYaml["Update Masterlist"] = UpdateMasterlist; - inputYaml["updateMasterlist"] = updateMasterlist; - inputYaml["Game"] = Game; - inputYaml["game"] = game; - inputYaml["Language"] = Language; - inputYaml["language"] = language; - inputYaml["Last Game"] = LastGame; - inputYaml["lastGame"] = lastGame; - - inputYaml["Games"] = Games; - inputYaml["Games"][0]["url"] = inputYaml["Games"][0]["repo"]; - inputYaml["Games"][0].remove("repo"); - inputYaml["Games"][0].remove("branch"); - inputYaml["games"] = games; - - settings_.load(inputYaml); - - const YAML::Node outputYaml = settings_.toYaml(); - - EXPECT_EQ(enableDebugLogging, settings_.isDebugLoggingEnabled()); - EXPECT_EQ(updateMasterlist, outputYaml["updateMasterlist"].as()); - EXPECT_EQ(game, settings_.getGame()); - EXPECT_EQ(language, settings_.getLanguage().GetLocale()); - EXPECT_EQ(lastGame, settings_.getLastGame()); - - EXPECT_EQ(games[0].Name(), settings_.getGameSettings()[0].Name()); -} - -TEST_F(LootSettingsTest, loadingFromYamlShouldUpgradeOldDefaultGameRepositoryBranches) { - const std::vector games({GameSettings(GameType::tes4)}); - - YAML::Node inputYaml; - inputYaml["games"] = games; - inputYaml["games"][0]["branch"] = "v0.7"; - - settings_.load(inputYaml); - - EXPECT_EQ(games[0].RepoBranch(), settings_.getGameSettings()[0].RepoBranch()); -} - -TEST_F(LootSettingsTest, loadingFromYamlShouldNotUpgradeNonDefaultGameRepositoryBranches) { - const std::vector games({GameSettings(GameType::tes4)}); - - YAML::Node inputYaml; - inputYaml["games"] = games; - inputYaml["games"][0]["branch"] = "foo"; - - settings_.load(inputYaml); - - EXPECT_EQ("foo", settings_.getGameSettings()[0].RepoBranch()); -} - -TEST_F(LootSettingsTest, loadingFromYamlShouldAddMissingBaseGames) { - const std::vector games({GameSettings(GameType::tes4)}); - YAML::Node inputYaml; - inputYaml["games"] = games; - - settings_.load(inputYaml); - - const std::vector expectedGameSettings({ - GameSettings(GameType::tes4), - GameSettings(GameType::tes5), - GameSettings(GameType::tes5se), - GameSettings(GameType::fo3), - GameSettings(GameType::fonv), - GameSettings(GameType::fo4), - }); - EXPECT_EQ(expectedGameSettings, settings_.getGameSettings()); -} - -TEST_F(LootSettingsTest, loadingFromYamlShouldSkipUnrecognisedGames) { - YAML::Node inputYaml; - inputYaml["games"][0] = GameSettings(GameType::tes4); - inputYaml["games"][0]["type"] = "Foobar"; - inputYaml["games"][0]["name"] = "Foobar"; - inputYaml["games"][1] = GameSettings(GameType::tes5).SetName("Game Name"); - - settings_.load(inputYaml); - - EXPECT_EQ("Game Name", settings_.getGameSettings()[0].Name()); -} - -TEST_F(LootSettingsTest, loadingFromYamlShouldRemoveTheContentFilterSetting) { - YAML::Node inputYaml; - inputYaml["filters"]["contentFilter"] = "foo"; - - settings_.load(inputYaml); -} - -TEST_F(LootSettingsTest, saveShouldWriteSettingsAsYamlToPassedFile) { - settings_.storeLastGame("Skyrim"); - settings_.save(settingsFile_); - - settings_.storeLastGame("auto"); - settings_.load(settingsFile_); - - EXPECT_EQ("Skyrim", settings_.getLastGame()); -} - -TEST_F(LootSettingsTest, getLanguageShouldReturnTheCurrentValue) { - YAML::Node inputYaml; - inputYaml["language"] = "fr"; - - settings_.load(inputYaml); - - EXPECT_EQ("fr", settings_.getLanguage().GetLocale()); -} - -TEST_F(LootSettingsTest, isWindowPositionStoredShouldReturnFalseIfAllPositionValuesAreZero) { - LootSettings::WindowPosition position; - settings_.storeWindowPosition(position); - - EXPECT_FALSE(settings_.isWindowPositionStored()); -} - -TEST_F(LootSettingsTest, isWindowPositionStoredShouldReturnTrueIfTopPositionValueIsNonZero) { - LootSettings::WindowPosition position; - position.top = 1; - settings_.storeWindowPosition(position); - - EXPECT_TRUE(settings_.isWindowPositionStored()); -} - -TEST_F(LootSettingsTest, isWindowPositionStoredShouldReturnTrueIfBottomPositionValueIsNonZero) { - LootSettings::WindowPosition position; - position.bottom = 1; - settings_.storeWindowPosition(position); - - EXPECT_TRUE(settings_.isWindowPositionStored()); -} - -TEST_F(LootSettingsTest, isWindowPositionStoredShouldReturnTrueIfLeftPositionValueIsNonZero) { - LootSettings::WindowPosition position; - position.left = 1; - settings_.storeWindowPosition(position); - - EXPECT_TRUE(settings_.isWindowPositionStored()); -} - -TEST_F(LootSettingsTest, isWindowPositionStoredShouldReturnTrueIfRightPositionValueIsNonZero) { - LootSettings::WindowPosition position; - position.right = 1; - settings_.storeWindowPosition(position); - - EXPECT_TRUE(settings_.isWindowPositionStored()); -} - -TEST_F(LootSettingsTest, storeGameSettingsShouldReplaceExistingGameSettings) { - const std::vector gameSettings({GameSettings(GameType::tes5)}); - settings_.storeGameSettings(gameSettings); - - EXPECT_EQ(gameSettings, settings_.getGameSettings()); -} - -TEST_F(LootSettingsTest, storeLastGameShouldReplaceExistingValue) { - settings_.storeLastGame("Fallout3"); - - EXPECT_EQ("Fallout3", settings_.getLastGame()); -} - -TEST_F(LootSettingsTest, storeWindowPositionShouldReplaceExistingValue) { - LootSettings::WindowPosition expectedPosition; - expectedPosition.top = 1; - settings_.storeWindowPosition(expectedPosition); - - LootSettings::WindowPosition actualPosition = settings_.getWindowPosition(); - EXPECT_EQ(expectedPosition.top, actualPosition.top); - EXPECT_EQ(expectedPosition.bottom, actualPosition.bottom); - EXPECT_EQ(expectedPosition.left, actualPosition.left); - EXPECT_EQ(expectedPosition.right, actualPosition.right); -} - -TEST_F(LootSettingsTest, updateLastVersionShouldSetValueToCurrentLootVersion) { - const std::string currentVersion = LootVersion::string(); - YAML::Node inputYaml; - inputYaml["lastVersion"] = "v0.7.1"; - - settings_.load(inputYaml); - settings_.updateLastVersion(); - - EXPECT_EQ(currentVersion, settings_.getLastVersion()); -} - -TEST_F(LootSettingsTest, toYamlShouldOutputStoredSettings) { - const bool enableDebugLogging = true; - const bool updateMasterlist = true; - const std::string game = "Oblivion"; - const std::string language = "fr"; - const std::string lastGame = "Skyrim"; - const std::string lastVersion = "0.7.1"; - const std::map window({ - {"top", 1}, - {"bottom", 2}, - {"left", 3}, - {"right", 4}, - }); - const std::vector games({ - GameSettings(GameType::tes4).SetName("Game Name"), - }); - const std::map filters({ - {"hideBashTags", false}, - {"hideCRCs", true}, - }); - - YAML::Node inputYaml; - inputYaml["enableDebugLogging"] = enableDebugLogging; - inputYaml["updateMasterlist"] = updateMasterlist; - inputYaml["game"] = game; - inputYaml["language"] = language; - inputYaml["lastGame"] = lastGame; - inputYaml["lastVersion"] = lastVersion; - inputYaml["window"] = window; - inputYaml["window"]["maximised"] = true; - inputYaml["games"] = games; - inputYaml["filters"] = filters; - - settings_.load(inputYaml); - - const YAML::Node outputYaml = settings_.toYaml(); - - EXPECT_EQ(enableDebugLogging, outputYaml["enableDebugLogging"].as()); - EXPECT_EQ(updateMasterlist, outputYaml["updateMasterlist"].as()); - EXPECT_EQ(game, outputYaml["game"].as()); - EXPECT_EQ(language, outputYaml["language"].as()); - EXPECT_EQ(lastGame, outputYaml["lastGame"].as()); - EXPECT_EQ(lastVersion, outputYaml["lastVersion"].as()); - - for (const auto& position : window) { - EXPECT_EQ(position.second, outputYaml["window"][position.first].as()); - } - EXPECT_TRUE(outputYaml["window"]["maximised"].as()); - - for (const auto& filter : filters) { - EXPECT_EQ(filter.second, outputYaml["filters"][filter.first].as()); - } - - EXPECT_EQ(games[0].Name(), outputYaml["games"][0]["name"].as()); -} -} -} - -#endif diff --git a/src/tests/gui/state/loot_state_test.h b/src/tests/gui/state/loot_state_test.h deleted file mode 100644 index f05a941f..00000000 --- a/src/tests/gui/state/loot_state_test.h +++ /dev/null @@ -1,77 +0,0 @@ -/* LOOT - -A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and -Fallout: New Vegas. - -Copyright (C) 2014-2016 WrinklyNinja - -This file is part of LOOT. - -LOOT is free software: you can redistribute -it and/or modify it under the terms of the GNU General Public License -as published by the Free Software Foundation, either version 3 of -the License, or (at your option) any later version. - -LOOT is distributed in the hope that it will -be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with LOOT. If not, see -. -*/ - -#ifndef LOOT_TESTS_GUI_STATE_LOOT_STATE_TEST -#define LOOT_TESTS_GUI_STATE_LOOT_STATE_TEST - -#include "gui/state/loot_state.h" - -#include - -namespace loot { -namespace test { -class LootStateTest : public ::testing::Test { -protected: - LootState lootState_; -}; - -TEST_F(LootStateTest, hasUnappliedChangesShouldBeFalseByDefault) { - EXPECT_FALSE(lootState_.hasUnappliedChanges()); -} - -TEST_F(LootStateTest, shouldNotHaveUnappliedChangesIfCounterIsDeccremented) { - lootState_.decrementUnappliedChangeCounter(); - EXPECT_FALSE(lootState_.hasUnappliedChanges()); -} - -TEST_F(LootStateTest, shouldHaveUnappliedChangesIfCounterIsIncremented) { - lootState_.incrementUnappliedChangeCounter(); - EXPECT_TRUE(lootState_.hasUnappliedChanges()); -} - -TEST_F(LootStateTest, incrementingTheChangeCounterMoreThanItIsDecrementedShouldLeaveUnappliedChanges) { - lootState_.incrementUnappliedChangeCounter(); - lootState_.incrementUnappliedChangeCounter(); - lootState_.decrementUnappliedChangeCounter(); - EXPECT_TRUE(lootState_.hasUnappliedChanges()); -} - -TEST_F(LootStateTest, incrementingTheChangeCounterLessThanItIsDecrementedShouldLeaveNoUnappliedChanges) { - lootState_.incrementUnappliedChangeCounter(); - lootState_.decrementUnappliedChangeCounter(); - lootState_.decrementUnappliedChangeCounter(); - EXPECT_FALSE(lootState_.hasUnappliedChanges()); -} - -TEST_F(LootStateTest, incrementingTheChangeCounterThenDecrementingItEquallyShouldLeaveNoUnappliedChanges) { - lootState_.incrementUnappliedChangeCounter(); - lootState_.incrementUnappliedChangeCounter(); - lootState_.decrementUnappliedChangeCounter(); - lootState_.decrementUnappliedChangeCounter(); - EXPECT_FALSE(lootState_.hasUnappliedChanges()); -} -} -} - -#endif