diff --git a/.gitignore b/.gitignore
index f515c8000..da6685359 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@
/debug32/
/debug64/
/builds/
+.vs/
*.o.d
*.ninja
.ninja*
@@ -27,6 +28,9 @@
#xcode
*.xcodeproj/
+#clion
+.idea/
+
#other stuff (windows stuff, qt moc stuff, etc)
Release_MD/
Release/
@@ -45,6 +49,14 @@ install-sh
Makefile.in
Makefile
+#python
+__pycache__
+
+#sphinx
+/docs/sphinx/_build/*
+!/docs/sphinx/_build/.gitignore
+!/docs/sphinx/Makefile
+
#random useless file stuff
*.dmg
*.app
@@ -89,3 +101,5 @@ tags
*/**/.DS_Store
dependencies2015/
+nightly
+.idea/
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
index aa5f14a6f..aa640277e 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,19 +1,18 @@
[submodule "plugins/win-dshow/libdshowcapture"]
path = plugins/win-dshow/libdshowcapture
- url = https://github.com/jp9000/libdshowcapture.git
+ url = https://github.com/obsproject/libdshowcapture.git
[submodule "plugins/mac-syphon/syphon-framework"]
path = plugins/mac-syphon/syphon-framework
url = https://github.com/palana/Syphon-Framework.git
[submodule "plugins/enc-amf"]
path = plugins/enc-amf
- url = https://github.com/Xaymar/obs-studio_amf-encoder-plugin.git
+ url = https://github.com/obsproject/obs-amd-encoder.git
[submodule "plugins/obs-browser"]
path = plugins/obs-browser
- url = https://github.com/kc5nra/obs-browser.git
+ url = https://github.com/obsproject/obs-browser.git
[submodule "plugins/obs-vst"]
path = plugins/obs-vst
- url = https://github.com/DDRBoxman/obs-vst.git
+ url = https://github.com/obsproject/obs-vst.git
[submodule "plugins/websocket-client/third_party"]
path = plugins/websocket-client/third_party
- url = https://github.com/chriskohlhoff/asio.git
-
+ url = https://github.com/chriskohlhoff/asio.git
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index 9efe0563a..910019688 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -20,6 +20,7 @@ env:
matrix:
include:
- os: osx
+ osx_image: xcode9.4
env:
- CMAKE_PREFIX_PATH=/usr/local/opt/qt5/lib/cmake
- CEF_BUILD_VERSION=3.3282.1726.gc8368c8
@@ -45,7 +46,7 @@ deploy:
region: us-west-2
acl: public_read
on:
- repo: jp9000/obs-studio
+ repo: obsproject/obs-studio
condition: "$TRAVIS_OS_NAME = osx"
all_branches: true
@@ -63,6 +64,7 @@ notifications:
webhooks:
urls:
- secure: T5RBY818nO40nr5eC8pdrCfAdQKGkjQdbyYw7mfFrhxWxgt/U5tyKXpX0l9zNGfobS0SnLSqF71OrfW04V97oijXx3q5Y24xV6mSrlLQZOq19+XvGp82LDpkVd4yi2N0kBYpoANB9Pkof4jWT/rKfdQCQttluOLjgr5SM0uWHRg=
+ - secure: EVI2cu5OnNxVTl4jdVppps7O869gGN1PDcSi8fqq/HJVM5kif8iDe4wCrIKv6yWrK3dSNwRgBAwpcPZglRJnKRh23PdFoCdnTjgzBQlmjUR6BYlunQvoKR9mVX6AdT8zrFDgmtC4aOtGD2paptpqt+Equo25KrLwv+qOHJOTrSQ=
on_success: change
on_failure: always
diff --git a/AUTHORS b/AUTHORS
index a2f519228..3060d4a0e 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,3 +1,5 @@
+Original Author: Hugh Bailey ("Jim")
+
Contributors are sorted by their amount of commits / translated strings.
Contributors:
diff --git a/CI/before-deploy-osx.sh b/CI/before-deploy-osx.sh
index f1a87f41c..26671103b 100755
--- a/CI/before-deploy-osx.sh
+++ b/CI/before-deploy-osx.sh
@@ -15,13 +15,13 @@ export FILENAME=$FILE_DATE-$GIT_HASH-$TRAVIS_BRANCH-osx.pkg
cd ./build
# Move the CEF plugin out before running build_app so that it doesn't get packaged twice
-hr "Moving CEF out to preserve linking"
-mv ./rundir/RelWithDebInfo/obs-plugins/CEF.app ./
-mv ./rundir/RelWithDebInfo/obs-plugins/obs-browser.so ./
+# hr "Moving CEF out to preserve linking"
+# mv ./rundir/RelWithDebInfo/obs-plugins/CEF.app ./
+# mv ./rundir/RelWithDebInfo/obs-plugins/obs-browser.so ./
# Move obslua
-hr "Moving OBS LUA"
-mv ./rundir/RelWithDebInfo/data/obs-scripting/obslua.so ./rundir/RelWithDebInfo/bin/
+#hr "Moving OBS LUA"
+#cp ./rundir/RelWithDebInfo/data/obs-scripting/obslua.so ./rundir/RelWithDebInfo/bin/
# Move obspython
# hr "Moving OBS Python"
@@ -35,33 +35,48 @@ if [ -n "${TRAVIS_TAG}" ]; then
STABLE=true
fi
-sudo python ../CI/install/osx/build_app.py --public-key ../CI/install/osx/OBSPublicDSAKey.pem --sparkle-framework ../../sparkle/Sparkle.framework --base-url "https://obsproject.com/osx_update" --stable=$STABLE
+sudo python ../CI/install/osx/build_app.py --public-key ../CI/install/osx/OBSPublicDSAKey.pem --sparkle-framework ../../sparkle/Sparkle.framework --stable=$STABLE
# Move the CEF plugin back to where it belongs
-hr "Moving CEF back"
-mv ./CEF.app ./rundir/RelWithDebInfo/obs-plugins/
-mv ./obs-browser.so ./rundir/RelWithDebInfo/obs-plugins/
+# hr "Moving CEF back"
+# mv ./CEF.app ./rundir/RelWithDebInfo/obs-plugins/
+# mv ./obs-browser.so ./rundir/RelWithDebInfo/obs-plugins/
+
+# Copy Chromium embedded framework to app Frameworks directory
+#hr "Copying Chromium Embedded Framework.framework"
+#sudo mkdir -p OBS.app/Contents/Frameworks
+#sudo cp -r ../../cef_binary_${CEF_BUILD_VERSION}_macosx64/Release/Chromium\ Embedded\ Framework.framework OBS.app/Contents/Frameworks/
+#sudo install_name_tool -change \
+# @rpath/Frameworks/Chromium\ Embedded\ Framework.framework/Chromium\ Embedded\ Framework \
+# ../../Frameworks/Chromium\ Embedded\ Framework.framework/Chromium\ Embedded\ Framework \
+# OBS.app/Contents/Resources/obs-plugins/obs-browser.so
+#sudo install_name_tool -change \
+# @rpath/Frameworks/Chromium\ Embedded\ Framework.framework/Chromium\ Embedded\ Framework \
+# ../../Frameworks/Chromium\ Embedded\ Framework.framework/Chromium\ Embedded\ Framework \
+# OBS.app/Contents/Resources/obs-plugins/obs-browser-page
# Package app
hr "Generating .pkg"
packagesbuild ../CI/install/osx/CMakeLists.pkgproj
# Signing stuff
-hr "Decrypting Cert"
-openssl aes-256-cbc -K $encrypted_dd3c7f5e9db9_key -iv $encrypted_dd3c7f5e9db9_iv -in ../CI/osxcert/Certificates.p12.enc -out Certificates.p12 -d
-hr "Creating Keychain"
-security create-keychain -p mysecretpassword build.keychain
-security default-keychain -s build.keychain
-security unlock-keychain -p mysecretpassword build.keychain
-security set-keychain-settings -t 3600 -u build.keychain
-hr "Importing certs into keychain"
-security import ./Certificates.p12 -k build.keychain -T /usr/bin/productsign -P ""
-# macOS 10.12+
-security set-key-partition-list -S apple-tool:,apple: -s -k mysecretpassword build.keychain
-hr "Signing Package"
-productsign --sign 2MMRE5MTB8 ./OBS.pkg ./$FILENAME
+#hr "Decrypting Cert"
+#openssl aes-256-cbc -K $encrypted_dd3c7f5e9db9_key -iv $encrypted_dd3c7f5e9db9_iv -in ../CI/osxcert/Certificates.p12.enc -out Certificates.p12 -d
+#hr "Creating Keychain"
+#security create-keychain -p mysecretpassword build.keychain
+#security default-keychain -s build.keychain
+#security unlock-keychain -p mysecretpassword build.keychain
+#security set-keychain-settings -t 3600 -u build.keychain
+#hr "Importing certs into keychain"
+#security import ./Certificates.p12 -k build.keychain -T /usr/bin/productsign -P ""
+## macOS 10.12+
+#security set-key-partition-list -S apple-tool:,apple: -s -k mysecretpassword build.keychain
+#hr "Signing Package"
+#productsign --sign 2MMRE5MTB8 ./OBS.pkg ./$FILENAME
+
+mv ./EBS.pkg ./$FILENAME
# Move to the folder that travis uses to upload artifacts from
hr "Moving package to nightly folder for distribution"
-mkdir ../nightly
+mkdir -p ../nightly
sudo mv ./$FILENAME ../nightly
diff --git a/CI/before-deploy-win.cmd b/CI/before-deploy-win.cmd
index 0597fe00e..84a307082 100644
--- a/CI/before-deploy-win.cmd
+++ b/CI/before-deploy-win.cmd
@@ -1,3 +1,3 @@
-robocopy C:\projects\obs-studio\build32\rundir\RelWithDebInfo C:\projects\obs-studio\build\ /E /XF .gitignore
-robocopy C:\projects\obs-studio\build64\rundir\RelWithDebInfo C:\projects\obs-studio\build\ /E /XC /XN /XO /XF .gitignore
-7z a build.zip C:\projects\obs-studio\build\*
\ No newline at end of file
+robocopy C:\projects\ebs-studio\build32\rundir\RelWithDebInfo C:\projects\ebs-studio\build\ /E /XF .gitignore
+robocopy C:\projects\ebs-studio\build64\rundir\RelWithDebInfo C:\projects\ebs-studio\build\ /E /XC /XN /XO /XF .gitignore
+7z a build.zip C:\projects\ebs-studio\build\*
\ No newline at end of file
diff --git a/CI/before-script-osx.sh b/CI/before-script-osx.sh
index 6cff70dab..9066ef0f6 100755
--- a/CI/before-script-osx.sh
+++ b/CI/before-script-osx.sh
@@ -1,11 +1,15 @@
# Make sure ccache is found
-export PATH=/usr/local/opt/ccache/libexec:$PATH
+# export PATH=/usr/local/opt/ccache/libexec:$PATH
+# set CEF version for use later
+# export CEF_BUILD_VERSION="3.3282.1726.gc8368c8"
+
+sudo rm -rf build
mkdir build
cd build
-cmake -DENABLE_SPARKLE_UPDATER=ON \
+cmake \
-DCMAKE_OSX_DEPLOYMENT_TARGET=10.10 \
--DDepsPath=/tmp/obsdeps \
+-DDepsPath=/tmp/ebsdeps \
-DVLCPath=$PWD/../../vlc-master \
--DBUILD_BROWSER=ON \
--DCEF_ROOT_DIR=$PWD/../../cef_binary_${CEF_BUILD_VERSION}_macosx64 ..
\ No newline at end of file
+-DCMAKE_INSTALL_PREFIX=/opt/ebs \
+-DCMAKE_BUILD_TYPE=RelWithDebInfo ..
\ No newline at end of file
diff --git a/CI/install-dependencies-linux-ubuntu16.sh b/CI/install-dependencies-linux-ubuntu16.sh
new file mode 100755
index 000000000..470dc2cbb
--- /dev/null
+++ b/CI/install-dependencies-linux-ubuntu16.sh
@@ -0,0 +1,57 @@
+#!/bin/sh
+set -ex
+
+sudo apt-get -qq update
+sudo apt-get install -y \
+ build-essential \
+ checkinstall \
+ cmake \
+ libasound2-dev \
+ libavcodec-dev \
+ libavdevice-dev \
+ libavfilter-dev \
+ libavformat-dev \
+ libavutil-dev \
+ libcurl4-openssl-dev \
+ libfdk-aac-dev \
+ libfontconfig-dev \
+ libfreetype6-dev \
+ libgl1-mesa-dev \
+ libjack-jackd2-dev \
+ libjansson-dev \
+ libluajit-5.1-dev \
+ libpulse-dev \
+ libqt5x11extras5-dev \
+ libspeexdsp-dev \
+ libswresample-dev \
+ libswscale-dev \
+ libudev-dev \
+ libv4l-dev \
+ libvlc-dev \
+ libx11-dev \
+ libx264-dev \
+ libxcb-shm0-dev \
+ libxcb-xinerama0-dev \
+ libxcomposite-dev \
+ libxinerama-dev \
+ pkg-config \
+ python3-dev \
+ qtbase5-dev \
+ swig
+
+
+# build mbedTLS
+cd ~/projects
+mkdir mbedtls
+cd mbedtls
+mbedtlsPath=$PWD
+curl -L -O https://github.com/ARMmbed/mbedtls/archive/mbedtls-2.12.0.tar.gz
+tar -xf mbedtls-2.12.0.tar.gz
+mkdir build
+cd ./build
+cmake -DENABLE_TESTING=Off -DUSE_SHARED_MBEDTLS_LIBRARY=On ../mbedtls-mbedtls-2.12.0
+make -j 12
+sudo make install
+
+# return to OBS build dir
+cd $APPVEYOR_BUILD_FOLDER
diff --git a/CI/install-dependencies-linux.sh b/CI/install-dependencies-linux.sh
index 2cbd8de9b..21b68b688 100755
--- a/CI/install-dependencies-linux.sh
+++ b/CI/install-dependencies-linux.sh
@@ -1,18 +1,18 @@
#!/bin/sh
set -ex
-sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next -y
+sudo add-apt-repository ppa:jonathonf/ffmpeg-3 -y
sudo apt-get -qq update
sudo apt-get install -y \
build-essential \
checkinstall \
cmake \
libasound2-dev \
- libavcodec-ffmpeg-dev \
- libavdevice-ffmpeg-dev \
- libavfilter-ffmpeg-dev \
- libavformat-ffmpeg-dev \
- libavutil-ffmpeg-dev \
+ libavcodec-dev \
+ libavdevice-dev \
+ libavfilter-dev \
+ libavformat-dev \
+ libavutil-dev \
libcurl4-openssl-dev \
libfdk-aac-dev \
libfontconfig-dev \
@@ -24,10 +24,11 @@ sudo apt-get install -y \
libpulse-dev \
libqt5x11extras5-dev \
libspeexdsp-dev \
- libswresample-ffmpeg-dev \
- libswscale-ffmpeg-dev \
+ libswresample-dev \
+ libswscale-dev \
libudev-dev \
libv4l-dev \
+ libva-dev \
libvlc-dev \
libx11-dev \
libx264-dev \
diff --git a/CI/install-dependencies-osx.sh b/CI/install-dependencies-osx.sh
index 4d5329661..ff8098c07 100755
--- a/CI/install-dependencies-osx.sh
+++ b/CI/install-dependencies-osx.sh
@@ -1,50 +1,72 @@
+hr() {
+ echo "───────────────────────────────────────────────────"
+ echo $1
+ echo "───────────────────────────────────────────────────"
+}
+
# Exit if something fails
set -e
# Echo all commands before executing
set -v
-git fetch --unshallow
+# set CEF version for use later
+# export CEF_BUILD_VERSION=3.3282.1726.gc8368c8
+
+# needed for enabling "ibtool" which is used later during packaging
+sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
+
+# doesn't work in a repo
+# git fetch --unshallow
# Leave obs-studio folder
cd ../
# Install Packages app so we can build a package later
# http://s.sudre.free.fr/Software/Packages/about.html
-wget --retry-connrefused --waitretry=1 https://s3-us-west-2.amazonaws.com/obs-nightly/Packages.pkg
+hr "Downloading Packages app"
+wget --quiet --retry-connrefused --waitretry=1 https://s3-us-west-2.amazonaws.com/obs-nightly/Packages.pkg
sudo installer -pkg ./Packages.pkg -target /
brew update
#Base OBS Deps and ccache
-brew install qt5 jack speexdsp ccache swig
+# skip installing jack as it causes libcrypto conflict in obs-outputs
+# skip installing ccache, enable if you want
+brew install speexdsp swig #ccache #jack
+# install qt@5.10.1
+brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/8d4d48f0bb552b7b107119aeef59f141ce1f72c3/Formula/qt.rb
-export PATH=/usr/local/opt/ccache/libexec:$PATH
-ccache -s || echo "CCache is not available."
+# export PATH=/usr/local/opt/ccache/libexec:$PATH
+# ccache -s || echo "CCache is not available."
# Fetch and untar prebuilt OBS deps that are compatible with older versions of OSX
+hr "Downloading OBS deps"
wget --retry-connrefused --waitretry=1 https://s3-us-west-2.amazonaws.com/obs-nightly/osx-deps.tar.gz
tar -xf ./osx-deps.tar.gz -C /tmp
# Fetch vlc codebase
+hr "Downloading VLC repo"
wget --retry-connrefused --waitretry=1 -O vlc-master.zip https://github.com/videolan/vlc/archive/master.zip
unzip -q ./vlc-master.zip
# Get sparkle
+hr "Downloading Sparkle framework"
wget --retry-connrefused --waitretry=1 -O sparkle.tar.bz2 https://github.com/sparkle-project/Sparkle/releases/download/1.16.0/Sparkle-1.16.0.tar.bz2
mkdir ./sparkle
tar -xf ./sparkle.tar.bz2 -C ./sparkle
sudo cp -R ./sparkle/Sparkle.framework /Library/Frameworks/Sparkle.framework
# CEF Stuff
-wget --retry-connrefused --waitretry=1 https://obs-nightly.s3-us-west-2.amazonaws.com/cef_binary_${CEF_BUILD_VERSION}_macosx64.tar.bz2
-tar -xf ./cef_binary_${CEF_BUILD_VERSION}_macosx64.tar.bz2
-cd ./cef_binary_${CEF_BUILD_VERSION}_macosx64
-# remove a broken test
-sed -i '.orig' '/add_subdirectory(tests\/ceftests)/d' ./CMakeLists.txt
-mkdir build
-cd ./build
-cmake -DCMAKE_CXX_FLAGS="-std=c++11 -stdlib=libc++" -DCMAKE_EXE_LINKER_FLAGS="-std=c++11 -stdlib=libc++" -DCMAKE_OSX_DEPLOYMENT_TARGET=10.9 ..
-make -j4
-mkdir libcef_dll
-cd ../../
+hr "Downloading CEF"
+# wget --quiet --retry-connrefused --waitretry=1 https://obs-nightly.s3-us-west-2.amazonaws.com/cef_binary_${CEF_BUILD_VERSION}_macosx64.tar.bz2
+# tar -xf ./cef_binary_${CEF_BUILD_VERSION}_macosx64.tar.bz2
+# cd ./cef_binary_${CEF_BUILD_VERSION}_macosx64
+# # remove a broken test
+# sed -i '.orig' '/add_subdirectory(tests\/ceftests)/d' ./CMakeLists.txt
+# mkdir build
+# cd ./build
+# cmake -DCMAKE_CXX_FLAGS="-std=c++11 -stdlib=libc++" -DCMAKE_EXE_LINKER_FLAGS="-std=c++11 -stdlib=libc++" -DCMAKE_OSX_DEPLOYMENT_TARGET=10.9 ..
+# make -j4
+# mkdir libcef_dll
+# cd ../../
diff --git a/CI/install-script-linux.sh b/CI/install-script-linux.sh
new file mode 100755
index 000000000..abbfbf00c
--- /dev/null
+++ b/CI/install-script-linux.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+set -ex
+
+build_config=RelWithDebInfo
diff --git a/CI/install-script-win.cmd b/CI/install-script-win.cmd
new file mode 100644
index 000000000..2975926d2
--- /dev/null
+++ b/CI/install-script-win.cmd
@@ -0,0 +1,22 @@
+if exist dependencies2017.zip (curl -kLO https://obsproject.com/downloads/dependencies2017.zip -f --retry 5 -z dependencies2017.zip) else (curl -kLO https://obsproject.com/downloads/dependencies2017.zip -f --retry 5 -C -)
+if exist vlc.zip (curl -kLO https://obsproject.com/downloads/vlc.zip -f --retry 5 -z vlc.zip) else (curl -kLO https://obsproject.com/downloads/vlc.zip -f --retry 5 -C -)
+if exist cef_binary_%CEF_VERSION%_windows32.zip (curl -kLO https://obsproject.com/downloads/cef_binary_%CEF_VERSION%_windows32.zip -f --retry 5 -z cef_binary_%CEF_VERSION%_windows32.zip) else (curl -kLO https://obsproject.com/downloads/cef_binary_%CEF_VERSION%_windows32.zip -f --retry 5 -C -)
+if exist cef_binary_%CEF_VERSION%_windows64.zip (curl -kLO https://obsproject.com/downloads/cef_binary_%CEF_VERSION%_windows64.zip -f --retry 5 -z cef_binary_%CEF_VERSION%_windows64.zip) else (curl -kLO https://obsproject.com/downloads/cef_binary_%CEF_VERSION%_windows64.zip -f --retry 5 -C -)
+7z x dependencies2017.zip -odependencies2017
+7z x vlc.zip -ovlc
+7z x cef_binary_%CEF_VERSION%_windows32.zip -oCEF_32
+7z x cef_binary_%CEF_VERSION%_windows64.zip -oCEF_64
+set DepsPath32=%CD%\dependencies2017\win32
+set DepsPath64=%CD%\dependencies2017\win64
+set VLCPath=%CD%\vlc
+set QTDIR32=C:\Qt\5.11.1\msvc2015
+set QTDIR64=C:\Qt\5.11.1\msvc2017_64
+set CEF_32=%CD%\CEF_32\cef_binary_%CEF_VERSION%_windows32
+set CEF_64=%CD%\CEF_64\cef_binary_%CEF_VERSION%_windows64
+set build_config=RelWithDebInfo
+mkdir build build32 build64
+cd ./build32
+cmake -G "Visual Studio 15 2017" -DCOPIED_DEPENDENCIES=false -DCOPY_DEPENDENCIES=true -DBUILD_CAPTIONS=true -DCOMPILE_D3D12_HOOK=true -DBUILD_BROWSER=true -DCEF_ROOT_DIR=%CEF_32% ..
+cd ../build64
+cmake -G "Visual Studio 15 2017 Win64" -DCOPIED_DEPENDENCIES=false -DCOPY_DEPENDENCIES=true -DBUILD_CAPTIONS=true -DCOMPILE_D3D12_HOOK=true -DBUILD_BROWSER=true -DCEF_ROOT_DIR=%CEF_64% ..
+cd ..
diff --git a/CI/install/osx/CMakeLists.pkgproj b/CI/install/osx/CMakeLists.pkgproj
index eff607a0b..d66934e24 100644
--- a/CI/install/osx/CMakeLists.pkgproj
+++ b/CI/install/osx/CMakeLists.pkgproj
@@ -22,7 +22,7 @@
GID
80
PATH
- ../../../build/OBS.app
+ ../../../build/EBS.app
PATH_TYPE
3
PERMISSIONS
@@ -80,13 +80,13 @@
CHILDREN
-
+
GID
80
@@ -158,7 +158,7 @@
GID
80
PATH
- obs-studio
+ ebs-studio
PATH_TYPE
0
PERMISSIONS
@@ -591,9 +591,9 @@
CONCLUSION_ACTION
0
IDENTIFIER
- org.obsproject.pkg.obs-studio
+ evercast.pkg.ebs-studio
NAME
- OBS
+ EBS
OVERWRITE_PERMISSIONS
VERSION
@@ -651,7 +651,7 @@
BACKGROUND_PATH
PATH
- obs.png
+ ebs.png
PATH_TYPE
1
@@ -815,7 +815,7 @@
LANGUAGE
English
VALUE
- OBS
+ EBS
@@ -1015,7 +1015,7 @@
NAME
- OBS
+ EBS
TYPE
diff --git a/CI/install/osx/build_app.py b/CI/install/osx/build_app.py
index 0709adbb8..6758f1d77 100644
--- a/CI/install/osx/build_app.py
+++ b/CI/install/osx/build_app.py
@@ -3,7 +3,7 @@
candidate_paths = "bin obs-plugins data".split()
plist_path = "../cmake/osxbundle/Info.plist"
-icon_path = "../cmake/osxbundle/obs.icns"
+icon_path = "../cmake/osxbundle/ebs.icns"
run_path = "../cmake/osxbundle/obslaunch.sh"
#not copied
@@ -40,12 +40,12 @@ def add_boolean_argument(parser, name, default=False):
'--' + name, nargs='?', default=default, const=True, type=_str_to_bool)
group.add_argument('--no' + name, dest=name, action='store_false')
-parser = argparse.ArgumentParser(description='obs-studio package util')
+parser = argparse.ArgumentParser(description='ebs-studio package util')
parser.add_argument('-d', '--base-dir', dest='dir', default='rundir/RelWithDebInfo')
parser.add_argument('-n', '--build-number', dest='build_number', default='0')
parser.add_argument('-k', '--public-key', dest='public_key', default='OBSPublicDSAKey.pem')
parser.add_argument('-f', '--sparkle-framework', dest='sparkle', default=None)
-parser.add_argument('-b', '--base-url', dest='base_url', default='https://builds.catchexception.org/obs-studio')
+parser.add_argument('-b', '--base-url', dest='base_url', default='https://builds.catchexception.org/ebs-studio')
parser.add_argument('-u', '--user', dest='user', default='jp9000')
parser.add_argument('-c', '--channel', dest='channel', default='master')
add_boolean_argument(parser, 'stable', default=False)
@@ -71,6 +71,10 @@ def add(name, external=False, copy_as=None):
copy_as = name.split("/")[-1]
if name[0] != "/":
name = build_path+"/"+name
+ if ("cosmo" in name):
+ name = "/usr/local/lib/" + name.split("/")[len(name.split("/")) - 1]
+ print "COSMO LIB FOUND - Replacing /Users/cosmo/ path with /usr/local/lib/"
+ print name
t = LibTarget(name, external, copy_as)
if t in inspected:
return
@@ -82,6 +86,16 @@ def add(name, external=False, copy_as=None):
print("Checking " + i)
for root, dirs, files in walk(build_path+"/"+i):
for file_ in files:
+ if ".ini" in file_:
+ continue
+ if ".png" in file_:
+ continue
+ if ".effect" in file_:
+ continue
+ if ".py" in file_:
+ continue
+ if ".json" in file_:
+ continue
path = root + "/" + file_
try:
out = check_output("{0}otool -L '{1}'".format(args.prefix, path), shell=True,
@@ -147,6 +161,12 @@ def add_plugins(path, replace):
for path, external, copy_as in inspected:
if not external:
continue #built with install_rpath hopefully
+ if ("libcrypto" in path):
+ libcrypto_path = "/Users/cosmo/DEV/libwebrtc-cmake/build_release/openssl_inst/lib/libcrypto.1.1.dylib"
+ changes.append("-change '%s' '@rpath/%s'"%(libcrypto_path, copy_as))
+ if ("libssl" in path):
+ libssl_path = "/Users/cosmo/DEV/libwebrtc-cmake/build_release/openssl_inst/lib/libssl.1.1.dylib"
+ changes.append("-change '%s' '@rpath/%s'"%(libssl_path, copy_as))
changes.append("-change '%s' '@rpath/%s'"%(path, copy_as))
changes = " ".join(changes)
@@ -188,7 +208,7 @@ def add_plugins(path, replace):
prefix = "tmp/Contents/Resources/"
sparkle_path = '@loader_path/{0}/Frameworks/Sparkle.framework/Versions/A/Sparkle'
-cmd('{0}install_name_tool -change {1} {2} {3}/bin/obs'.format(
+cmd('{0}install_name_tool -change {1} {2} {3}/bin/EBS'.format(
args.prefix, actual_sparkle_path, sparkle_path.format('../..'), prefix))
diff --git a/CI/install/osx/ebs.png b/CI/install/osx/ebs.png
new file mode 100644
index 000000000..9062e061a
Binary files /dev/null and b/CI/install/osx/ebs.png differ
diff --git a/CI/install/osx/package_util.py b/CI/install/osx/package_util.py
index 2ab0b9473..aae96df0a 100644
--- a/CI/install/osx/package_util.py
+++ b/CI/install/osx/package_util.py
@@ -79,10 +79,10 @@ def prepare_pkg(project, package_id):
import argparse
-parser = argparse.ArgumentParser(description='obs-studio package util')
+parser = argparse.ArgumentParser(description='ebs-studio package util')
parser.add_argument('-u', '--user', dest='user', default='jp9000')
-parser.add_argument('-p', '--package-id', dest='package_id', default='org.obsproject.pkg.obs-studio')
-parser.add_argument('-f', '--project-file', dest='project', default='OBS.pkgproj')
+parser.add_argument('-p', '--package-id', dest='package_id', default='evercast.pkg.ebs-studio')
+parser.add_argument('-f', '--project-file', dest='project', default='EBS.pkgproj')
parser.add_argument('-j', '--jenkins-build', dest='jenkins_build', default='0')
parser.add_argument('-b', '--branch', dest='branch', default='master')
parser.add_argument('-s', '--stable', dest='stable', required=False, action='store_true', default=False)
diff --git a/CI/install/osx/post-install.sh b/CI/install/osx/post-install.sh
index f55ae58bb..a0d357bb5 100644
--- a/CI/install/osx/post-install.sh
+++ b/CI/install/osx/post-install.sh
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# Fix permissions on CEF
-chmod 744 "/Library/Application Support/obs-studio/plugins/obs-browser/bin/CEF.app/Contents/Info.plist"
-chmod 744 "/Library/Application Support/obs-studio/plugins/obs-browser/bin/CEF.app/Contents/Frameworks/CEF Helper.app/Contents/Info.plist"
+# chmod 744 "/Library/Application Support/obs-studio/plugins/obs-browser/bin/CEF.app/Contents/Info.plist"
+# chmod 744 "/Library/Application Support/obs-studio/plugins/obs-browser/bin/CEF.app/Contents/Frameworks/CEF Helper.app/Contents/Info.plist"
diff --git a/CI/util/build-package-deps-osx.sh b/CI/util/build-package-deps-osx.sh
index 12fb805b9..5dfbb5332 100755
--- a/CI/util/build-package-deps-osx.sh
+++ b/CI/util/build-package-deps-osx.sh
@@ -1,5 +1,13 @@
#!/usr/bin/env bash
+set -e
+
+# This script builds a tar file that contains a bunch of deps that OBS needs for
+# advanced functionality on OSX. Currently this tar file is pulled down off of s3
+# and used in the CI build process on travis.
+# Mostly this sets build flags to compile with older SDKS and make sure that
+# the libs are portable.
+
exists()
{
command -v "$1" >/dev/null 2>&1
@@ -26,7 +34,7 @@ trap cleanup EXIT
cd $WORK_DIR
-DEPS_DEST=$WORK_DIR/obsdeps
+DEPS_DEST=$WORK_DIR/ebsdeps
# make dest dirs
mkdir $DEPS_DEST
@@ -35,54 +43,55 @@ mkdir $DEPS_DEST/include
mkdir $DEPS_DEST/lib
# OSX COMPAT
-export MACOSX_DEPLOYMENT_TARGET=10.9
+export MACOSX_DEPLOYMENT_TARGET=10.11
# If you need an olders SDK and Xcode won't give it to you
# https://github.com/phracker/MacOSX-SDKs
# libopus
-curl -L -O http://downloads.xiph.org/releases/opus/opus-1.1.3.tar.gz
-tar -xf opus-1.1.3.tar.gz
-cd ./opus-1.1.3
+curl -L -O https://ftp.osuosl.org/pub/xiph/releases/opus/opus-1.2.1.tar.gz
+tar -xf opus-1.2.1.tar.gz
+cd ./opus-1.2.1
mkdir build
cd ./build
-../configure --disable-shared --enable-static --prefix="/tmp/obsdeps"
+../configure --disable-shared --enable-static --prefix="/tmp/ebsdeps"
make -j 12
make install
cd $WORK_DIR
# libogg
-curl -L -O http://downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.gz
-tar -xf libogg-1.3.2.tar.gz
-cd ./libogg-1.3.2
+curl -L -O https://ftp.osuosl.org/pub/xiph/releases/ogg/libogg-1.3.3.tar.gz
+tar -xf libogg-1.3.3.tar.gz
+cd ./libogg-1.3.3
mkdir build
cd ./build
-../configure --disable-shared --enable-static --prefix="/tmp/obsdeps"
+../configure --disable-shared --enable-static --prefix="/tmp/ebsdeps"
make -j 12
make install
cd $WORK_DIR
# libvorbis
-curl -L -O http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.5.tar.gz
-tar -xf libvorbis-1.3.5.tar.gz
-cd ./libvorbis-1.3.5
+curl -L -O https://ftp.osuosl.org/pub/xiph/releases/vorbis/libvorbis-1.3.6.tar.gz
+tar -xf libvorbis-1.3.6.tar.gz
+cd ./libvorbis-1.3.6
mkdir build
cd ./build
-../configure --disable-shared --enable-static --prefix="/tmp/obsdeps"
+../configure --disable-shared --enable-static --prefix="/tmp/ebsdeps"
make -j 12
make install
cd $WORK_DIR
# libvpx
-curl -L -O http://storage.googleapis.com/downloads.webmproject.org/releases/webm/libvpx-1.6.0.tar.bz2
-tar -xf libvpx-1.6.0.tar.bz2
-cd ./libvpx-1.6.0
-mkdir build
+curl -L -O https://chromium.googlesource.com/webm/libvpx/+archive/v1.7.0.tar.gz
+mkdir -p ./libvpx-v1.7.0
+tar -xf v1.7.0.tar.gz -C $PWD/libvpx-v1.7.0
+cd ./libvpx-v1.7.0
+mkdir -p build
cd ./build
-../configure --disable-shared --libdir="/tmp/obsdeps/bin"
+../configure --disable-shared --prefix="/tmp/ebsdeps" --libdir="/tmp/ebsdeps/lib"
make -j 12
make install
@@ -94,10 +103,10 @@ cd ./x264
git checkout origin/stable
mkdir build
cd ./build
-../configure --extra-ldflags="-mmacosx-version-min=10.9" --enable-static --prefix="/tmp/obsdeps"
+../configure --extra-ldflags="-mmacosx-version-min=10.11" --enable-static --prefix="/tmp/ebsdeps"
make -j 12
make install
-../configure --extra-ldflags="-mmacosx-version-min=10.9" --enable-shared --libdir="/tmp/obsdeps/bin" --prefix="/tmp/obsdeps"
+../configure --extra-ldflags="-mmacosx-version-min=10.11" --enable-shared --libdir="/tmp/ebsdeps/bin" --prefix="/tmp/ebsdeps"
make -j 12
ln -f -s libx264.*.dylib libx264.dylib
find . -name \*.dylib -exec cp \{\} $DEPS_DEST/bin/ \;
@@ -107,12 +116,12 @@ rsync -avh --include="*/" --include="*.h" --exclude="*" ./* $DEPS_DEST/include/
cd $WORK_DIR
# janson
-curl -L -O http://www.digip.org/jansson/releases/jansson-2.9.tar.gz
-tar -xf jansson-2.9.tar.gz
-cd jansson-2.9
+curl -L -O http://www.digip.org/jansson/releases/jansson-2.11.tar.gz
+tar -xf jansson-2.11.tar.gz
+cd jansson-2.11
mkdir build
cd ./build
-../configure --libdir="/tmp/obsdeps/bin" --enable-shared --disable-static
+../configure --libdir="/tmp/ebsdeps/bin" --enable-shared --disable-static
make -j 12
find . -name \*.dylib -exec cp \{\} $DEPS_DEST/bin/ \;
rsync -avh --include="*/" --include="*.h" --exclude="*" ../* $DEPS_DEST/include/
@@ -120,16 +129,16 @@ rsync -avh --include="*/" --include="*.h" --exclude="*" ./* $DEPS_DEST/include/
cd $WORK_DIR
-export LDFLAGS="-L/tmp/obsdeps/lib"
-export CFLAGS="-I/tmp/obsdeps/include"
+export LDFLAGS="-L/tmp/ebsdeps/lib"
+export CFLAGS="-I/tmp/ebsdeps/include"
# FFMPEG
-curl -L -O https://github.com/FFmpeg/FFmpeg/archive/n3.2.2.zip
-unzip ./n3.2.2.zip
-cd ./FFmpeg-n3.2.2
+curl -L -O https://github.com/FFmpeg/FFmpeg/archive/n4.0.2.zip
+unzip ./n4.0.2.zip
+cd ./FFmpeg-n4.0.2
mkdir build
cd ./build
-../configure --extra-ldflags="-mmacosx-version-min=10.9" --enable-shared --disable-static --shlibdir="/tmp/obsdeps/bin" --enable-gpl --disable-doc --enable-libx264 --enable-libopus --enable-libvorbis --enable-libvpx --disable-outdev=sdl
+../configure --pkg-config-flags="--static" --extra-ldflags="-mmacosx-version-min=10.11" --enable-shared --disable-static --shlibdir="/tmp/ebsdeps/bin" --enable-gpl --disable-doc --enable-libx264 --enable-libopus --enable-libvorbis --enable-libvpx --disable-outdev=sdl
make -j 12
find . -name \*.dylib -exec cp \{\} $DEPS_DEST/bin/ \;
rsync -avh --include="*/" --include="*.h" --exclude="*" ../* $DEPS_DEST/include/
@@ -139,14 +148,14 @@ rsync -avh --include="*/" --include="*.h" --exclude="*" ./* $DEPS_DEST/include/
curl -L -O https://luajit.org/download/LuaJIT-2.0.5.tar.gz
tar -xf LuaJIT-2.0.5.tar.gz
cd LuaJIT-2.0.5
-make PREFIX=/tmp/obsdeps
-make PREFIX=/tmp/obsdeps install
-find /tmp/obsdeps/lib -name libluajit\*.dylib -exec cp \{\} $DEPS_DEST/lib/ \;
+make PREFIX=/tmp/ebsdeps
+make PREFIX=/tmp/ebsdeps install
+find /tmp/ebsdeps/lib -name libluajit\*.dylib -exec cp \{\} $DEPS_DEST/lib/ \;
rsync -avh --include="*/" --include="*.h" --exclude="*" src/* $DEPS_DEST/include/
-make PREFIX=/tmp/obsdeps uninstall
+make PREFIX=/tmp/ebsdeps uninstall
cd $WORK_DIR
-tar -czf osx-deps.tar.gz obsdeps
+tar -czf osx-deps.tar.gz ebsdeps
-cp ./osx-deps.tar.gz $CURDIR
\ No newline at end of file
+cp ./osx-deps.tar.gz $CURDIR
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d1f48d056..72324bf84 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,11 @@
cmake_minimum_required(VERSION 2.8.12)
-project(obs-studio)
+if (UNIX AND POLICY CMP0072)
+ # In case of both legacy and glvnd OpenGL libraries found. Prefer GLVND
+ cmake_policy(SET CMP0072 NEW)
+endif()
+
+project(ebs-studio)
option(BUILD_CAPTIONS "Build captions" FALSE)
@@ -27,6 +32,23 @@ include(ObsHelpers)
include(ObsCpack)
include(GNUInstallDirs)
+# Must be a string in the format of "x.x.x-rcx"
+if(DEFINED RELEASE_CANDIDATE)
+ set(OBS_VERSION "${RELEASE_CANDIDATE}")
+ string(REPLACE "-rc" "." RC_SPLIT ${RELEASE_CANDIDATE})
+ string(REPLACE "." ";" RC_SPLIT ${RC_SPLIT})
+ message(WARNING "******************************************************************************\nRelease candidate deteced, OBS_VERSION is now: ${OBS_VERSION}\n******************************************************************************")
+ list(GET RC_SPLIT 0 OBS_RELEASE_CANDIDATE_MAJOR)
+ list(GET RC_SPLIT 1 OBS_RELEASE_CANDIDATE_MINOR)
+ list(GET RC_SPLIT 2 OBS_RELEASE_CANDIDATE_PATCH)
+ list(GET RC_SPLIT 3 OBS_RELEASE_CANDIDATE)
+else()
+ set(OBS_RELEASE_CANDIDATE_MAJOR 0)
+ set(OBS_RELEASE_CANDIDATE_MINOR 0)
+ set(OBS_RELEASE_CANDIDATE_PATCH 0)
+ set(OBS_RELEASE_CANDIDATE 0)
+endif()
+
if(MSVC AND NOT EXISTS "${CMAKE_BINARY_DIR}/ALL_BUILD.vcxproj.user")
file(GENERATE
OUTPUT "${CMAKE_BINARY_DIR}/ALL_BUILD.vcxproj.user"
@@ -45,8 +67,8 @@ if(${CMAKE_C_COMPILER_ID} MATCHES "Clang" OR ${CMAKE_CXX_COMPILER_ID} MATCHES "C
endif()
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG)
- set(CMAKE_CXX_FLAGS "-Wall -Wextra -Wno-unused-function -Werror-implicit-function-declaration -Wno-missing-field-initializers ${CMAKE_CXX_FLAGS} -fno-strict-aliasing")
- set(CMAKE_C_FLAGS "-Wall -Wextra -Wno-unused-function -Werror-implicit-function-declaration -Wno-missing-braces -Wno-missing-field-initializers ${CMAKE_C_FLAGS} -std=gnu99 -fno-strict-aliasing")
+ set(CMAKE_CXX_FLAGS "-Wall -Wextra -Wvla -Wno-unused-function -Werror-implicit-function-declaration -Wno-missing-field-initializers ${CMAKE_CXX_FLAGS} -fno-strict-aliasing")
+ set(CMAKE_C_FLAGS "-Wall -Wextra -Wvla -Wno-unused-function -Werror-implicit-function-declaration -Wno-missing-braces -Wno-missing-field-initializers ${CMAKE_C_FLAGS} -std=gnu99 -fno-strict-aliasing")
option(USE_LIBC++ "Use libc++ instead of libstdc++" ${APPLE})
if(USE_LIBC++)
@@ -60,7 +82,7 @@ elseif(MSVC)
endif()
# Disable pointless constant condition warnings
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4127 /wd4201")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4127 /wd4201 /wd4456 /wd4457 /wd4458 /wd4459 /wd4595")
endif()
if(WIN32)
@@ -105,11 +127,29 @@ option(BUILD_TESTS "Build test directory (includes test sources and possibly a p
mark_as_advanced(BUILD_TESTS)
if(NOT INSTALLER_RUN)
- option(ENABLE_UI "Enables the OBS user interfaces" ON)
+ option(ENABLE_UI "Enables the EBS user interfaces" ON)
if(DISABLE_UI OR NOT ENABLE_UI)
set(UI_ENABLED FALSE)
else()
set(UI_ENABLED TRUE)
+
+ if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+ set(_lib_suffix 64)
+ else()
+ set(_lib_suffix 32)
+ endif()
+
+ if(DEFINED QTDIR${_lib_suffix})
+ list(APPEND CMAKE_PREFIX_PATH "${QTDIR${_lib_suffix}}")
+ elseif(DEFINED QTDIR)
+ list(APPEND CMAKE_PREFIX_PATH "${QTDIR}")
+ elseif(DEFINED ENV{QTDIR${_lib_suffix}})
+ list(APPEND CMAKE_PREFIX_PATH "$ENV{QTDIR${_lib_suffix}}")
+ elseif(DEFINED ENV{QTDIR})
+ list(APPEND CMAKE_PREFIX_PATH "$ENV{QTDIR}")
+ endif()
+
+ find_package(Qt5Widgets ${FIND_MODE})
endif()
add_subdirectory(deps)
@@ -120,8 +160,8 @@ if(NOT INSTALLER_RUN)
add_subdirectory(libobs-opengl)
add_subdirectory(libobs)
- add_subdirectory(UI)
add_subdirectory(plugins)
+ add_subdirectory(UI)
if (BUILD_TESTS)
add_subdirectory(test)
endif()
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index 29518b151..6ea05c288 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -39,8 +39,8 @@ Coding Guidelines
- 80 columns max
-Commit Guidlines
-----------------
+Commit Guidelines
+-----------------
- OBS Studio uses the 50/72 standard for commits. 50 characters max
for the title (excluding module prefix), an empty line, and then a
diff --git a/INSTALL b/INSTALL
index 258ea2670..cf2707dfa 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1 +1 @@
-For install instructions please visit https://github.com/jp9000/obs-studio/wiki/Install-Instructions
+For install instructions please visit https://github.com/obsproject/obs-studio/wiki/Install-Instructions
diff --git a/README.md b/README.md
index 576c9c8eb..4e9565433 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,6 @@
+# OBS-studio WebRTC - Fixed Mac CI Scripts
+<<<<<<< HEAD
# OBS-studio WebRTC
This project is a fork of OBS-studio with an implementation of WebRTC.
@@ -36,9 +38,13 @@ Binaries are available [here](https://github.com/CoSMoSoftware/OBS-studio-webrtc
Get the Windows installer for libwebrtc version 65 provided by CoSMo:
[Windows installer](https://drive.google.com/file/d/1EM0OXGS0Xm61m5Nhb-2nNNJo1JpbBZnB/view?usp=sharing)
+=======
+See the latest commit for CI script changes.
+>>>>>>> e8d484cb... fix CI scripts, fix Cosmo lib path, remove CEF, update readme
#### Compiler
+<<<<<<< HEAD
Make sure the correct tools / Windows 10 SDK are installed.
- Windows 7 x64 or later
@@ -282,3 +288,28 @@ Configure a JANUS server using the video room plugin with websocket protocol act
### OBS settings
Launch OBS, go to settings, select the stream tab and change the URL to your JANUS.
+=======
+ - [`install-dependencies-osx.sh`](./CI/install-dependencies-osx.sh) installs dependencies
+ - [`before-script-osx.sh`](./CI/before-script-osx.sh) creates a build dir and runs cmake
+ - [`before-deploy-osx.sh`](./CI/before-deploy-osx.sh)
+ - calls [`build_app.py`](./CI/install/osx/build_app.py) which fixes all lib paths
+ - packages app into a .pkg
+ - signs the app with developer certificate if available
+
+```bash
+mkdir obs-and-dependencies
+cd obs-and-dependencies
+git clone --recursive https://github.com/ruddell/OBS-studio-webrtc.git
+cd OBS-studio-webrtc
+git checkout mac-build
+
+# only run this the once to install dependencies
+./CI/install-dependencies-osx.sh
+
+# run this to rebuild the package, read the scripts to see what they do
+./CI/before-script-osx.sh
+cd build && make -j 8 && cd ..
+./CI/before-deploy-osx.sh
+open nightly
+```
+>>>>>>> e8d484cb... fix CI scripts, fix Cosmo lib path, remove CEF, update readme
diff --git a/README.rst b/README.rst
index f43960ddd..f6561c401 100644
--- a/README.rst
+++ b/README.rst
@@ -15,11 +15,11 @@ Quick Links
- Website: https://obsproject.com
- - Help/Documentation/Guides: https://github.com/jp9000/obs-studio/wiki
+ - Help/Documentation/Guides: https://github.com/obsproject/obs-studio/wiki
- Forums: https://obsproject.com/forum/
- - Build Instructions: https://github.com/jp9000/obs-studio/wiki/Install-Instructions
+ - Build Instructions: https://github.com/obsproject/obs-studio/wiki/Install-Instructions
- Developer/API Documentation: https://obsproject.com/docs
@@ -33,7 +33,7 @@ Contributing
- If you wish to contribute code to the project, please make sure to
read the coding and commit guidelines:
- https://github.com/jp9000/obs-studio/blob/master/CONTRIBUTING.rst
+ https://github.com/obsproject/obs-studio/blob/master/CONTRIBUTING.rst
- Developer/API documentation can be found here:
https://obsproject.com/docs
@@ -47,3 +47,9 @@ Contributing
you fully understand -- bad advice is worse than no advice. When it
comes to something that you don't fully know or understand, please
defer to the official help or official channels.
+
+Credits
+-------
+ - Icons made by `Freepik `_ from
+ `Flaticon `_ are licensed under
+ `CC 3.0 BY `_.
diff --git a/UI/CMakeLists.txt b/UI/CMakeLists.txt
index 8f2a2fc7f..9d175f637 100644
--- a/UI/CMakeLists.txt
+++ b/UI/CMakeLists.txt
@@ -7,33 +7,21 @@ else()
set(FIND_MODE QUIET)
endif()
+if(BROWSER_AVAILABLE_INTERNAL)
+ add_definitions(-DBROWSER_AVAILABLE)
+endif()
+
add_subdirectory(obs-frontend-api)
# ----------------------------------------------------------------------------
-project(obs)
+project(EBS)
-set(ENABLE_WIN_UPDATER FALSE CACHE BOOL "Enable the windows updater")
-
-if(DEFINED QTDIR${_lib_suffix})
- list(APPEND CMAKE_PREFIX_PATH "${QTDIR${_lib_suffix}}")
-elseif(DEFINED QTDIR)
- list(APPEND CMAKE_PREFIX_PATH "${QTDIR}")
-elseif(DEFINED ENV{QTDIR${_lib_suffix}})
- list(APPEND CMAKE_PREFIX_PATH "$ENV{QTDIR${_lib_suffix}}")
-elseif(DEFINED ENV{QTDIR})
- list(APPEND CMAKE_PREFIX_PATH "$ENV{QTDIR}")
-endif()
+set(DISABLE_UPDATE_MODULE TRUE CACHE BOOL "Disables building the update module")
set(CMAKE_INCLUDE_CURRENT_DIR TRUE)
set(CMAKE_AUTOMOC TRUE)
-if(CMAKE_SIZEOF_VOID_P EQUAL 8)
- set(_lib_suffix 64)
-else()
- set(_lib_suffix 32)
-endif()
-
find_package(Qt5 COMPONENTS Core Widgets ${FIND_MODE})
set(WEBRTC_USE_FILE_INCLUDED 1)
find_package(libwebrtc REQUIRED)
@@ -42,7 +30,7 @@ include ( "${libwebrtc_DIR}/libwebrtcConfigVersion.cmake" )
find_package(FFmpeg REQUIRED COMPONENTS avcodec avutil avformat)
if(APPLE)
- find_package(Qt5 COMPONENTS MacExtras ${FIND_MODE})
+ find_package(Qt5MacExtras REQUIRED)
endif(APPLE)
if(NOT Qt5Widgets_FOUND)
@@ -59,6 +47,10 @@ include_directories(${FFMPEG_INCLUDE_DIRS})
include_directories(SYSTEM "obs-frontend-api")
include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs")
include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/deps/libff")
+include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/deps/json11")
+if(BROWSER_AVAILABLE_INTERNAL)
+ include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/plugins/obs-browser/panel")
+endif()
find_package(Libcurl REQUIRED)
include_directories(${LIBCURL_INCLUDE_DIRS})
@@ -82,10 +74,6 @@ if(WIN32)
crypt32
blake2
${OBS_JANSSON_IMPORT})
-
- if(ENABLE_WIN_UPDATER)
- add_definitions(-DENABLE_WIN_UPDATER)
- endif()
elseif(APPLE)
set(obs_PLATFORM_SOURCES
platform-osx.mm)
@@ -135,6 +123,7 @@ endif()
set(obs_SOURCES
${obs_PLATFORM_SOURCES}
${obs_libffutil_SOURCES}
+ ../deps/json11/json11.cpp
obs-app.cpp
api-interface.cpp
window-basic-main.cpp
@@ -151,15 +140,16 @@ set(obs_SOURCES
window-basic-main-transitions.cpp
window-basic-main-dropfiles.cpp
window-basic-main-profiles.cpp
- window-license-agreement.cpp
window-basic-status-bar.cpp
window-basic-adv-audio.cpp
window-basic-transform.cpp
window-basic-preview.cpp
+ window-basic-about.cpp
window-namedialog.cpp
window-log-reply.cpp
window-projector.cpp
window-remux.cpp
+ source-tree.cpp
properties-view.cpp
focus-list.cpp
menu-button.cpp
@@ -169,6 +159,7 @@ set(obs_SOURCES
item-widget-helpers.cpp
visibility-checkbox.cpp
locked-checkbox.cpp
+ horizontal-scroll-area.cpp
vertical-scroll-area.cpp
visibility-item-widget.cpp
slider-absoluteset-style.cpp
@@ -184,6 +175,7 @@ set(obs_SOURCES
set(obs_HEADERS
${obs_PLATFORM_HEADERS}
${obs_libffutil_HEADERS}
+ ../deps/json11/json11.hpp
obs-app.hpp
platform.hpp
window-main.hpp
@@ -196,7 +188,7 @@ set(obs_HEADERS
window-basic-auto-config.hpp
window-basic-main-outputs.hpp
window-basic-source-select.hpp
- window-license-agreement.hpp
+ window-basic-about.hpp
window-basic-status-bar.hpp
window-basic-adv-audio.hpp
window-basic-transform.hpp
@@ -205,9 +197,11 @@ set(obs_HEADERS
window-log-reply.hpp
window-projector.hpp
window-remux.hpp
+ source-tree.hpp
properties-view.hpp
properties-view.moc.hpp
display-helpers.hpp
+ balance-slider.hpp
double-slider.hpp
focus-list.hpp
menu-button.hpp
@@ -217,6 +211,8 @@ set(obs_HEADERS
item-widget-helpers.hpp
visibility-checkbox.hpp
locked-checkbox.hpp
+ horizontal-scroll-area.hpp
+ expand-checkbox.hpp
vertical-scroll-area.hpp
visibility-item-widget.hpp
slider-absoluteset-style.hpp
@@ -227,7 +223,8 @@ set(obs_HEADERS
source-label.hpp
remote-text.hpp
audio-encoders.hpp
- qt-wrappers.hpp)
+ qt-wrappers.hpp
+ clickable-label.hpp)
set(obs_UI
forms/NameDialog.ui
@@ -235,7 +232,7 @@ set(obs_UI
forms/AutoConfigVideoPage.ui
forms/AutoConfigStreamPage.ui
forms/AutoConfigTestPage.ui
- forms/OBSLicenseAgreement.ui
+ forms/ColorSelect.ui
forms/OBSLogReply.ui
forms/OBSBasic.ui
forms/OBSBasicTransform.ui
@@ -244,7 +241,8 @@ set(obs_UI
forms/OBSBasicSourceSelect.ui
forms/OBSBasicInteraction.ui
forms/OBSUpdate.ui
- forms/OBSRemux.ui)
+ forms/OBSRemux.ui
+ forms/OBSAbout.ui)
set(obs_QRC
forms/obs.qrc)
@@ -252,7 +250,7 @@ set(obs_QRC
qt5_wrap_ui(obs_UI_HEADERS ${obs_UI})
qt5_add_resources(obs_QRC_SOURCES ${obs_QRC})
-add_executable(obs WIN32
+add_executable(EBS WIN32
${obs_SOURCES}
${obs_HEADERS}
${obs_UI_HEADERS}
@@ -265,12 +263,12 @@ if(WIN32)
set(_output_suffix "32")
endif()
- set_target_properties(obs
+ set_target_properties(EBS
PROPERTIES
- OUTPUT_NAME "obs${_output_suffix}")
+ OUTPUT_NAME "EBS${_output_suffix}")
endif()
-target_link_libraries(obs
+target_link_libraries(EBS
libobs
Qt5::Widgets
obs-frontend-api
@@ -279,11 +277,11 @@ target_link_libraries(obs
${obs_PLATFORM_LIBRARIES})
if (APPLE)
- target_link_libraries(obs
+ target_link_libraries(EBS
Qt5::MacExtras)
- set_target_properties(obs PROPERTIES LINK_FLAGS "-pagezero_size 10000 -image_base 100000000")
+ set_target_properties(EBS PROPERTIES LINK_FLAGS "-pagezero_size 10000 -image_base 100000000")
set_property(
- TARGET obs
+ TARGET EBS
APPEND
PROPERTY INSTALL_RPATH
"/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/"
@@ -292,14 +290,15 @@ if (APPLE)
)
endif()
-define_graphic_modules(obs)
+define_graphic_modules(EBS)
-install_obs_core(obs)
-install_obs_data(obs data obs-studio)
+install_obs_core(EBS)
+install_obs_data(EBS data ebs-studio)
+install_obs_data_file(EBS ../AUTHORS ebs-studio/authors)
if (UNIX AND UNIX_STRUCTURE AND NOT APPLE)
install(FILES dist/obs.desktop DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/applications)
- install(FILES forms/images/obs.png
+ install(FILES forms/images/ebs.png
DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/icons/hicolor/256x256/apps)
endif()
diff --git a/UI/adv-audio-control.cpp b/UI/adv-audio-control.cpp
index 531b00173..c327a6109 100644
--- a/UI/adv-audio-control.cpp
+++ b/UI/adv-audio-control.cpp
@@ -4,16 +4,16 @@
#include
#include
#include
-#include
#include "qt-wrappers.hpp"
#include "obs-app.hpp"
#include "adv-audio-control.hpp"
+#include "window-basic-main.hpp"
#ifndef NSEC_PER_MSEC
#define NSEC_PER_MSEC 1000000
#endif
-OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *layout, obs_source_t *source_)
+OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_)
: source(source_)
{
QHBoxLayout *hlayout;
@@ -25,13 +25,13 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *layout, obs_source_t *source_)
forceMonoContainer = new QWidget();
mixerContainer = new QWidget();
- panningContainer = new QWidget();
+ balanceContainer = new QWidget();
labelL = new QLabel();
labelR = new QLabel();
nameLabel = new QLabel();
volume = new QSpinBox();
forceMono = new QCheckBox();
- panning = new QSlider(Qt::Horizontal);
+ balance = new BalanceSlider();
#if defined(_WIN32) || defined(__APPLE__) || HAVE_PULSEAUDIO
monitoringType = new QComboBox();
#endif
@@ -60,8 +60,8 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *layout, obs_source_t *source_)
mixerContainer->setLayout(hlayout);
hlayout = new QHBoxLayout();
hlayout->setContentsMargins(0, 0, 0, 0);
- panningContainer->setLayout(hlayout);
- panningContainer->setMinimumWidth(100);
+ balanceContainer->setLayout(hlayout);
+ balanceContainer->setMinimumWidth(100);
labelL->setText("L");
@@ -81,11 +81,24 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *layout, obs_source_t *source_)
forceMonoContainer->layout()->setAlignment(forceMono,
Qt::AlignHCenter | Qt::AlignVCenter);
- panning->setMinimum(0);
- panning->setMaximum(100);
- panning->setTickPosition(QSlider::TicksAbove);
- panning->setEnabled(false);
- panning->setValue(50); /* XXX */
+ balance->setOrientation(Qt::Horizontal);
+ balance->setMinimum(0);
+ balance->setMaximum(100);
+ balance->setTickPosition(QSlider::TicksAbove);
+ balance->setTickInterval(50);
+
+ OBSBasic *main = reinterpret_cast(App()->GetMainWindow());
+
+ const char *speakers = config_get_string(main->Config(), "Audio",
+ "ChannelSetup");
+
+ if (strcmp(speakers, "Mono") == 0)
+ balance->setEnabled(false);
+ else
+ balance->setEnabled(true);
+
+ float bal = obs_source_get_balance_value(source) * 100.0f;
+ balance->setValue((int)bal);
int64_t cur_sync = obs_source_get_sync_offset(source);
syncOffset->setMinimum(-20000);
@@ -118,10 +131,14 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *layout, obs_source_t *source_)
mixer6->setText("6");
mixer6->setChecked(mixers & (1<<5));
- panningContainer->layout()->addWidget(labelL);
- panningContainer->layout()->addWidget(panning);
- panningContainer->layout()->addWidget(labelR);
- panningContainer->setMaximumWidth(170);
+ speaker_layout sl = obs_source_get_speaker_layout(source);
+
+ if (sl == SPEAKERS_STEREO) {
+ balanceContainer->layout()->addWidget(labelL);
+ balanceContainer->layout()->addWidget(balance);
+ balanceContainer->layout()->addWidget(labelR);
+ balanceContainer->setMaximumWidth(170);
+ }
mixerContainer->layout()->addWidget(mixer1);
mixerContainer->layout()->addWidget(mixer2);
@@ -134,8 +151,10 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *layout, obs_source_t *source_)
this, SLOT(volumeChanged(int)));
QWidget::connect(forceMono, SIGNAL(clicked(bool)),
this, SLOT(downmixMonoChanged(bool)));
- QWidget::connect(panning, SIGNAL(valueChanged(int)),
- this, SLOT(panningChanged(int)));
+ QWidget::connect(balance, SIGNAL(valueChanged(int)),
+ this, SLOT(balanceChanged(int)));
+ QWidget::connect(balance, SIGNAL(doubleClicked()),
+ this, SLOT(ResetBalance()));
QWidget::connect(syncOffset, SIGNAL(valueChanged(int)),
this, SLOT(syncOffsetChanged(int)));
#if defined(_WIN32) || defined(__APPLE__) || HAVE_PULSEAUDIO
@@ -155,20 +174,7 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *layout, obs_source_t *source_)
QWidget::connect(mixer6, SIGNAL(clicked(bool)),
this, SLOT(mixer6Changed(bool)));
- int lastRow = layout->rowCount();
-
- idx = 0;
- layout->addWidget(nameLabel, lastRow, idx++);
- layout->addWidget(volume, lastRow, idx++);
- layout->addWidget(forceMonoContainer, lastRow, idx++);
- layout->addWidget(panningContainer, lastRow, idx++);
- layout->addWidget(syncOffset, lastRow, idx++);
-#if defined(_WIN32) || defined(__APPLE__) || HAVE_PULSEAUDIO
- layout->addWidget(monitoringType, lastRow, idx++);
-#endif
- layout->addWidget(mixerContainer, lastRow, idx++);
- layout->layout()->setAlignment(mixerContainer,
- Qt::AlignHCenter | Qt::AlignVCenter);
+ setObjectName(sourceName);
}
OBSAdvAudioCtrl::~OBSAdvAudioCtrl()
@@ -176,7 +182,7 @@ OBSAdvAudioCtrl::~OBSAdvAudioCtrl()
nameLabel->deleteLater();
volume->deleteLater();
forceMonoContainer->deleteLater();
- panningContainer->deleteLater();
+ balanceContainer->deleteLater();
syncOffset->deleteLater();
#if defined(_WIN32) || defined(__APPLE__) || HAVE_PULSEAUDIO
monitoringType->deleteLater();
@@ -184,6 +190,24 @@ OBSAdvAudioCtrl::~OBSAdvAudioCtrl()
mixerContainer->deleteLater();
}
+void OBSAdvAudioCtrl::ShowAudioControl(QGridLayout *layout)
+{
+ int lastRow = layout->rowCount();
+ int idx = 0;
+
+ layout->addWidget(nameLabel, lastRow, idx++);
+ layout->addWidget(volume, lastRow, idx++);
+ layout->addWidget(forceMonoContainer, lastRow, idx++);
+ layout->addWidget(balanceContainer, lastRow, idx++);
+ layout->addWidget(syncOffset, lastRow, idx++);
+#if defined(_WIN32) || defined(__APPLE__) || HAVE_PULSEAUDIO
+ layout->addWidget(monitoringType, lastRow, idx++);
+#endif
+ layout->addWidget(mixerContainer, lastRow, idx++);
+ layout->layout()->setAlignment(mixerContainer,
+ Qt::AlignHCenter | Qt::AlignVCenter);
+}
+
/* ------------------------------------------------------------------------- */
/* OBS source callbacks */
@@ -278,12 +302,26 @@ void OBSAdvAudioCtrl::downmixMonoChanged(bool checked)
}
}
-void OBSAdvAudioCtrl::panningChanged(int val)
+void OBSAdvAudioCtrl::balanceChanged(int val)
{
- /* TODO */
- UNUSED_PARAMETER(val);
+ float bal = (float)val / 100.0f;
+
+ if (abs(50 - val) < 10) {
+ balance->blockSignals(true);
+ balance->setValue(50);
+ bal = 0.5f;
+ balance->blockSignals(false);
+ }
+
+ obs_source_set_balance_value(source, bal);
}
+void OBSAdvAudioCtrl::ResetBalance()
+{
+ balance->setValue(50);
+}
+
+
void OBSAdvAudioCtrl::syncOffsetChanged(int milliseconds)
{
int64_t cur_val = obs_source_get_sync_offset(source);
diff --git a/UI/adv-audio-control.hpp b/UI/adv-audio-control.hpp
index 38d760823..80d248e83 100644
--- a/UI/adv-audio-control.hpp
+++ b/UI/adv-audio-control.hpp
@@ -3,12 +3,12 @@
#include
#include
#include
+#include "balance-slider.hpp"
class QGridLayout;
class QLabel;
class QSpinBox;
class QCheckBox;
-class QSlider;
class QComboBox;
class OBSAdvAudioCtrl : public QObject {
@@ -19,12 +19,12 @@ class OBSAdvAudioCtrl : public QObject {
QPointer forceMonoContainer;
QPointer mixerContainer;
- QPointer panningContainer;
+ QPointer balanceContainer;
QPointer nameLabel;
QPointer volume;
QPointer forceMono;
- QPointer panning;
+ QPointerbalance;
QPointer labelL;
QPointer labelR;
QPointer syncOffset;
@@ -51,6 +51,7 @@ class OBSAdvAudioCtrl : public QObject {
virtual ~OBSAdvAudioCtrl();
inline obs_source_t *GetSource() const {return source;}
+ void ShowAudioControl(QGridLayout *layout);
public slots:
void SourceFlagsChanged(uint32_t flags);
@@ -60,7 +61,7 @@ public slots:
void volumeChanged(int percentage);
void downmixMonoChanged(bool checked);
- void panningChanged(int val);
+ void balanceChanged(int val);
void syncOffsetChanged(int milliseconds);
void monitoringTypeChanged(int index);
void mixer1Changed(bool checked);
@@ -69,4 +70,5 @@ public slots:
void mixer4Changed(bool checked);
void mixer5Changed(bool checked);
void mixer6Changed(bool checked);
+ void ResetBalance();
};
diff --git a/UI/api-interface.cpp b/UI/api-interface.cpp
index a580b721c..e7cc8365c 100644
--- a/UI/api-interface.cpp
+++ b/UI/api-interface.cpp
@@ -93,9 +93,11 @@ struct OBSStudioAPI : obs_frontend_callbacks {
{
if (main->IsPreviewProgramMode()) {
QMetaObject::invokeMethod(main, "TransitionToScene",
+ WaitConnection(),
Q_ARG(OBSSource, OBSSource(scene)));
} else {
QMetaObject::invokeMethod(main, "SetCurrentScene",
+ WaitConnection(),
Q_ARG(OBSSource, OBSSource(scene)),
Q_ARG(bool, false));
}
@@ -167,6 +169,19 @@ struct OBSStudioAPI : obs_frontend_callbacks {
}
}
+ bool obs_frontend_add_scene_collection(
+ const char *name) override
+ {
+ bool success = false;
+ QMetaObject::invokeMethod(main,
+ "AddSceneCollection",
+ WaitConnection(),
+ Q_RETURN_ARG(bool, success),
+ Q_ARG(bool, true),
+ Q_ARG(QString, QT_UTF8(name)));
+ return success;
+ }
+
void obs_frontend_get_profiles(
std::vector &strings) override
{
@@ -329,6 +344,16 @@ struct OBSStudioAPI : obs_frontend_callbacks {
main->SaveProject();
}
+ void obs_frontend_defer_save_begin(void) override
+ {
+ QMetaObject::invokeMethod(main, "DeferSaveBegin");
+ }
+
+ void obs_frontend_defer_save_end(void) override
+ {
+ QMetaObject::invokeMethod(main, "DeferSaveEnd");
+ }
+
void obs_frontend_add_save_callback(obs_frontend_save_cb callback,
void *private_data) override
{
diff --git a/UI/balance-slider.hpp b/UI/balance-slider.hpp
new file mode 100644
index 000000000..06be1b5f8
--- /dev/null
+++ b/UI/balance-slider.hpp
@@ -0,0 +1,21 @@
+#pragma once
+
+#include
+#include
+
+class BalanceSlider : public QSlider {
+ Q_OBJECT
+
+public:
+ inline BalanceSlider(QWidget *parent = 0) : QSlider(parent) {}
+
+signals:
+ void doubleClicked();
+
+protected:
+ void mouseDoubleClickEvent(QMouseEvent *event)
+ {
+ emit doubleClicked();
+ event->accept();
+ }
+};
diff --git a/UI/clickable-label.hpp b/UI/clickable-label.hpp
new file mode 100644
index 000000000..3c76a8b4c
--- /dev/null
+++ b/UI/clickable-label.hpp
@@ -0,0 +1,21 @@
+#pragma once
+
+#include
+#include
+
+class ClickableLabel : public QLabel {
+ Q_OBJECT
+
+public:
+ inline ClickableLabel(QWidget *parent = 0) : QLabel(parent) {}
+
+signals:
+ void clicked();
+
+protected:
+ void mousePressEvent(QMouseEvent *event)
+ {
+ emit clicked();
+ event->accept();
+ }
+};
diff --git a/UI/crash-report.cpp b/UI/crash-report.cpp
index 6a94692e7..8f5c94efa 100644
--- a/UI/crash-report.cpp
+++ b/UI/crash-report.cpp
@@ -38,7 +38,7 @@ OBSCrashReport::OBSCrashReport(QWidget *parent, const char *text)
this, SLOT(ExitClicked()));
resize(800, 600);
- setWindowTitle("Oops, OBS has crashed!");
+ setWindowTitle("Oops, EBS has crashed!");
}
void OBSCrashReport::ExitClicked()
diff --git a/UI/data/locale.ini b/UI/data/locale.ini
index 4631d78dc..00e4c1fdb 100644
--- a/UI/data/locale.ini
+++ b/UI/data/locale.ini
@@ -139,3 +139,17 @@ Name=ქართული
[nn-NO]
Name=Norsk Nynorsk
+[fil-PH]
+Name=Wikang Filipino
+
+[sq-AL]
+Name=gjuha shqipe
+
+[tl-PH]
+Name=Wikang Tagalog
+
+[fa-IR]
+Name=فارسی
+
+[gd-GB]
+Name=Gàidhlig
diff --git a/UI/data/locale/af-ZA.ini b/UI/data/locale/af-ZA.ini
index d44bfd8d6..ffc182af6 100644
--- a/UI/data/locale/af-ZA.ini
+++ b/UI/data/locale/af-ZA.ini
@@ -88,6 +88,9 @@ Rename="Hernoem"
+
+
+
diff --git a/UI/data/locale/ar-SA.ini b/UI/data/locale/ar-SA.ini
index e01396337..ae2c6f9c7 100644
--- a/UI/data/locale/ar-SA.ini
+++ b/UI/data/locale/ar-SA.ini
@@ -122,6 +122,12 @@ Basic.AutoConfig.StreamPage.PerformBandwidthTest="تقدير معدل التدف
Basic.AutoConfig.StreamPage.PreferHardwareEncoding="تفضيل استخدام الترميز بواسطة الهاردوير"
Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="استخدام الترميز بالهاردوير يلغي الحاجة الى معظم موارد المعالج, لكن قد يحتاج الى معدل بث أعلى للحفاظ على نفس مستوى الجودة."
Basic.AutoConfig.StreamPage.StreamWarning.Title="تحذير يتعلق بالبث"
+Basic.AutoConfig.TestPage="النتيجة النهائية"
+Basic.AutoConfig.TestPage.SubTitle.Testing="يقوم البرنامج الآن بتنفيذ مجموعة من الإختبارات لتقدير الإعدادات الأكثر مثالية"
+Basic.AutoConfig.TestPage.SubTitle.Complete="انتهى الاختبار"
+Basic.AutoConfig.TestPage.TestingBandwidth="إجراء اختبار النطاق الترددي، قد يستغرق هذا بضع دقائق..."
+Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="الاتصال ب1:%..."
+Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="فشل الاتصال بأي سيرفر، رجاءا تحقق من اتصالك بالانترنت وأعد المحاولة."
Basic.Stats="إحصائيات"
Basic.Stats.CPUUsage="استخدام المعالج"
@@ -473,3 +479,6 @@ Basic.Settings.Advanced.Video.ColorRange.Full="كامل"
+
+
+
diff --git a/UI/data/locale/bg-BG.ini b/UI/data/locale/bg-BG.ini
index e62a41c6c..183e2d414 100644
--- a/UI/data/locale/bg-BG.ini
+++ b/UI/data/locale/bg-BG.ini
@@ -508,10 +508,6 @@ Basic.Settings.General.SaveProjectors="Запамети прожекторите
Basic.Settings.General.SwitchOnDoubleClick="Преминаване към сцена при двойно кликване"
Basic.Settings.General.StudioPortraitLayout="Включи портретен / вертикален изглед"
Basic.Settings.General.MultiviewLayout="Разположение на Множествения Изглед"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Хоризонтално, Горе"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Водоравно, Долу"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Вертикално, от Ляво"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Вертикално, от Дясно"
Basic.Settings.Stream="Стрийм"
Basic.Settings.Stream.StreamType="Тип Стрийм"
@@ -546,12 +542,27 @@ Basic.Settings.Output.Simple.Warn.Encoder="Предупреждение: Зап
Basic.Settings.Output.Simple.Warn.Lossless="Предупреждение: Оригиналното качество създава огромни файлове! Запис настроен на Оригинално качество може да заема над 7GB дисково пространство на минута, ако резолюцията и кадрите са високи. Не се препоръчва ако не разполагате със много пространство."
Basic.Settings.Output.Simple.Warn.Lossless.Msg="Сигурни ли сте че искате да ползвате оригиналното качество на записа?"
Basic.Settings.Output.Simple.Warn.Lossless.Title="Предупреждение при ползване на Оригинално Качество!"
+Basic.Settings.Output.Simple.Warn.MultipleQSV="Предупреждение: Не можете да ползвате различни и отделни QSV енкодери докато предавате и записвате. Ако искате да предавате и да записвате едновременно, моля променете един от енкодерите."
+Basic.Settings.Output.Simple.Encoder.Software="Програмно (x264)"
+Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Хардуеър (QSV)"
+Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Хардуеър (AMD)"
+Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Хардуеър (NVENC)"
+Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Програмно (x264 ниска употреба на процесора, увеличава размера на записа)"
Basic.Settings.Output.VideoBitrate="Видео битрейт"
Basic.Settings.Output.AudioBitrate="Аудио битрейт"
Basic.Settings.Output.Reconnect="Автоматично повторно свързване"
Basic.Settings.Output.RetryDelay="Отлагане на повторно свързване (секунди)"
Basic.Settings.Output.MaxRetries="Максимален брой повторни опити"
-
+Basic.Settings.Output.Advanced="Включи Допълнителни Настройки за Енкодера"
+Basic.Settings.Output.EncoderPreset="Настройка на Енкодера (по-висока = по-малко процесор)"
+Basic.Settings.Output.CustomEncoderSettings="Допълнителни Настройки на Енкодера"
+Basic.Settings.Output.CustomMuxerSettings="Допълнителни Настройки при Смесване"
+Basic.Settings.Output.NoSpaceFileName="Създавай името на записа без Празни Места"
+
+Basic.Settings.Output.Adv.Rescale="Умащабяване на Изхода"
+Basic.Settings.Output.Adv.AudioTrack="Звукова Писта"
+Basic.Settings.Output.Adv.Streaming="Предаване"
+Basic.Settings.Output.Adv.ApplyServiceSettings="Ползвай настройките на енкодера от платформата"
Basic.Settings.Output.Adv.Audio.Track1="Писта 1"
Basic.Settings.Output.Adv.Audio.Track2="Писта 2"
Basic.Settings.Output.Adv.Audio.Track3="Писта 3"
@@ -588,7 +599,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Настройки при сли
Basic.Settings.Output.Adv.FFmpeg.GOPSize="Интервал между ключови кадри (кадри)"
Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Покажи всички кодеци (дори и ако са несъвместими)"
+FilenameFormatting.completer="%ХХГГ-%ММ-%ДД %чч-%мм-%сс\n%ГГ-%ММ-%ДД %чч-%мм-%сс\n%Г-%м-%д %Ч-%М-%С\n%г-%м-%д %Ч-%М-%С\n%а %Г-%м-%д %Ч-%М-%С\n%А %Г-%м-%д %Ч-%М-%С\n%Г-%б-%д %Ч-%М-%С\n%Г-%Б-%д %Ч-%М-%С\n%Г- %м-%д %И-%М-%С-%п\n%Г-%м-%д %Ч-%М-%С-%з\n%Г-%м-%д %Ч-%М-%С-%ст"
+FilenameFormatting.TT="%CCYY Година, четири цифри\n%YY Година, последни две цифри (00-99)\n%MM Месецът като цяло число (01-12)\n%DD Ден от месеца, със добавена нула (01-31)\n%hh Часът във 24ч формат (00-23)\n%mm Минута (00-59)\n%ss Секунда (00-61)\n%% % подпис\n%a Съкратено име на деня\n%A Пълно име на деня\n%b Съкратено име на месеца\n%B Пълно име на месеца\n%d Ден от месеца, със добавена нула (01-31)\n%H Часът във 24ч формат (00-23)\n%I Часът във 12ч формат (01-12)\n%m Месецът като цяло число (01-12)\n%M Минута (00-59)\n%p AM или PM посочен\n%S Секунда (00-61)\n%y Година, последни две цифри (00-99)\n%Y Година\n%z ISO 8601 разминаване със UTC или времева зона\n име или съкращение\n%Z Име на Времевата зона или съкращение\n"
Basic.Settings.Video="Видео"
Basic.Settings.Video.Adapter="Видео адаптер:"
@@ -614,6 +627,10 @@ Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Изострено при
Basic.Settings.Audio="Аудио"
Basic.Settings.Audio.SampleRate="Честота на дискретизацията"
Basic.Settings.Audio.Channels="Канали"
+Basic.Settings.Audio.MeterDecayRate="Брой за Звуков Разпад"
+Basic.Settings.Audio.MeterDecayRate.Fast="Бързо"
+Basic.Settings.Audio.MeterDecayRate.Medium="Средно (ТИП I PPM)"
+Basic.Settings.Audio.MeterDecayRate.Slow="Бавно (Type II PPM)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="ПРЕДУПРЕЖДЕНИЕ: Включен е Surround sound."
Basic.Settings.Audio.MultichannelWarning="Ако предавате, проверете дали вашата услуга за стрийминг поддържа едновременно приемане на съраунд звук и възпроизвеждане на съраунд звук. Twitch, Facebook 360 Live, Mixer RTMP, Smashcast са примери, при които съраунд звукът е напълно поддържан. Въпреки че, Facebook Live и YouTube Live подържат и приемат съраунд, Facebook Live пемиксира към стерео звук, а YouTube Live възпроизвежда само два канала.\n\nЗвуковите филтъри на OBS подържат съраунд звук, въпреки това VST поддръжката не е гарантирана."
Basic.Settings.Audio.MultichannelWarning.Title="Включи записването на съраунд звук?"
@@ -635,6 +652,7 @@ Basic.Settings.Advanced.General.ProcessPriority.High="Висок"
Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="Над Нормата"
Basic.Settings.Advanced.General.ProcessPriority.Normal="Нормален"
Basic.Settings.Advanced.General.ProcessPriority.BelowNormal="Под Нормата"
+Basic.Settings.Advanced.General.ProcessPriority.Idle="Свободен"
Basic.Settings.Advanced.FormatWarning="Предупреждение: Цветните формати освен NV12 се ползват главно при записи и не са препоръчани при предаване. Предаването може да упражни завишено ползване на Процесора поради прекодиране на форматите."
Basic.Settings.Advanced.Audio.BufferingTime="Време за буфериране на звук"
Basic.Settings.Advanced.Video.ColorFormat="Формат на цвета"
@@ -644,22 +662,37 @@ Basic.Settings.Advanced.Video.ColorRange.Partial="Частично"
Basic.Settings.Advanced.Video.ColorRange.Full="Пълен"
Basic.Settings.Advanced.Audio.MonitoringDevice="Устройство за Звуково възпроизвеждане"
Basic.Settings.Advanced.Audio.MonitoringDevice.Default="По подразбиране"
+Basic.Settings.Advanced.Audio.DisableAudioDucking="Изключи намалянето на звука при разговори"
+Basic.Settings.Advanced.StreamDelay="Забавяне на Предаването"
Basic.Settings.Advanced.StreamDelay.Duration="Продължителност (секунди)"
Basic.Settings.Advanced.StreamDelay.Preserve="Запази точката на прекъсване (увеличете забавянето) при повторно свързване"
+Basic.Settings.Advanced.StreamDelay.MemoryUsage="Приблизително използвана памет: %1 MB"
Basic.Settings.Advanced.Network="Мрежа"
+Basic.Settings.Advanced.Network.BindToIP="Свържи към IP"
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Позволи нов мрежов код"
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Режим на ниска латенция"
Basic.AdvAudio="Допълнителни Звукови Характеристики"
Basic.AdvAudio.Name="Име"
Basic.AdvAudio.Volume="Сила на звука (%)"
Basic.AdvAudio.Mono="Премиксирай към Mono звук"
+Basic.AdvAudio.Panning="Накланяне"
+Basic.AdvAudio.SyncOffset="Забавяне (мс)"
+Basic.AdvAudio.Monitoring="Звуков Мониториниг "
Basic.AdvAudio.Monitoring.None="Мониторът Изключен"
+Basic.AdvAudio.Monitoring.MonitorOnly="Само на Монитора (заглуши изхода)"
+Basic.AdvAudio.Monitoring.Both="Монитор и Изход"
Basic.AdvAudio.AudioTracks="Писти"
Basic.Settings.Hotkeys="Горещи клавиши"
+Basic.Settings.Hotkeys.Pair="Клавишни комбинации ползвани от `%1` действат като ключ"
Basic.Hotkeys.SelectScene="Премини към сцена"
+Basic.SystemTray.Show="Покажи"
+Basic.SystemTray.Hide="Скрий"
+Basic.SystemTray.Message.Reconnecting="Връзката Загубена. Свързване..."
Hotkeys.Insert="Вмъкни"
Hotkeys.Delete="Изтрий"
@@ -668,9 +701,33 @@ Hotkeys.End="Край"
Hotkeys.PageUp="Страница нагоре"
Hotkeys.PageDown="Страница надолу"
Hotkeys.NumLock="Num Lock"
+Hotkeys.ScrollLock="Скрол Лок"
+Hotkeys.CapsLock="Капс Лок"
+Hotkeys.Backspace="Връщане"
+Hotkeys.Tab="Таб"
+Hotkeys.Print="Принт"
+Hotkeys.Pause="Пауза"
+Hotkeys.Left="Ляво"
+Hotkeys.Right="Дясно"
+Hotkeys.Up="Горе"
+Hotkeys.Down="Долу"
+Hotkeys.Windows="Windows"
+Hotkeys.Super="Супер"
+Hotkeys.Menu="Меню"
+Hotkeys.Space="Спейс"
+Hotkeys.NumpadNum="Нумпад %1"
+Hotkeys.NumpadMultiply="Нумпад Умножи"
+Hotkeys.NumpadDivide="Нумпад Раздели"
Hotkeys.NumpadAdd="Цифрова клавиатура +"
Hotkeys.NumpadSubtract="Цифрова клавиатура -"
Hotkeys.NumpadDecimal="Цифрова клавиатура ."
+Hotkeys.AppleKeypadNum="%1 (Клавиатура)"
+Hotkeys.AppleKeypadMultiply="* (Клавиатура)"
+Hotkeys.AppleKeypadDivide="/ (Клавиатура)"
+Hotkeys.AppleKeypadAdd="+ (Клавиатура)"
+Hotkeys.AppleKeypadSubtract="- (Клавиатура)"
+Hotkeys.AppleKeypadDecimal=". (Клавиатура)"
+Hotkeys.AppleKeypadEqual="= (Клавиатура)"
Hotkeys.MouseButton="Мишка %1"
Mute="Заглуши"
@@ -688,3 +745,6 @@ OutputWarnings.MP4Recording="Предупреждение: Записи запа
FinalScene.Title="Изтрий Сцената"
FinalScene.Text="Трябва да има поне една сцена във наличност."
+
+
+
diff --git a/UI/data/locale/bn-BD.ini b/UI/data/locale/bn-BD.ini
index b6d333fd5..8039b7342 100644
--- a/UI/data/locale/bn-BD.ini
+++ b/UI/data/locale/bn-BD.ini
@@ -561,3 +561,6 @@ OutputWarnings.MultiTrackRecording="সতর্কতা: একাধিক
OutputWarnings.MP4Recording="সতর্কতা: রেকর্ডিং MP4 কাছে সংরক্ষিত ফাইল (যেমন: BSODs ফলে, বিদ্যুৎ লোকসান, ইত্যাদি।) চূড়ান্ত করা না হলে নির্বাহ হওয়ার সময়ের অপুনরুদ্ধারযোগ্য করা হবে। আপনি যদি রেকর্ড করতে চান একাধিক অডিও ট্র্যাক MKV এবং remux রেকর্ড করা mp4 ব্যবহার করে এটি সম্পন্ন করার পর বিবেচনা (Remux রেকর্ডিং-> ফাইল)"
+
+
+
diff --git a/UI/data/locale/ca-ES.ini b/UI/data/locale/ca-ES.ini
index eb8a3823e..1b5825995 100644
--- a/UI/data/locale/ca-ES.ini
+++ b/UI/data/locale/ca-ES.ini
@@ -78,6 +78,8 @@ None="Cap"
StudioMode.Preview="Vista prèvia"
StudioMode.Program="Programa"
ShowInMultiview="Mostra en vista múltiple"
+VerticalLayout="Disposició vertical"
+Group="Grup"
AlreadyRunning.Title="L'OBS ja s'està executant"
AlreadyRunning.Text="L'OBS ja s'està executant! A no ser que vulgueu fer això, tanqueu totes les finestres de l'OBS abans d'intentar iniciar una nova. Si teniu configurat OBS perquè es minimitzi a la barra de tasques, proveu a veure si segueix executant-se aquí."
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="S'està aturant la reproducció de la memòria
Basic.Main.StopStreaming="Atura l'enregistrament"
Basic.Main.StoppingStreaming="Aturant la transmissió..."
Basic.Main.ForceStopStreaming="Atura l'enregistrament (descarta el retard)"
+Basic.Main.Group="Grup %1"
+Basic.Main.GroupItems="Agrupa els elements seleccionats"
+Basic.Main.Ungroup="Desagrupa"
Basic.MainMenu.File="&Fitxer"
Basic.MainMenu.File.Export="&Exporta"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="&Eines"
Basic.MainMenu.Help="&Ajuda"
Basic.MainMenu.Help.HelpPortal="Portal d'ajuda"
Basic.MainMenu.Help.Website="Visa el lloc &web"
+Basic.MainMenu.Help.Discord="Uniu-vos a un servidor &Discord"
Basic.MainMenu.Help.Logs="Fitxers de ®istre"
Basic.MainMenu.Help.Logs.ShowLogs="&Mostra els arxius de registre"
Basic.MainMenu.Help.Logs.UploadCurrentLog="Carregar arxiu de registre actual"
Basic.MainMenu.Help.Logs.UploadLastLog="Carregar darrer fitxer de registre"
Basic.MainMenu.Help.Logs.ViewCurrentLog="&Visualitza el registre actual"
Basic.MainMenu.Help.CheckForUpdates="Comprova si hi ha cap actualització"
+Basic.MainMenu.Help.CrashLogs="Info&rme de fallada"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="Mo&stra els informes de fallada"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="Penja el darrer informe de fa&llada"
Basic.Settings.ProgramRestart="El programa ha de ser re-iniciat per tal que aquesta configuració tingui efecte."
Basic.Settings.ConfirmTitle="Confirma els canvis"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Minimitza sempre a la safata del
Basic.Settings.General.SaveProjectors="Desa els projectors en sortir"
Basic.Settings.General.SwitchOnDoubleClick="Transició a l'escena en fer doble clic"
Basic.Settings.General.StudioPortraitLayout="Habilita la disposició horitzontal/vertical"
+Basic.Settings.General.Multiview="Vista múltiple"
+Basic.Settings.General.Multiview.MouseSwitch="Feu clic per canviar entre escenes"
+Basic.Settings.General.Multiview.DrawSourceNames="Mostra el nom de l'escena"
+Basic.Settings.General.Multiview.DrawSafeAreas="Dibuixa les zones segures (EBU R 95)"
Basic.Settings.General.MultiviewLayout="Disposició de vista múltiple"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horitzontal, amunt"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horitzontal, abaix"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertical, esquerra"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertical, dreta"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horitzontal, part superior (8 escenes)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horitzontal, part inferior (8 escenes)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertical, esquerra (8 escenes)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertical, dreta (8 escenes)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Horitzontal, part superior (24 escenes)"
Basic.Settings.Stream="Directe"
Basic.Settings.Stream.StreamType="Tipus de directe"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="Resposta del ràtio de l'audiòmetre"
Basic.Settings.Audio.MeterDecayRate.Fast="Ràpida"
Basic.Settings.Audio.MeterDecayRate.Medium="Mitja (PPM de tipus I)"
Basic.Settings.Audio.MeterDecayRate.Slow="Lenta (PPM de tipus II)"
+Basic.Settings.Audio.PeakMeterType="Tipus de mesurador de pics"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Pic de mostra"
+Basic.Settings.Audio.PeakMeterType.TruePeak="True Peak (ús elevat de la CPU)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="ATENCIÓ: El so envoltant està habilitat."
Basic.Settings.Audio.MultichannelWarning="Si esteu retransmetent, verifiqueu que el servei triat suporta el so envoltant, tant a la reproducció d'entrada com de sortida. El Twitch, el Facebook 360 Live, el Mixer RTMP i el Smashcast són exemples on està completament suportat. Encara que el Facebook Live i el YouTube Live accepten l'entrada de so envoltant, el Facebook Live la converteix a estèreo i el YouTube Live la reprodueix només en 2 canals.\n\nEls filtres d'àudio de l'OBS són compatibles amb el so envoltant, encara que no es garanteix la compatibilitat amb connectors VST."
Basic.Settings.Audio.MultichannelWarning.Title="Voleu habilitar el so envoltant?"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="Xarxa"
Basic.Settings.Advanced.Network.BindToIP="Enllaçar amb"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Activa el nou codi de xarxa"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Mode de baixa latència"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Inhabilita les tecles de drecera quan la finestra principal estigui en primer pla"
Basic.AdvAudio="&Propietats avançades d'àudio"
Basic.AdvAudio.Name="Nom"
@@ -749,3 +767,12 @@ OutputWarnings.MP4Recording="Advertència: Els enregistraments desats en MP4 ser
FinalScene.Title="Supressió de l'escena"
FinalScene.Text="Cal que hi hagi almenys una escena."
+NoSources.Title="Cap font"
+NoSources.Text="Sembla que encara no heu afegit cap font de vídeo, de manera que només es mostrarà una pantalla en blanc. Esteu segur que voleu fer això?"
+NoSources.Text.AddSource="Podeu afegir fonts fent clic a la icona «+» sota el quadre Fonts de la finestra principal en qualsevol moment."
+
+ChangeBG="Estableix el color"
+CustomColor="Color personalitzat"
+
+BrowserSource.EnableHardwareAcceleration="Habilita l'acceleració per maquinari al navegador"
+
diff --git a/UI/data/locale/cs-CZ.ini b/UI/data/locale/cs-CZ.ini
index 5665c6fcb..8ae5fd3ba 100644
--- a/UI/data/locale/cs-CZ.ini
+++ b/UI/data/locale/cs-CZ.ini
@@ -78,6 +78,8 @@ None="Žádný"
StudioMode.Preview="Náhled"
StudioMode.Program="Program"
ShowInMultiview="Zobrazit v Multiview"
+VerticalLayout="Vertikální rozložení"
+Group="Skupina"
AlreadyRunning.Title="OBS je již spuštěno"
AlreadyRunning.Text="OBS již běží! Pokud jste to opravdu nechtěli udělat, tak prosím ukončete ostatní běžící instance programu OBS před spuštěním nové. Pokud máte nastavenu minimalizaci do lišty, tak se prosím podívejte, zda neběží tam."
@@ -404,7 +406,10 @@ Basic.Main.StopReplayBuffer="Zastavit záznam do paměti"
Basic.Main.StoppingReplayBuffer="Zastavuji záznam do paměti..."
Basic.Main.StopStreaming="Zastavit vysílání"
Basic.Main.StoppingStreaming="Zastavuji vysílání..."
-Basic.Main.ForceStopStreaming="Zastavit vysání (bez zpoždění)"
+Basic.Main.ForceStopStreaming="Zastavit vysílání (bez zpoždění)"
+Basic.Main.Group="Skupina %1"
+Basic.Main.GroupItems="Seskupit vybrané"
+Basic.Main.Ungroup="Rozdělit skupinu"
Basic.MainMenu.File="Soubor (&F)"
Basic.MainMenu.File.Export="&Exportovat"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="Nás&troje"
Basic.MainMenu.Help="Pomoc (&H)"
Basic.MainMenu.Help.HelpPortal="&Portál pomoci"
Basic.MainMenu.Help.Website="Navštívit &web"
+Basic.MainMenu.Help.Discord="Připojit se na &Discord server"
Basic.MainMenu.Help.Logs="Soubory záznamu (&L)"
Basic.MainMenu.Help.Logs.ShowLogs="Zobrazit soubory záznamu (&S)"
Basic.MainMenu.Help.Logs.UploadCurrentLog="Nahrát aktuální soubor záznamu (&C)"
Basic.MainMenu.Help.Logs.UploadLastLog="Nahrát poslední soubor záznamu (&L)"
Basic.MainMenu.Help.Logs.ViewCurrentLog="Zobrazit aktuální záznam (&V)"
Basic.MainMenu.Help.CheckForUpdates="Zkontrolovat aktualizace"
+Basic.MainMenu.Help.CrashLogs="Hlášení o pádech (&R)"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="Zobrazit hlášení o pádech (&S)"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="Nahrát pos&lední hlášení"
Basic.Settings.ProgramRestart="Pro projevení nastavení je potřeba restartovat aplikaci."
Basic.Settings.ConfirmTitle="Potvrzení změn"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Vždy minimalizovat do systémov
Basic.Settings.General.SaveProjectors="Ukládat projektory při ukončení"
Basic.Settings.General.SwitchOnDoubleClick="Přejít na scénu po dvojitém kliknutí"
Basic.Settings.General.StudioPortraitLayout="Povolit rozložení na výšku (portrét)"
+Basic.Settings.General.Multiview="Multiview"
+Basic.Settings.General.Multiview.MouseSwitch="Kliknutí pro přechod mezi scénami"
+Basic.Settings.General.Multiview.DrawSourceNames="Zobrazovat názvy scén"
+Basic.Settings.General.Multiview.DrawSafeAreas="Vyznačovat viditelné oblasti (EBU R 95)"
Basic.Settings.General.MultiviewLayout="Rozložení Multiview"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontálně, nahoře"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontálně, dole"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertikálně, vlevo"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertikálně, vpravo"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontálně, nahoře (8 scén)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontálně, dole (8 scén)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertikálně, vlevo (8 scén)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertikálně, vpravo (8 scén)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Horizontálně, nahoře (24 scén)"
Basic.Settings.Stream="Vysílání"
Basic.Settings.Stream.StreamType="Typ vysílání"
@@ -631,6 +645,13 @@ Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Ostré při škálování
Basic.Settings.Audio="Zvuk"
Basic.Settings.Audio.SampleRate="Vzorkovací frekvence"
Basic.Settings.Audio.Channels="Kanály"
+Basic.Settings.Audio.MeterDecayRate="Rychlost útlumu snímače zvuku"
+Basic.Settings.Audio.MeterDecayRate.Fast="Rychle"
+Basic.Settings.Audio.MeterDecayRate.Medium="Střední (typ I PPM)"
+Basic.Settings.Audio.MeterDecayRate.Slow="Pomalu (typ II PPM)"
+Basic.Settings.Audio.PeakMeterType="Typ měřiče špičky"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Špička vzorky"
+Basic.Settings.Audio.PeakMeterType.TruePeak="Pravá špička (Vyšší využití CPU)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="VAROVÁNÍ: Prostorový zvuk je zapnut."
Basic.Settings.Audio.MultichannelWarning="Předtím než začnete vysílat si zkontrolujte, zda vaše vysílací služba podporuje příjem a přehrávání prostorového zvuku. Twitch, Facebook 360 Live, Mixer RTMP, Smashcast jsou příklady služeb, které jej plně podporují. I když Facebook Live a YouTube Live oba podporují příjem prostorového zvuku, Facebook Live jej převede na stereo a YouTube Live přehrává pouze dva kanály.\n\nOBS filtry zvuku jej plně podporují, ale podpora u pluginu VST není garantována."
Basic.Settings.Audio.MultichannelWarning.Title="Povolit prostorový zvuk?"
@@ -671,6 +692,7 @@ Basic.Settings.Advanced.Network="Síť"
Basic.Settings.Advanced.Network.BindToIP="Svázat s adresou"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Použít nový síťový kód"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Režim nízké odezvy"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Zakázat klávesové zkratky, když je hlavní okno aktivní"
Basic.AdvAudio="Rozšířené vlastnosti zvuku"
Basic.AdvAudio.Name="Název"
@@ -745,3 +767,12 @@ OutputWarnings.MP4Recording="Varování: Nahrávky uložené v MP4 nebude možn
FinalScene.Title="Odstranění scény"
FinalScene.Text="Musí existovat alespoň jedna scéna, proto tuto není možno odstranit."
+NoSources.Title="Žádné zdroje"
+NoSources.Text="Vypadá to, že jste zatím nepřidali žádné zdroje obrazu, takže budete vysílat černou obrazovku. Opravdu chcete pokračovat ?"
+NoSources.Text.AddSource="Zdroje můžete kdykoliv přidat tlačítkem + pod seznamem Zdroje v hlavním okně."
+
+ChangeBG="Nastavit barvu"
+CustomColor="Vlastní barva"
+
+BrowserSource.EnableHardwareAcceleration="Zapnout hardwarovou akceleraci pro zdroj prohlížeče"
+
diff --git a/UI/data/locale/da-DK.ini b/UI/data/locale/da-DK.ini
index 15bbbe54e..615dcd9fb 100644
--- a/UI/data/locale/da-DK.ini
+++ b/UI/data/locale/da-DK.ini
@@ -78,6 +78,8 @@ None="Ingen"
StudioMode.Preview="Forhåndsvisning"
StudioMode.Program="Program"
ShowInMultiview="Vis i Multi View"
+VerticalLayout="Lodret layout"
+Group="Gruppér"
AlreadyRunning.Title="OBS kører allerede"
AlreadyRunning.Text="OBS kører allerede! Medmindre dette er tilsigtet, så bedes du lukke enhver eksisterende OBS-proces, inden du forsøger at køre en ny. Hvis du har OBS indstillet til at minimeres sig til systembakken, så tjek venligst om den stadig kører dér."
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="Stopper Genafspilningsbuffer..."
Basic.Main.StopStreaming="Stop streaming"
Basic.Main.StoppingStreaming="Stopper stream..."
Basic.Main.ForceStopStreaming="Stop streaming (ignorer forsinkelse)"
+Basic.Main.Group="Gruppe %1"
+Basic.Main.GroupItems="Gruppér valgte elementer"
+Basic.Main.Ungroup="Ikke-grupperet"
Basic.MainMenu.File="&Fil"
Basic.MainMenu.File.Export="&Eksport"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="Værk&tøjer"
Basic.MainMenu.Help="&Hjælp"
Basic.MainMenu.Help.HelpPortal="Hjælp og &Portal"
Basic.MainMenu.Help.Website="Besøg &websted"
+Basic.MainMenu.Help.Discord="Join &Discord serveren"
Basic.MainMenu.Help.Logs="&Logfiler"
Basic.MainMenu.Help.Logs.ShowLogs="Vis log-filer (&S)"
Basic.MainMenu.Help.Logs.UploadCurrentLog="Upload Aktuelle logfil (&C)"
Basic.MainMenu.Help.Logs.UploadLastLog="Upload Sidste logfil (&L)"
Basic.MainMenu.Help.Logs.ViewCurrentLog="&Vis aktuel logfil"
Basic.MainMenu.Help.CheckForUpdates="Tjek for opdateringer"
+Basic.MainMenu.Help.CrashLogs="Nedbrudsrapporter"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="&Vis nedbrudsrapporter"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="Up&load seneste nedbrudsrapport"
Basic.Settings.ProgramRestart="Programmet skal genstartes, før disse indstillinger træder i kraft."
Basic.Settings.ConfirmTitle="Bekræfte ændringer"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Minimer altid til processlinjen i
Basic.Settings.General.SaveProjectors="Gem projektorer ved afslutning"
Basic.Settings.General.SwitchOnDoubleClick="Overgang til scenen ved dobbeltklik"
Basic.Settings.General.StudioPortraitLayout="Aktivere stående/liggende layout"
+Basic.Settings.General.Multiview="Multiview"
+Basic.Settings.General.Multiview.MouseSwitch="Klik for at skifte mellem scener"
+Basic.Settings.General.Multiview.DrawSourceNames="Vis scenenavne"
+Basic.Settings.General.Multiview.DrawSafeAreas="Tegn sikre områder (EBU R 95)"
Basic.Settings.General.MultiviewLayout="Multivisningslayout"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horisontal, Top"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horisontal, Bund"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertikal, Venstre"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertikal, Højre"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Vandret, øverst (8 scener)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Vandret, nederst (8 scener)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Lodret, venstre (8 scener)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Lodret, højre (8 scener)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Vandret, øverst (24 scener)"
Basic.Settings.Stream="Stream"
Basic.Settings.Stream.StreamType="Streamtype"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="Lydmålerudstyring, faldhastighed"
Basic.Settings.Audio.MeterDecayRate.Fast="Hurtig"
Basic.Settings.Audio.MeterDecayRate.Medium="Medium (Type I PPM)"
Basic.Settings.Audio.MeterDecayRate.Slow="Langsom (Type II PPM)"
+Basic.Settings.Audio.PeakMeterType="Peak Meter-type"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Intervalspidsværdi"
+Basic.Settings.Audio.PeakMeterType.TruePeak="Sand spidsværdi (højere CPU-belastning)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="ADVARSEL: Surround Sound-lyd er aktiveret."
Basic.Settings.Audio.MultichannelWarning="Tjek ifm. streamer, om din streaming-tjeneste understøtter både Surround Sound-input og -afspilning. Twitch, Facebook 360 Live, Mixer RTMP og Smashcast er eksempler, hvor surroundlyd understøttes fuldt ud. Selvom Facebook Live og YouTube Live begge accepterer surround input, nedmikser Facebook Live til stereo, og YouTube Live afspiller kun to kanaler.\n\nOBS-lydfiltre er kompatible med surroundlyd, dog er VST-pluginsupport ikke garanteret."
Basic.Settings.Audio.MultichannelWarning.Title="Aktivér Surround Sound-lyd?"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="Netværk"
Basic.Settings.Advanced.Network.BindToIP="Bind til IP"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Aktivér ny netværkskode"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Lav forsinkelsestilstand"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Deaktivér genvejstaster, når hovedvinduet er i fokus"
Basic.AdvAudio="Avancerede lydegenskaber"
Basic.AdvAudio.Name="Navn"
@@ -749,3 +767,12 @@ OutputWarnings.MP4Recording="Advarsel: MP4-optagelser vil ikke kunne genoprettes
FinalScene.Title="Slet scene"
FinalScene.Text="Der kræves mindst én scene."
+NoSources.Title="Ingen kilder"
+NoSources.Text="Det ser ud til, at du ikke har tilføjet nogen videokilder endnu, så dit output bliver en blank/tom skærm. Sikker på, at du vil gøre dette?"
+NoSources.Text.AddSource="Du kan til enhver tid tilføje kilder ved at klikke på +-ikonet under feltet Kilder i hovedvinduet."
+
+ChangeBG="Sæt farve"
+CustomColor="Brugerdefineret farve"
+
+BrowserSource.EnableHardwareAcceleration="Aktivér Browser Source-hardwareacceleration"
+
diff --git a/UI/data/locale/de-DE.ini b/UI/data/locale/de-DE.ini
index d0f64dc70..5051ea51f 100644
--- a/UI/data/locale/de-DE.ini
+++ b/UI/data/locale/de-DE.ini
@@ -78,6 +78,8 @@ None="Keine"
StudioMode.Preview="Vorschau"
StudioMode.Program="Programm"
ShowInMultiview="In Multiview anzeigen"
+VerticalLayout="Vertikales Layout"
+Group="Gruppe"
AlreadyRunning.Title="OBS wird bereits ausgeführt"
AlreadyRunning.Text="OBS wird bereits ausgeführt! Bitte beenden Sie alle vorhandenen OBS Instanzen bevor Sie eine neue Instanz starten, es sei denn, Sie tun dies absichtlich. Wenn Sie OBS so eingestellt haben das es sich zum Infobereich minimiert, überprüfen Sie bitte, ob es dort läuft."
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="Stoppe Replaypuffer..."
Basic.Main.StopStreaming="Streaming stoppen"
Basic.Main.StoppingStreaming="Stoppe Stream..."
Basic.Main.ForceStopStreaming="Streaming stoppen (Verzögerung verwerfen)"
+Basic.Main.Group="Gruppe %1"
+Basic.Main.GroupItems="Ausgewählte Elemente gruppieren"
+Basic.Main.Ungroup="Gruppierung aufheben"
Basic.MainMenu.File="Datei (&F)"
Basic.MainMenu.File.Export="&Exportieren"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="Werkzeuge (&T)"
Basic.MainMenu.Help="&Hilfe"
Basic.MainMenu.Help.HelpPortal="Hilfe&portal"
Basic.MainMenu.Help.Website="&Webseite besuchen"
+Basic.MainMenu.Help.Discord="Tritt unserem &Discordserver bei"
Basic.MainMenu.Help.Logs="&Logdateien"
Basic.MainMenu.Help.Logs.ShowLogs="Logdateien anzeigen (&S)"
Basic.MainMenu.Help.Logs.UploadCurrentLog="Upload aktuelle Logdatei (&C)"
Basic.MainMenu.Help.Logs.UploadLastLog="Upload &letzte Logdatei"
Basic.MainMenu.Help.Logs.ViewCurrentLog="Aktuelles Protokoll anzeigen (&V)"
Basic.MainMenu.Help.CheckForUpdates="Auf Updates prüfen"
+Basic.MainMenu.Help.CrashLogs="Abstu&rzberichte"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="Ab&sturzberichte anzeigen"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="Upload &letzten Absturzbericht"
Basic.Settings.ProgramRestart="Das Programm muss neu gestartet werden, damit die Änderungen wirksam werden."
Basic.Settings.ConfirmTitle="Änderungen bestätigen"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Immer zum Infobereich. statt zur
Basic.Settings.General.SaveProjectors="Projektoren beim Beenden speichern"
Basic.Settings.General.SwitchOnDoubleClick="Übergang zur Szene beim Doppelklicken"
Basic.Settings.General.StudioPortraitLayout="Porträt/vertikales Layout aktivieren"
+Basic.Settings.General.Multiview="Multiview"
+Basic.Settings.General.Multiview.MouseSwitch="Klicken, um zwischen den Szenen umzuschalten"
+Basic.Settings.General.Multiview.DrawSourceNames="Szenennamen anzeigen"
+Basic.Settings.General.Multiview.DrawSafeAreas="Zeige sichere Bereiche (EBU R 95)"
Basic.Settings.General.MultiviewLayout="Multiview Layout"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontal, oben"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontal, unten"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertikal, links"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertikal, rechts"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontal, oben (8 Szenen)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontal, unten (8 Szenen)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertikal, links (8 Szenen)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertikal, rechts (8 Szenen)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Horizontal, oben (24 Szenen)"
Basic.Settings.Stream="Stream"
Basic.Settings.Stream.StreamType="Stream Typ"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="Aussteuerungsmesserverfallsrate"
Basic.Settings.Audio.MeterDecayRate.Fast="Schnell"
Basic.Settings.Audio.MeterDecayRate.Medium="Mittel (Type I PPM)"
Basic.Settings.Audio.MeterDecayRate.Slow="Langsam (Type II PPM)"
+Basic.Settings.Audio.PeakMeterType="Peakmeter Typ"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Sample Peak"
+Basic.Settings.Audio.PeakMeterType.TruePeak="True Peak (höhere CPU-Auslastung)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="WARNUNG: Surround-Sound-Audio ist aktiviert."
Basic.Settings.Audio.MultichannelWarning="Überprüfen Sie beim Streaming, ob Ihr Streaming-Dienst sowohl die Einspeisung von Surround-Sound als auch die Surround-Sound-Wiedergabe unterstützt. Twitch, Facebook 360 Live, Mixer RTMP und Smashcast sind Beispiele, bei denen Surround Sound voll unterstützt wird. Obwohl Facebook Live und YouTube Live beide die Surround-Einspeisung akzeptieren, wird Facebook Live auf Stereo heruntergemischt und YouTube Live spielt nur zwei Kanäle ab.\n\nOBS-Audiofilter sind mit Surround-Sound kompatibel, obwohl die VST-Plugin-Unterstützung nicht garantiert ist."
Basic.Settings.Audio.MultichannelWarning.Title="Surround-Sound-Audio aktivieren?"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="Netzwerk"
Basic.Settings.Advanced.Network.BindToIP="Interface"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Neuen Netzwerkcode aktivieren"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Niedriger Latenzmodus"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Hotkeys deaktivieren, wenn das Hauptfenster im Fokus ist"
Basic.AdvAudio="Erweiterte Audioeigenschaften"
Basic.AdvAudio.Name="Name"
@@ -749,3 +767,12 @@ OutputWarnings.MP4Recording="Warnung: Aufnahmen, die in MP4 gespeichert werden,
FinalScene.Title="Szene löschen"
FinalScene.Text="Es muss mindestens eine Szene vorhanden sein."
+NoSources.Title="Keine Quellen"
+NoSources.Text="Offenbar haben Sie noch keine Videoquellen hinzugefügt, so dass Sie nur einen leeren Bildschirm ausgeben werden. Sind Sie sicher, dass Sie das wollen?"
+NoSources.Text.AddSource="Sie können zu jeder Zeit Quellen hinzufügen, indem Sie auf das + Symbol unter dem Quellenfeld im Hauptfenster klicken."
+
+ChangeBG="Farbe auswählen"
+CustomColor="Benutzerdefinierte Farbe"
+
+BrowserSource.EnableHardwareAcceleration="Browser Hardwarebeschleunigung aktivieren"
+
diff --git a/UI/data/locale/el-GR.ini b/UI/data/locale/el-GR.ini
index 17fe7ff51..5c9954e3c 100644
--- a/UI/data/locale/el-GR.ini
+++ b/UI/data/locale/el-GR.ini
@@ -28,12 +28,16 @@ Browse="Αναζήτηση"
Mono="Μονοφωνικό"
Stereo="Στερεοφωνικό"
DroppedFrames="Διακεκομμένα καρέ %1 (%2%)"
+StudioProgramProjector="Προβολέας Πλήρους Οθόνης (Πηγή)"
PreviewProjector="Προβολέας Πλήρους Οθόνης (Προεπισκόπηση)"
SceneProjector="Προβολέας Πλήρους Οθόνης (Σκηνή)"
SourceProjector="Προβολέας Πλήρους Οθόνης (Πηγή)"
+StudioProgramWindow="Παραθύρου προβολής (πρόγραμμα)"
PreviewWindow="Σε παράθυρο στον Προβολέα (Προεπισκόπηση)"
SceneWindow="Σε παράθυρο στον Προβολέα (Σκηνή)"
SourceWindow="Σε παράθυρο στον Προβολέα (Πηγή)"
+MultiviewProjector="MultiView (πλήρης οθόνη)"
+MultiviewWindowed="MultiView (παραθύρου)"
Clear="Καθαρισμός"
Revert="Επαναφορά"
Show="Εμφάνιση"
@@ -69,6 +73,11 @@ Next="Επόμενο"
Back="Προηγούμενο"
Defaults="Προεπιλογές"
HideMixer="Απόκρυψη στον Μίκτη"
+TransitionOverride="Παράκαμψη της μετάβασης"
+None="Καμία"
+StudioMode.Preview="Προεπισκόπηση"
+StudioMode.Program="Πρόγραμμα"
+ShowInMultiview="Εμφάνιση σε Multiview"
AlreadyRunning.Title="Το OBS εκτελείται ήδη"
AlreadyRunning.Text="Το OBS εκτελείται ήδη! Εκτός αν θέλατε να το κάνετε αυτό, παρακαλούμε τερματίστε τις τρέχουσες διεργασίες OBS πριν προσπαθήσετε να εκκινήσετε μια καινούρια. Εάν έχετε ρυθμίσει το OBS να ελαχιστοποιείται στην γραμμή εργαλείων, παρακαλούμε να ελένξετε αν τρέχει ήδη εκεί."
@@ -221,6 +230,7 @@ Output.RecordNoSpace.Msg="Δεν υπάρχει επαρκής χώρος στο
Output.RecordError.Title="Σφάλμα εγγραφής"
Output.RecordError.Msg="Παρουσιάστηκε ένα αδιευκρίνιστο σφάλμα κατά την εγγραφή."
Output.ReplayBuffer.NoHotkey.Title="Δεν έχει επιλεχθεί hotkey!"
+Output.ReplayBuffer.NoHotkey.Msg="Καμμία αποθήκευση συντόμευσης για επανάληψη buffer. Παρακαλώ ορίστε την συντόμευση για «Αποθήκευση» καί χρήση για την αποθήκευση επανάληψης ηχογραφήσεων."
Output.BadPath.Title="Λάθος Διαδρομή Αρχείου"
Output.BadPath.Text="Η προκαθορισμένη διαδρομή αρχείου δεν ειναι έγκυρη. Παρακαλώ ελέγξτε τις ρυθμίσεις σας για να επιβεβαιώσετε ότι έχει οριστεί μια έγκυρη διαδρομή αρχείου."
@@ -302,6 +312,8 @@ AddProfile.Text="Παρακαλώ εισάγετε το όνομα του προ
RenameProfile.Title="Μετονομασία Προφίλ"
+Basic.Main.MixerRename.Title="Μετονομασία της πηγής ήχου"
+Basic.Main.MixerRename.Text="Παρακαλώ εισάγετε το όνομα της πηγής ήχου"
Basic.Main.PreviewDisabled="Η προεπισκόπηση είναι απενεργοποιημένη"
@@ -457,6 +469,7 @@ Basic.MainMenu.SceneCollection.Exists="Η συλλογή σκήνων υπάρχ
Basic.MainMenu.Tools="&Εργαλεία"
Basic.MainMenu.Help="Βοήθεια(&H)"
+Basic.MainMenu.Help.HelpPortal="Πύλη βοήθειας"
Basic.MainMenu.Help.Website="Μετάβαση στην &Ιστοσελίδα"
Basic.MainMenu.Help.Logs="Αρχεία(&) Καταγραφής"
Basic.MainMenu.Help.Logs.ShowLogs="Εμφάνιση(&S) Αρχείων Καταγραφής"
@@ -476,6 +489,25 @@ Basic.Settings.General.EnableAutoUpdates="Αυτόματος έλεγχος εν
Basic.Settings.General.OpenStatsOnStartup="Άνοιγμα παραθύρου στατιστικών κατά την εκκίνηση"
Basic.Settings.General.WarnBeforeStartingStream="Εμφάνιση παραθύρου επιβεβαίωσης κατά την εκκίνηση των streams"
Basic.Settings.General.WarnBeforeStoppingStream="Εμφάνιση παραθύρου επιβεβαίωσης κατά τη διακοπή των streams"
+Basic.Settings.General.Projectors="Προβολείς"
+Basic.Settings.General.HideProjectorCursor="Απόκρυψη τού δρομέα πάνω από τούς προβολείς"
+Basic.Settings.General.ProjectorAlwaysOnTop="Προβολείς πάντα στην κορυφή"
+Basic.Settings.General.Snapping="Ευθυγράμμιση πηγής"
+Basic.Settings.General.ScreenSnapping="Προσκόλληση πηγών στην άκρη της οθόνης"
+Basic.Settings.General.CenterSnapping="Προσκόλληση πηγών οριζόντια και κάθετα στο κέντρο"
+Basic.Settings.General.SourceSnapping="Προσκόλληση πηγών σε άλλες πηγές"
+Basic.Settings.General.SnapDistance="Ευαισθησία προσκόλλησης"
+Basic.Settings.General.RecordWhenStreaming="Αυτόματη καταγραφή κατά την ροή"
+Basic.Settings.General.KeepRecordingWhenStreamStops="Διατηρήσετε καταγραφών όταν σταματά η ροή"
+Basic.Settings.General.ReplayBufferWhileStreaming="Αυτόματη εκκίνηση replay buffer κατά τη ροή"
+Basic.Settings.General.KeepReplayBufferStreamStops="Διατήρηση επανάληψης buffer όταν σταματά η ροή"
+Basic.Settings.General.SysTray="System Tray"
+Basic.Settings.General.SysTrayWhenStarted="Ελαχιστοποίηση στο System Tray κατά την εκκίνηση"
+Basic.Settings.General.SystemTrayHideMinimize="Συνεχής ελαχιστοποίηση στο System Tray αντί στην γραμμή εργασιών"
+Basic.Settings.General.SaveProjectors="Αποθήκευση προβολής στην έξοδο"
+Basic.Settings.General.SwitchOnDoubleClick="Μετάβαση στην σκηνή με διπλό κλικ"
+Basic.Settings.General.StudioPortraitLayout="Ενεργοποίηση πορτρέτου/κατακόρυφης διάταξης"
+Basic.Settings.General.MultiviewLayout="MultiView διάταξη"
Basic.Settings.Stream="Μετάδοση"
Basic.Settings.Stream.StreamType="Τύπος Μετάδοσης"
@@ -485,24 +517,37 @@ Basic.Settings.Output.Format="Μορφή Καταγραφής"
Basic.Settings.Output.Encoder="Κωδικοποιητής"
Basic.Settings.Output.SelectDirectory="Επιλέξτε κατάλογο καταγραφής"
Basic.Settings.Output.SelectFile="Επιλέξτε αρχείο καταγραφής"
+Basic.Settings.Output.EnforceBitrate="Επιβολή ροής υπηρεσία bitrate ορίων"
Basic.Settings.Output.Mode="Λειτουργία Εξόδου"
Basic.Settings.Output.Mode.Simple="Απλό"
Basic.Settings.Output.Mode.Adv="Σύνθετες επιλογές"
Basic.Settings.Output.Mode.FFmpeg="Έξοδος FFmpeg"
+Basic.Settings.Output.UseReplayBuffer="Ενεργοποίηση επανάληψης Buffer"
Basic.Settings.Output.ReplayBuffer.SecondsMax="Μέγιστος Χρόνος Επανάληψης (Δευτερόλεπτα)"
Basic.Settings.Output.ReplayBuffer.MegabytesMax="Μέγιστη Μνήμη (Megabytes)"
Basic.Settings.Output.ReplayBuffer.Estimate="Εκτιμώμενη χρήση μνήμης: %1 MB"
Basic.Settings.Output.ReplayBuffer.EstimateUnknown="Δεν είναι δυνατή η εκτίμηση της χρήσης μνήμης. Ορίστε μέγιστο όριο μνήμης."
+Basic.Settings.Output.ReplayBuffer.HotkeyMessage="(Σημείωση: Βεβαιωθείτε ότι ορίσατε μία συντόμευση για το buffer στην ενότητα συντομέυσεων)"
+Basic.Settings.Output.ReplayBuffer.Prefix="Πρόθεμα ονόματος αρχείου Buffer Replay"
Basic.Settings.Output.ReplayBuffer.Suffix="Επίθεμα"
Basic.Settings.Output.Simple.SavePath="Διαδρομή Καταγραφής"
Basic.Settings.Output.Simple.RecordingQuality="Ποιότητα Εγγραφής"
+Basic.Settings.Output.Simple.RecordingQuality.Stream="Ίδιο με την ροή"
Basic.Settings.Output.Simple.RecordingQuality.Small="Υψηλής Ποιότητας, Μεσαίου Μεγέθους Αρχείο"
Basic.Settings.Output.Simple.RecordingQuality.HQ="Δυσδιάκριτης Ποιότητας, Μεγάλου Μεγέθους Αρχείο"
Basic.Settings.Output.Simple.RecordingQuality.Lossless="Ποιότητας Χωρίς Απώλειες, Εξαιρετικά Μεγάλου Μεγέθους Αρχείο"
+Basic.Settings.Output.Simple.Warn.VideoBitrate="Προειδοποίηση: Το streaming βίντεο bitrate θα οριστεί %1, που είναι το ανώτερο όριο για την τρέχουσα υπηρεσία συνεχούς ροής. Εάν είστε βέβαιοι ότι θέλετε να πάτε πάνω από %1, Ενεργοποίηση επιλογών προηγμένο κωδικοποιητή και uncheck «Επιβολή streaming υπηρεσία bitrate όρια»."
+Basic.Settings.Output.Simple.Warn.AudioBitrate="Προειδοποίηση: Η ροή ήχου bitrate θα οριστεί %1, που είναι το ανώτερο όριο για την τρέχουσα υπηρεσία συνεχούς ροής. Εάν είστε βέβαιοι ότι θέλετε να πάτε πάνω από %1, Ενεργοποίηση επιλογών προηγμένο κωδικοποιητή και uncheck «Επιβολή streaming υπηρεσία bitrate όρια»."
+Basic.Settings.Output.Simple.Warn.Encoder="Προσοχή: Η εγγραφή με έναν κωδικοποιητή λογισμικού σε διαφορετική ποιότητα από την ροή θα απαιτήσει πρόσθετη χρήση της CPU, αν μπορείτε να πραγματοποιήσετε την ροή και την εγγραφή την ίδια στιγμή."
+Basic.Settings.Output.Simple.Warn.Lossless="Προειδοποίηση: Η μη απωλεστική ποιότητα δημιουργεί τρομερά μεγάλο μέγεθος των αρχείων! Η ποιότητα χωρίς απώλειες ποιότητας θα καταλάβει 7 gigabyte χώρο στον σκληρό δίσκο ανά λεπτό, σε υψηλές αναλύσεις και framerates. Χωρίς απώλειες δεν συνιστάται για μεγάλες ηχογραφήσεις, εκτός αν έχετε πολύ χώρο στον σκληρό δίσκο."
+Basic.Settings.Output.Simple.Warn.Lossless.Msg="Είστε σίγουρος ότι θέλετε να το χρησιμοποιήσετε χωρίς απώλειες ποιότητας;"
+Basic.Settings.Output.Simple.Warn.Lossless.Title="Χωρίς απώλειες ποιότητας προειδοποίηση!"
+Basic.Settings.Output.Simple.Warn.MultipleQSV="Προειδοποίηση: Δεν μπορείτε να χρησιμοποιήσετε πολλαπλούς ξεχωριστούς QSV κωδικοποιητές κατά την ροή και την εγγραφή την ίδια στιγμή. Αν θέλετε κάνετε stream και να καταγράψετε ταυτόχρονα, παρακαλείστε να αλλάξετε είτε την εγγραφή η την ροή τού κωδικοποιητή."
Basic.Settings.Output.Simple.Encoder.Software="Λογισμικό (x264)"
Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Υλικού (QSV)"
Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Υλικού (AMD)"
Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Υλικού (NVENC)"
+Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Λογισμικό (x264 χαμηλή χρήση CPU preset, αυξάνει το μέγεθος τού αρχείου)"
Basic.Settings.Output.VideoBitrate="Ρυθμός Bit του Βίντεο"
Basic.Settings.Output.AudioBitrate="Ρυθμός Bit του Ήχου"
Basic.Settings.Output.Reconnect="Αυτόματη Επανασύνδεση"
@@ -522,12 +567,15 @@ Basic.Settings.Output.Adv.Audio.Track1="Κομμάτι 1"
Basic.Settings.Output.Adv.Audio.Track2="Κομμάτι 2"
Basic.Settings.Output.Adv.Audio.Track3="Κομμάτι 3"
Basic.Settings.Output.Adv.Audio.Track4="Κομμάτι 4"
+Basic.Settings.Output.Adv.Audio.Track5="Κομμάτι 5"
+Basic.Settings.Output.Adv.Audio.Track6="Κομμάτι 6"
Basic.Settings.Output.Adv.Recording="Εγγραφή"
Basic.Settings.Output.Adv.Recording.Type="Τύπος"
Basic.Settings.Output.Adv.Recording.Type.Standard="Κανονικός"
Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Προσαρμοσμένη Έξοδος (FFmpeg)"
Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Χρήση κωδικοποιητή ροής)"
+Basic.Settings.Output.Adv.Recording.Filename="Μορφοποίηση ονόματος αρχείου"
Basic.Settings.Output.Adv.Recording.OverwriteIfExists="Αντικατάσταση εάν το αρχείο υπάρχει"
Basic.Settings.Output.Adv.FFmpeg.Type="Τύπος εξόδου FFmpeg"
Basic.Settings.Output.Adv.FFmpeg.Type.URL="Έξοδος σε διεύθυνση URL"
@@ -553,9 +601,12 @@ Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Προβολή όλων τω
FilenameFormatting.completer="%AAXX-%MM-%ΗΗ %ωω-%λλ-%δδ\n%ΧΧ-%ΜΜ-%ΗΗ %ωω-%λλ-%δδ\n%Χ-%μ-%η %Ω-%Λ-%Δ\n%χ-%μ-%η %Ω-%Λ-%Δ\n%α %Χ-%μ-%η %Ω-%Λ-%Δ\n%Α %Χ-%μ-%η %Ω-%Λ-%Δ\n%Χ-%μ-%η %Ω-%Λ-%Δ\n%Χ-%Μ-%η %Ω-%Λ-%Δ\n%Χ-%μ-%η %Ω-%Λ-%Δ-%p\n%Χ-%μ-%μ %Ω-%Λ-%Δ-%ζ\n%Χ-%μ-%η %Ω-%Λ-%Δ-%Ζ"
+FilenameFormatting.TT="%CCYY έτους, τέσσερις digits\n%YY έτος, τα δύο τελευταία ψηφία (00-99) \n%MM μήνα ως ένα δεκαδικό αριθμό (01-12) \n%DD ημέρα του μήνα, μηδέν επένδυση (01-31)\n%hh ώρα στο 24h μορφή (00-23) \n%mm λεπτό (00-59) \n%ss δεύτερος (00-61) \n%% μια%a sign\n % συντετμημένη καθημερινές name\n%A πλήρη ημέρα της εβδομάδας name\n%b συντετμημένη μήνα name\n%B πλήρη μήνα name\n%d ημέρα του μήνα, μηδέν-γεμισμένος (01-31) \n%H ώρα στο 24h μορφή (00-23) \n%I ώρα σε μορφή 12h (01-12)\n%m μήνας ως δεκαδικός αριθμός (01-12)\n%M λεπτά (00-59) \n%p π. μ. ή μ. μ. designation\n%S δεύτερο (00-61) \n%y έτος, τελευταία δύο ψηφία (00-99)\n%Y Year\n%z ISO 8601 μετατόπιση από UTC ή timezone\n όνομα ή όνομα ζώνης ώρας%Z abbreviation\n ή abbreviation\n"
Basic.Settings.Video="Βίντεο"
Basic.Settings.Video.Adapter="Προσαρμογέας Βίντεο:"
+Basic.Settings.Video.BaseResolution="Βάση (Καμβάς) Ανάλυση"
+Basic.Settings.Video.ScaledResolution="Ανάλυση εξόδου (κλίμακα)"
Basic.Settings.Video.DownscaleFilter="Φίλτρο Σμίκρυνσης:"
Basic.Settings.Video.DisableAeroWindows="Απενεργοποίηση Aero (Windows μόνο)"
Basic.Settings.Video.FPS="Καρέ ανά δευτερόλεπτο (FPS):"
@@ -576,23 +627,48 @@ Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Οξυμμένη κλιμ
Basic.Settings.Audio="Ήχος"
Basic.Settings.Audio.SampleRate="Ρυθμός Δειγματοληψίας"
Basic.Settings.Audio.Channels="Κανάλια"
+Basic.Settings.Audio.MeterDecayRate="Συντελεστής απόσβεσης ήχου μέτρησης"
+Basic.Settings.Audio.MeterDecayRate.Fast="Γρήγορος"
+Basic.Settings.Audio.MeterDecayRate.Medium="Μεσαίος (τύπος Ι PPM)"
+Basic.Settings.Audio.MeterDecayRate.Slow="Αργός (Τύπος ΙΙ PPM)"
+Basic.Settings.Audio.MultiChannelWarning.Enabled="Προειδοποίηση: Ο ήχος Surround είναι ενεργοποιημένος."
+Basic.Settings.Audio.MultichannelWarning="Κατά το streaming, ελέγξτε αν η υπηρεσία streaming υποστηρίζει ήχο surround δύο ηχείων και ήχο surround αναπαραγωγής. Το Twitch, το Facebook 360 Live, το μίξερ RTMP καί το Smashcast αποτελούν παραδείγματα όπου ο surround ήχος υποστηρίζεται πλήρως. Αν και το Facebook Live και το YouTube Live αποδέχεστε τον ήχο surround, το Facebook Live κατεβάζει τον σε stereo, και το YouTube Live υποστηρίζει μόνο δύο φίλτρα ήχου.\n\nΤο OBS είναι συμβατό με ήχο surround, αν καί δεν είναι εγγυημένη η υποστήριξη για plugins VST."
+Basic.Settings.Audio.MultichannelWarning.Title="Ενεργοποίηση ήχου surround;"
+Basic.Settings.Audio.MultichannelWarning.Confirm="Είναι βέβαιοι ότι θέλετε να ενεργοποιήσετε τον ήχο surround;"
Basic.Settings.Audio.DesktopDevice="Συσκευή Ήχου Επιφάνειας"
Basic.Settings.Audio.DesktopDevice2="Συσκευή Ήχου Επιφάνειας 2"
Basic.Settings.Audio.AuxDevice="Μικρόφωνο/Αuxillary Συσκευή Ήχου"
Basic.Settings.Audio.AuxDevice2="Μικρόφωνο/Αuxillary Συσκευή Ήχου 2"
Basic.Settings.Audio.AuxDevice3="Μικρόφωνο/Αuxillary Συσκευή Ήχου 3"
+Basic.Settings.Audio.EnablePushToMute="Ενεργοποίηση της ώθησης-γιά-σίγαση"
+Basic.Settings.Audio.PushToMuteDelay="Καθυστέρηση ώθησης-γιά-σίγαση"
+Basic.Settings.Audio.EnablePushToTalk="Ενεργοποίηση Push-to-talk"
+Basic.Settings.Audio.PushToTalkDelay="Push-to-talk καθυστέρηση"
+Basic.Settings.Audio.UnknownAudioDevice="[Η συσκευή δεν είναι συνδεδεμένη η δεν είναι διαθέσιμη]"
Basic.Settings.Advanced="Σύνθετες επιλογές"
+Basic.Settings.Advanced.General.ProcessPriority="Προτεραιότητα διαδικασίας"
+Basic.Settings.Advanced.General.ProcessPriority.High="Υψηλή"
+Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="Πάνω από το φυσιολογικό"
+Basic.Settings.Advanced.General.ProcessPriority.Normal="Κανονική"
+Basic.Settings.Advanced.General.ProcessPriority.BelowNormal="Κάτω από την κανονική"
+Basic.Settings.Advanced.General.ProcessPriority.Idle="Σε αδράνεια"
Basic.Settings.Advanced.FormatWarning="Προσοχή: Μορφές χρώματος εκτός του NV12 προορίζονται κυρίως για καταγραφή, και δεν συνιστώνται κατά τη μετάδοση. Ενδέχεται να υπάρξει αυξημένη χρήση της CPU λόγω μετατροπής μορφής χρώματος."
Basic.Settings.Advanced.Audio.BufferingTime="Χρόνος buffering ήχου"
Basic.Settings.Advanced.Video.ColorFormat="Μορφή Χρώματος"
+Basic.Settings.Advanced.Video.ColorSpace="Χώρος χρωμάτων YUV"
+Basic.Settings.Advanced.Video.ColorRange="Ποικιλία χρωμάτων YUV"
Basic.Settings.Advanced.Video.ColorRange.Partial="Μερικό"
Basic.Settings.Advanced.Video.ColorRange.Full="Πλήρες"
+Basic.Settings.Advanced.Audio.MonitoringDevice="Συσκευή παρακολούθησης ήχου"
Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Προεπιλεγμένη"
+Basic.Settings.Advanced.Audio.DisableAudioDucking="Απενεργοποίηση σίγασης ήχου"
+Basic.Settings.Advanced.StreamDelay="Καθυστέρηση ροής"
Basic.Settings.Advanced.StreamDelay.Duration="Διάρκεια (δευτερόλεπτα)"
Basic.Settings.Advanced.StreamDelay.Preserve="Διατήρηση σημείου αποκοπής (αύξηση καθυστέρησης) κατά την επανασύνδεση"
Basic.Settings.Advanced.StreamDelay.MemoryUsage="Εκτιμώμενη Χρήση Μνήμης: %1 MB"
Basic.Settings.Advanced.Network="Δίκτυο"
+Basic.Settings.Advanced.Network.BindToIP="Σύνδεση με IP"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Ενεργοποίηση νέου κώδικα δικτύωσης"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Λειτουργία χαμηλής καθυστέρησης"
@@ -602,9 +678,14 @@ Basic.AdvAudio.Volume="Ένταση (%)"
Basic.AdvAudio.Mono="Αποκωδικοποίηση σε Mono"
Basic.AdvAudio.Panning="Πανοραμικό"
Basic.AdvAudio.SyncOffset="Μετατόπιση Συγχρονισμού (ms)"
+Basic.AdvAudio.Monitoring="Ηχητική παρακολούθηση"
+Basic.AdvAudio.Monitoring.None="Monitor Off"
+Basic.AdvAudio.Monitoring.MonitorOnly="Μόνο η οθόνη (σίγαση εξόδου)"
+Basic.AdvAudio.Monitoring.Both="Παρακολούθηση και έξοδος"
Basic.AdvAudio.AudioTracks="Κομμάτια"
Basic.Settings.Hotkeys="Πλήκτρα συντόμευσης"
+Basic.Settings.Hotkeys.Pair="Συνδυασμοί πλήκτρων που μοιράζεται με το «%1» που ενεργούν ως εναλλαγή"
Basic.Hotkeys.SelectScene="Μετάβαση σε σκηνή"
@@ -644,12 +725,26 @@ Hotkeys.AppleKeypadNum="%1 (Keypad)"
Hotkeys.AppleKeypadMultiply="* (Keypad)"
Hotkeys.AppleKeypadDivide="/ (Keypad)"
Hotkeys.AppleKeypadAdd="+ (Keypad)"
+Hotkeys.AppleKeypadSubtract="- (Αριθμητικό πληκτρολόγιο)"
+Hotkeys.AppleKeypadDecimal=". (Πληκτρολόγιο)"
+Hotkeys.AppleKeypadEqual="= (Αριθμητικό πληκτρολόγιο)"
+Hotkeys.MouseButton="%1 ποντίκι"
Mute="Σίγαση"
Unmute="Κατάργηση σίγασης"
+Push-to-mute="Ώθηση-για-σίγαση"
+Push-to-talk="Πίεση και ομιλία"
SceneItemShow="Εμφάνιση '%1'"
SceneItemHide="Απόκρυψη '%1'"
+OutputWarnings.NoTracksSelected="Πρέπει να επιλέξετε τουλάχιστον ένα κομμάτι"
+OutputWarnings.MultiTrackRecording="Προειδοποίηση: Ορισμένες μορφές (όπως FLV) δεν υποστηρίζουν πολλαπλά κομμάτια ανά εγγραφή"
+OutputWarnings.MP4Recording="Προειδοποίηση: Οι ηχογραφήσεις που έχουν αποθηκευτεί σε MP4 θα είναι αδιόρθωτες, αν το αρχείο δεν είναι δυνατόν να ολοκληρωθεί (π.χ. λόγω BSODs, απώλεια ισχύος, κλπ.). Αν θέλετε να καταγράψετε πολλαπλά κομμάτια ήχου χρησιμοποιήστε το MKV και remux καταγραφής για mp4, αφού τελειώσει (αρχείο-> Remux ηχογραφήσεις)"
+
+FinalScene.Title="Διαγραφή σκηνής"
+FinalScene.Text="Πρέπει να υπάρχει τουλάχιστον μία σκηνή."
+
+
diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini
index 9ed218448..8b00b90ab 100644
--- a/UI/data/locale/en-US.ini
+++ b/UI/data/locale/en-US.ini
@@ -85,8 +85,8 @@ StudioMode.Program="Program"
ShowInMultiview="Show in Multiview"
# warning if program already open
-AlreadyRunning.Title="OBS is already running"
-AlreadyRunning.Text="OBS is already running! Unless you meant to do this, please shut down any existing instances of OBS before trying to run a new instance. If you have OBS set to minimize to the system tray, please check to see if it's still running there."
+AlreadyRunning.Title="EBS is already running"
+AlreadyRunning.Text="EBS is already running! Unless you meant to do this, please shut down any existing instances of EBS before trying to run a new instance. If you have EBS set to minimize to the system tray, please check to see if it's still running there."
AlreadyRunning.LaunchAnyway="Launch Anyway"
# copy filters
@@ -224,8 +224,8 @@ ConfirmStop.Title="Stop Stream?"
ConfirmStop.Text="Are you sure you want to stop the stream?"
# confirm exit dialog box
-ConfirmExit.Title="Exit OBS?"
-ConfirmExit.Text="OBS is currently active. All streams/recordings will be shut down. Are you sure you wish to exit?"
+ConfirmExit.Title="Exit EBS?"
+ConfirmExit.Text="EBS is currently active. All streams/recordings will be shut down. Are you sure you wish to exit?"
# confirm delete dialog box
ConfirmRemove.Title="Confirm Remove"
@@ -267,20 +267,20 @@ LogReturnDialog.ErrorUploadingLog="Error uploading log file"
# license agreement dialog
LicenseAgreement="License Agreement"
-LicenseAgreement.PleaseReview="Please review the license terms before using OBS. By using this program, you acknowledge that you have read and agree to the terms of the GNU General Public License v2.0. Please scroll down to see the rest of the agreement."
-LicenseAgreement.ClickIAgreeToContinue="If you accept the terms of the agreement, click I Agree to continue. You must accept the agreement to use OBS."
+LicenseAgreement.PleaseReview="Please review the license terms before using EBS. By using this program, you acknowledge that you have read and agree to the terms of the GNU General Public License v2.0. Please scroll down to see the rest of the agreement."
+LicenseAgreement.ClickIAgreeToContinue="If you accept the terms of the agreement, click I Agree to continue. You must accept the agreement to use EBS."
LicenseAgreement.IAgree="I Agree"
LicenseAgreement.Exit="Exit"
# remux dialog
-Remux.SourceFile="OBS Recording"
+Remux.SourceFile="EBS Recording"
Remux.TargetFile="Target File"
Remux.Remux="Remux"
-Remux.OBSRecording="OBS Recording"
+Remux.OBSRecording="EBS Recording"
Remux.FinishedTitle="Remuxing finished"
Remux.Finished="Recording remuxed"
Remux.FinishedError="Recording remuxed, but the file may be incomplete"
-Remux.SelectRecording="Select OBS Recording …"
+Remux.SelectRecording="Select EBS Recording …"
Remux.SelectTarget="Select target file …"
Remux.FileExistsTitle="Target file exists"
Remux.FileExists="Target file exists, do you want to replace it?"
@@ -705,7 +705,7 @@ Basic.Settings.Audio.MeterDecayRate.Fast="Fast"
Basic.Settings.Audio.MeterDecayRate.Medium="Medium (Type I PPM)"
Basic.Settings.Audio.MeterDecayRate.Slow="Slow (Type II PPM)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="WARNING: Surround sound audio is enabled."
-Basic.Settings.Audio.MultichannelWarning="If streaming, check to see if your streaming service supports both surround sound ingest and surround sound playback. Twitch, Facebook 360 Live, Mixer RTMP, Smashcast are examples where surround sound is fully supported. Although Facebook Live and YouTube Live both accept surround ingest, Facebook Live downmixes to stereo, and YouTube Live plays only two channels.\n\nOBS audio filters are compatible with surround sound, though VST plugin support isn't guaranteed."
+Basic.Settings.Audio.MultichannelWarning="If streaming, check to see if your streaming service supports both surround sound ingest and surround sound playback. Twitch, Facebook 360 Live, Mixer RTMP, Smashcast are examples where surround sound is fully supported. Although Facebook Live and YouTube Live both accept surround ingest, Facebook Live downmixes to stereo, and YouTube Live plays only two channels.\n\nEBS audio filters are compatible with surround sound, though VST plugin support isn't guaranteed."
Basic.Settings.Audio.MultichannelWarning.Title="Enable surround sound audio?"
Basic.Settings.Audio.MultichannelWarning.Confirm="Are you sure you want to enable surround sound audio?"
Basic.Settings.Audio.DesktopDevice="Desktop Audio Device"
diff --git a/UI/data/locale/es-ES.ini b/UI/data/locale/es-ES.ini
index ac279b076..df65678e9 100644
--- a/UI/data/locale/es-ES.ini
+++ b/UI/data/locale/es-ES.ini
@@ -78,6 +78,8 @@ None="Ninguno"
StudioMode.Preview="Vista previa"
StudioMode.Program="Programa"
ShowInMultiview="Mostrar en vista múltiple"
+VerticalLayout="Interfaz Vertical"
+Group="Grupo"
AlreadyRunning.Title="OBS ya se está ejecutando"
AlreadyRunning.Text="¡OBS ya se está ejecutando! A no ser que quieras hacer esto, por favor, cierra todas las ventanas de OBS antes de intentar iniciar una nueva. Si tienes configurado OBS para que se minimize a la barra de tareas, prueba a ver si sigue ejecutándose ahí."
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="Deteniendo la reproducción del búfer..."
Basic.Main.StopStreaming="Detener Transmisión"
Basic.Main.StoppingStreaming="Deteniendo la trasmisión..."
Basic.Main.ForceStopStreaming="Parar Transmisión (descartar retardo)"
+Basic.Main.Group="Grupo %1"
+Basic.Main.GroupItems="Agrupar los elementos seleccionados"
+Basic.Main.Ungroup="Desagrupar"
Basic.MainMenu.File="&Archivo"
Basic.MainMenu.File.Export="&Exportar"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="&Herramientas"
Basic.MainMenu.Help="&Ayuda"
Basic.MainMenu.Help.HelpPortal="Ayuda (&P)"
Basic.MainMenu.Help.Website="Visitar Sitio &Web"
+Basic.MainMenu.Help.Discord="Unirse a un servidor &Discord"
Basic.MainMenu.Help.Logs="&Archivos de registro"
Basic.MainMenu.Help.Logs.ShowLogs="Mostrar archivo&s de registro"
Basic.MainMenu.Help.Logs.UploadCurrentLog="Carga &de archivo de registro actual"
Basic.MainMenu.Help.Logs.UploadLastLog="Carga del &último archivo de registro"
Basic.MainMenu.Help.Logs.ViewCurrentLog="&Ver registro actual"
Basic.MainMenu.Help.CheckForUpdates="Comprobar Actualizaciones"
+Basic.MainMenu.Help.CrashLogs="Informes de &error"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="&Mostrar informes de error"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="Subir el &último informe de error"
Basic.Settings.ProgramRestart="El programa debe reiniciarse para que esta configuración surta efecto."
Basic.Settings.ConfirmTitle="Confirmar cambios"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Minimizar siempre en la bandeja d
Basic.Settings.General.SaveProjectors="Guardar los proyectores al salir"
Basic.Settings.General.SwitchOnDoubleClick="Transición a la escena cuando se hace doble clic"
Basic.Settings.General.StudioPortraitLayout="Habilitar la disposición horizontal/vertical"
+Basic.Settings.General.Multiview="Vista Múltiple"
+Basic.Settings.General.Multiview.MouseSwitch="Click para cambiar entre escenas"
+Basic.Settings.General.Multiview.DrawSourceNames="Mostrar nombres de las escenas"
+Basic.Settings.General.Multiview.DrawSafeAreas="Dibujar áreas seguras (EBU R 95)"
Basic.Settings.General.MultiviewLayout="Prueba de multivisión"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontal, parte superior"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontal, parte inferior"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertical, izquierda"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertical, derecha"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontal, superior (8 Escenas)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontal, inferior (8 Escenas)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertical, izquierda (8 Escenas)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertical, derecha (8 Escenas)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Horizontal, superior (24 Escenas)"
Basic.Settings.Stream="Emision"
Basic.Settings.Stream.StreamType="Tipo de Emision"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="Tasa de decaimiento del medidor de audio"
Basic.Settings.Audio.MeterDecayRate.Fast="Rápida"
Basic.Settings.Audio.MeterDecayRate.Medium="Media (PPM de tipo I)"
Basic.Settings.Audio.MeterDecayRate.Slow="Lenta (PPM de tipo II)"
+Basic.Settings.Audio.PeakMeterType="Tipo de medidor de pico"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Pico de muestra"
+Basic.Settings.Audio.PeakMeterType.TruePeak="True Peak (mayor uso de CPU)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="ADVERTENCIA: el audio de sonido envolvente está habilitado."
Basic.Settings.Audio.MultichannelWarning="Si se está transmitiendo, compruebe si su servicio de transmisión admite la ingesta de sonido envolvente y la reproducción de sonido envolvente. Twitch, Facebook 360 Live, Mixer RTMP, Smashcast son ejemplos en los que el sonido envolvente es totalmente compatible. Aunque Facebook Live y YouTube Live aceptan la ingesta surround, Facebook Live mezcla a estéreo y YouTube Live solo reproduce dos canales.\n\nLos filtros de audio OBS son compatibles con sonido envolvente, aunque no se garantiza el soporte de complementos VST."
Basic.Settings.Audio.MultichannelWarning.Title="¿Habilitar el audio de sonido envolvente?"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="Red"
Basic.Settings.Advanced.Network.BindToIP="Enlazar con IP"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Habilitar el nuevo código de red"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Modo de baja latencia"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Deshabilitar teclas de acceso rápido cuando la ventana principal se encuentre activa"
Basic.AdvAudio="Propiedades de Audio avanzadas"
Basic.AdvAudio.Name="Nombre"
@@ -749,3 +767,12 @@ OutputWarnings.MP4Recording="ADVERTENCIA: Las grabaciones guardadas en MP4 será
FinalScene.Title="Eliminar escena"
FinalScene.Text="Debe haber al menos una escena."
+NoSources.Title="Sin recursos"
+NoSources.Text="Parece que no has añadido ningún recurso de vídeo aún, así que estarás emitiendo una pantalla en blanco. ¿Estás seguro de que quieres hacer esto?"
+NoSources.Text.AddSource="Puedes añadir recursos haciendo click en el icono de \"+\" debajo del menú Recursos en la ventana principal en cualquier momento."
+
+ChangeBG="Establecer color"
+CustomColor="Color personalizado"
+
+BrowserSource.EnableHardwareAcceleration="Habilitar Aceleración de Hardware de Recurso en el Navegador"
+
diff --git a/UI/data/locale/et-EE.ini b/UI/data/locale/et-EE.ini
index 75a3c842f..694f6ada2 100644
--- a/UI/data/locale/et-EE.ini
+++ b/UI/data/locale/et-EE.ini
@@ -31,6 +31,7 @@ DroppedFrames="Vahele jäetud kaadreid %1 (%2%)"
PreviewProjector="Projektor täisekraanil (eelvaade)"
SceneProjector="Projektor täisekraanil (stseen)"
SourceProjector="Projektor täisekraanil (allikas)"
+MultiviewProjector="Mitmikvaade (täisekraanil)"
Clear="Eemalda"
Revert="Tühista"
Show="Näita"
@@ -59,20 +60,30 @@ Export="Ekspordi"
Copy="Kopeeri"
Paste="Kleebi"
PasteReference="Kleebi (Viide)"
+PasteDuplicate="Kleebi (Koopia)"
Next="Edasi"
Back="Tagasi"
+StudioMode.Preview="Eelvaade"
AlreadyRunning.Title="OBS juba töötab"
+BandwidthTest.Region.US="Ameerika Ühendriigid"
+BandwidthTest.Region.EU="Euroopa"
+BandwidthTest.Region.Asia="Aasia"
+BandwidthTest.Region.Other="Muu"
+Basic.AutoConfig.ApplySettings="Rakenda muutused"
Basic.AutoConfig.StreamPage.Service="Teenus"
Basic.AutoConfig.StreamPage.Server="Server"
+Basic.AutoConfig.StreamPage.StreamKey="Voogedastuse võti"
Basic.AutoConfig.StreamPage.StreamKey.LinkToSite="(Link)"
+Basic.Stats="Statistika"
Basic.Stats.CPUUsage="CPU kasutus"
Basic.Stats.Status.Inactive="Inaktiivne"
+Basic.Stats.Bitrate="Bitikiirus"
Updater.Title="Uus värskendus saadaval"
Updater.Text="Uus värskendus on saadaval:"
@@ -465,3 +476,6 @@ Mute="Vaigista"
+
+
+
diff --git a/UI/data/locale/eu-ES.ini b/UI/data/locale/eu-ES.ini
index 4e80c29b0..51e163d2e 100644
--- a/UI/data/locale/eu-ES.ini
+++ b/UI/data/locale/eu-ES.ini
@@ -78,6 +78,8 @@ None="Gabe"
StudioMode.Preview="Aurreikusi"
StudioMode.Program="Programa"
ShowInMultiview="Erakutsi ikuspegi anitzean"
+VerticalLayout="Diseinu bertikala"
+Group="Taldea"
AlreadyRunning.Title="OBS dagoeneko martxan dago"
AlreadyRunning.Text="OBS dagoeneko martxan dago! Bestelakorik nahi ez baduzu Itxi irekita dagoen saioa beste saio bat ireki baino lehen. Ezarri baduzu OBS agertzea minimizatua sistemaren erretiluan begiratu eta oraindik exekutatzen ari den bertan."
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="Erreprodukzio bufferra gelditzen..."
Basic.Main.StopStreaming="Gelditu transmisioa"
Basic.Main.StoppingStreaming="Transmisioa gelditzen..."
Basic.Main.ForceStopStreaming="Gelditu transmisioa (baztertu atzerapena)"
+Basic.Main.Group="%1 taldea"
+Basic.Main.GroupItems="Batu hautatutako elementuak"
+Basic.Main.Ungroup="Banatu"
Basic.MainMenu.File="&Fitxategia"
Basic.MainMenu.File.Export="&Esportatu"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="&Tresnak"
Basic.MainMenu.Help="&Laguntza"
Basic.MainMenu.Help.HelpPortal="Laguntza ataria"
Basic.MainMenu.Help.Website="Ikusi &webgunea"
+Basic.MainMenu.Help.Discord="Bat egin Discord zerbitzariarekin"
Basic.MainMenu.Help.Logs="&Egunkari-fitxategiak"
Basic.MainMenu.Help.Logs.ShowLogs="&Erakutsi egunkari-fitxategiak"
Basic.MainMenu.Help.Logs.UploadCurrentLog="Kargatu &uneko egunkari-fitxategiak"
Basic.MainMenu.Help.Logs.UploadLastLog="Kargatu &azken egunkari-fitxategia"
Basic.MainMenu.Help.Logs.ViewCurrentLog="&Ikusi uneko egunkari-fitxategia"
Basic.MainMenu.Help.CheckForUpdates="Begiratu eguneraketak"
+Basic.MainMenu.Help.CrashLogs="Matxuren jakinarazpenak"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="Erakutsi matxuren jakinarazpenak"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="Kargatu azken matxura jakinarazpena"
Basic.Settings.ProgramRestart="Programa berrabiarazi egin behar da ezarpen hauek eragina izateko."
Basic.Settings.ConfirmTitle="Baieztatu aldaketak"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Minimizatu beti sistemaren erreti
Basic.Settings.General.SaveProjectors="Gorde proiekzioak irtetean"
Basic.Settings.General.SwitchOnDoubleClick="Aldatu eszena klik bikoitza egitean"
Basic.Settings.General.StudioPortraitLayout="Gaitu diseinu horizontala/bertikala"
+Basic.Settings.General.Multiview="Ikuspegi anitza"
+Basic.Settings.General.Multiview.MouseSwitch="Klikatu eszena batetik bestera pasatzeko"
+Basic.Settings.General.Multiview.DrawSourceNames="Erakutsi eszenen izenak"
+Basic.Settings.General.Multiview.DrawSafeAreas="Markatu area seguruak (EBU R 95)"
Basic.Settings.General.MultiviewLayout="Ikuspegi anitzeko diseinua"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontala, goian"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontala, behean"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Bertikala, ezkerrean"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Bertikala, eskuinean"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontala, goian (8 eszena)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontala, behean (8 eszena)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Bertikala, ezkerrean (8 eszena)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Bertikala, eskuinean (8 eszena)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Horizontala, goian (24 eszena)"
Basic.Settings.Stream="Transmisioa"
Basic.Settings.Stream.StreamType="Transmisio-mota"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="Audio neurtzailearen gutxiagotze-tasa"
Basic.Settings.Audio.MeterDecayRate.Fast="Azkarra"
Basic.Settings.Audio.MeterDecayRate.Medium="Tartekoa (I motako PPMa)"
Basic.Settings.Audio.MeterDecayRate.Slow="Geldoa (II motako PPMa)"
+Basic.Settings.Audio.PeakMeterType="Gailurren neurgailu mota"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Lagin-gailurra"
+Basic.Settings.Audio.PeakMeterType.TruePeak="Benetako gailurra (CPUaren erabilera handiagoa)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="Kontu: soinu inguratzailea aktibatuta dago."
Basic.Settings.Audio.MultichannelWarning="Transmititzen ari bazara, begiratu ea zure transmisio zerbitzuak onartzen duen soinu inguratzailea sarrerako soinuan zein irteerakoan. Twitch, Facebook 360 LIve, Mixer RTMP, Samashcast esate baterako guztiz onartzen dute soinu inguratzailea. Facebook Live eta Youtube Live sarrerako soinu inguratzailea onartzen badute ere, Facebook Livek estereo bihurtzen du, eta Youtube Livek bakarrik bi kanal erreproduzitzen ditu.\n\nOBS audio iragazkiak soinu inguratzailearekin bateragarriak badira ere, ezin da bermatu VST pluginaren bateragarritasuna."
Basic.Settings.Audio.MultichannelWarning.Title="Nahi duzu soinu inguratzailea aktibatzea?"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="Sarea"
Basic.Settings.Advanced.Network.BindToIP="IP bidez lotu"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Gaitu sare kode berria"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Latentzia txikiko modua"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Desgaitu laster-teklak leiho nagusia fokuan dagoenean"
Basic.AdvAudio="Audio propietate aurreratuak"
Basic.AdvAudio.Name="Izena"
@@ -749,3 +767,12 @@ OutputWarnings.MP4Recording="Kontuz: MP4 formatuz gordetako grabazioak izan dait
FinalScene.Title="Ezabatu eszena"
FinalScene.Text="Gutxienez eszena bat egon behar du."
+NoSources.Title="Iturbururik ez dago"
+NoSources.Text="Badirudi ez duzula gehitu bideo iturbururik oraindik, beraz emaitza pantaila huts bat izango da. Ziur zaude hau egin nahi duzula?"
+NoSources.Text.AddSource="Gehitzen ahal duzu iturburuak Iturburuak kutxako azpiko aldeko + ikonoa klikatuz edozein unetan."
+
+ChangeBG="Ezarri kolorea"
+CustomColor="Kolore pertsonalizatua"
+
+BrowserSource.EnableHardwareAcceleration="Gaitu nabigatzailearen iturburuko hardware azelerazioa"
+
diff --git a/UI/data/locale/fa-IR.ini b/UI/data/locale/fa-IR.ini
new file mode 100644
index 000000000..8593961fe
--- /dev/null
+++ b/UI/data/locale/fa-IR.ini
@@ -0,0 +1,148 @@
+
+
+OK="باشه"
+Apply="اعمال تغییرات"
+Cancel="لغو"
+Close="ببند"
+Save="ذخیره"
+Discard="دور انداختن"
+Disable="غیرفعال کردن"
+Yes="بله"
+No="خير"
+Add="اضافه کردن"
+Remove="حذف"
+Rename="تغییر نام"
+Interact="تعامل"
+Filters="فیلتر ها"
+Properties="تنظیمات"
+MoveUp="انتقال به بالا"
+MoveDown="انتقال به پایین"
+Settings="تنظیمات"
+Display="صفحه نمایش"
+Name="نام"
+Exit="خروج"
+Mixer="میکسر"
+Browse="تغییر"
+Mono="مونو"
+Stereo="استریو"
+DroppedFrames="فریم های از دست رفته %1 (%2٪)"
+StudioProgramProjector="پروژکتور تمام صفحه (برنامه)"
+PreviewProjector="پروژکتور تمام صفحه (پیش نمایش)"
+SceneProjector="پروژکتور تمام صفحه (صحنه)"
+SourceProjector="پروژکتور تمام صفحه (منبع)"
+StudioProgramWindow="پروژکتور پنجره ای (برنامه)"
+PreviewWindow="پروژکتور پنجره ای (پیش نمایش)"
+SceneWindow="پروژکتور پنجره ای (صحنه)"
+SourceWindow="پروژکتور پنجره ای (منبع)"
+MultiviewProjector="حالت چند نمایی (تمام صفحه)"
+MultiviewWindowed="حالت چند نمایی (پنجره ای)"
+Clear="پاک کردن"
+Revert="برگرداندن"
+Show="نمایش"
+Hide="پنهان کردن"
+UnhideAll="نمایش تمام مخفی ها"
+Untitled="بدون عنوان"
+New="ایجاد"
+Duplicate="ایجاد مشابه"
+Enable="فعال کردن"
+DisableOSXVSync="غیرفعال کردن OSX V-Sync"
+ResetOSXVSyncOnExit="تنظیم مجدد OSX V-Sync هنگام خروج"
+HighResourceUsage="کد گذاری بیش از حد ! توجه کنید که تنظیمات ویدئویی را تغییر بدهید یا از یک پریست کد گذاری سریع تر استفاده کنید ."
+
+
+
+
+
+Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="استفاده از فعلی (%1x%2)"
+Basic.AutoConfig.VideoPage.BaseResolution.Display="صفحه نمایش %1 (%2x%3)"
+Basic.AutoConfig.VideoPage.FPS.UseCurrent="استفاده از فعلی (%1)"
+Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="یا ۶۰ یا ۳۰ ، اما ۶۰ را ترجیح می دهم"
+Basic.AutoConfig.VideoPage.FPS.PreferHighRes="یا ۶۰ یا ۳۰ ، اما وضوح بالا را ترجیح می دهم"
+Basic.AutoConfig.VideoPage.CanvasExplanation="نکته : اندازه محیط (پایه) لزوما همان اندازه ای نیست که با آن پخش زنده یا ضبط می کنید . اندازه واقعی پخش زنده/ضبط شما ممکن است برای کاهش استفاده از منابع و یا میزان درخواست بیت بر ثانیه (بیت ریت) کمتر باشد ."
+Basic.AutoConfig.StreamPage="اطلاعات پخش زنده"
+Basic.AutoConfig.StreamPage.SubTitle="لطفا اطلاعات پخش زنده خود را وارد کنید"
+Basic.AutoConfig.StreamPage.Service="سرویس"
+Basic.AutoConfig.StreamPage.Service.ShowAll="نمایش همه..."
+Basic.AutoConfig.StreamPage.Server="سرور"
+Basic.AutoConfig.StreamPage.StreamKey="کلید پخش زنده"
+Basic.AutoConfig.StreamPage.StreamKey.LinkToSite="(لینک)"
+Basic.AutoConfig.StreamPage.PerformBandwidthTest="برآورد میزان بیت بر ثانیه (بیت ریت) با تست پهنای باند (ممکن است چند دقیقه طول بکشد)"
+Basic.AutoConfig.StreamPage.PreferHardwareEncoding="کد گذاری سخت افزاری را ترجیح می دهم"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UI/data/locale/fi-FI.ini b/UI/data/locale/fi-FI.ini
index d9b37b4f4..8e72cbcb4 100644
--- a/UI/data/locale/fi-FI.ini
+++ b/UI/data/locale/fi-FI.ini
@@ -78,6 +78,8 @@ None="Ei mitään"
StudioMode.Preview="Esikatselu"
StudioMode.Program="Ohjelma"
ShowInMultiview="Näytä moninäkymässä"
+VerticalLayout="Pystynäkymä"
+Group="Ryhmitä"
AlreadyRunning.Title="OBS on jo käynnissä"
AlreadyRunning.Text="OBS on jo käynnissä! Ellet tarkoittanut tehdä näin, ole hyvä ja sulje aikaisemmat OBS-prosessit ennen uuden käynnistämistä. Jos olet asettanut OBS:n pienentymään ilmaisinalueelle, varmista ettei se ole siellä yhä päällä."
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="Pysäytetään toistopuskuri..."
Basic.Main.StopStreaming="Pysäytä lähetys"
Basic.Main.StoppingStreaming="Pysäytetään lähetystä..."
Basic.Main.ForceStopStreaming="Lopeta lähetys (ohita viive)"
+Basic.Main.Group="Ryhmitä %1"
+Basic.Main.GroupItems="Ryhmitä valitut lähteet"
+Basic.Main.Ungroup="Poista ryhmästä"
Basic.MainMenu.File="&Tiedosto"
Basic.MainMenu.File.Export="&Vie"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="T&yökalut"
Basic.MainMenu.Help="&Apua"
Basic.MainMenu.Help.HelpPortal="&Apukeskus"
Basic.MainMenu.Help.Website="Käy &verkkosivulla"
+Basic.MainMenu.Help.Discord="Liity &Discord-palvelimelle"
Basic.MainMenu.Help.Logs="&Lokitiedostot"
Basic.MainMenu.Help.Logs.ShowLogs="&Näytä lokitiedostot"
Basic.MainMenu.Help.Logs.UploadCurrentLog="Lähetä n&ykyinen lokitiedosto"
Basic.MainMenu.Help.Logs.UploadLastLog="Lähetä edellinen lokitiedosto"
Basic.MainMenu.Help.Logs.ViewCurrentLog="Näytä ny&kyinen loki"
Basic.MainMenu.Help.CheckForUpdates="Tarkista päivitykset"
+Basic.MainMenu.Help.CrashLogs="&Kaatumisraportit"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="&Näytä kaatumisraportit"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="&Lähetä kaatumisraportti"
Basic.Settings.ProgramRestart="Ohjelma on käynnistettävä uudelleen, jotta asetukset tulevat voimaan."
Basic.Settings.ConfirmTitle="Vahvista muutokset"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Pienennä aina tilapalkkiin teht
Basic.Settings.General.SaveProjectors="Tallenna peilaus poistuessa"
Basic.Settings.General.SwitchOnDoubleClick="Siirtymä skeneen tuplaklikattaessa"
Basic.Settings.General.StudioPortraitLayout="Ota pystyasettelu käyttöön"
+Basic.Settings.General.Multiview="Moninäkymä"
+Basic.Settings.General.Multiview.MouseSwitch="Klikkaa vaihtaaksesi skenejen välillä"
+Basic.Settings.General.Multiview.DrawSourceNames="Näytä skenejen nimet"
+Basic.Settings.General.Multiview.DrawSafeAreas="Piirrä turva-alueet (EBU R 95)"
Basic.Settings.General.MultiviewLayout="Moninäkymän asettelu"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Vaaka, ylhäällä"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Vaaka, alhaalla"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Pysty, vasemmalla"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Pysty, oikealla"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Vaakasuunta, ylhäällä (8 skeneä)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Vaakasuunta, alhaalla (8 skeneä)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Pystysuunta, vasemmalla (8 skeneä)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Pystysuunta, oikealla (8 skeneä)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Vaakasuunta, ylhäällä (24 skeneä)"
Basic.Settings.Stream="Lähetys"
Basic.Settings.Stream.StreamType="Lähetystyyppi"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="Äänimittarin putoamisnopeus"
Basic.Settings.Audio.MeterDecayRate.Fast="Nopea"
Basic.Settings.Audio.MeterDecayRate.Medium="Keskinopea (Tyyppi I PPM)"
Basic.Settings.Audio.MeterDecayRate.Slow="Hidas (Tyyppi II PPM)"
+Basic.Settings.Audio.PeakMeterType="Huippuarvo-mittarin tyyppi"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Huippuarvon näyte"
+Basic.Settings.Audio.PeakMeterType.TruePeak="Todellinen huippuarvo (Korkeampi CPU:n käyttö)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="VAROITUS: Monikanavaääni on käytössä."
Basic.Settings.Audio.MultichannelWarning="Varmista lähettäessä että palvelu tukee sekä monikanavaäänen lähettämistä, että toistamista. Twitch, Facebook 360 Live, Mixer RTMP ja Smashcast ovat esimerkkejä palveluista joissa monikanavaääni on täysin tuettu. Vaikka Facebook Live ja YouTube Live hyväksyvät monikanavaäänen lähettämisen, Facebook Live miksaa äänen stereoksi ja YouTube Live toistaa vain kaksi kanavaa.\n\nOBS:n äänisuodattimet tukevat monikanavaääntä, mutta VST-liitännäiset eivät välttämättä tue."
Basic.Settings.Audio.MultichannelWarning.Title="Käytä monikanava-ääntä?"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="Verkko"
Basic.Settings.Advanced.Network.BindToIP="Liitä IP:seen"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Käytä uutta verkkokoodia"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Alhaisen latenssin tila"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Poista pikanäppäimet käytöstä, kun pääikkuna on aktiivisena"
Basic.AdvAudio="Äänen lisäominaisuudet"
Basic.AdvAudio.Name="Nimi"
@@ -749,3 +767,12 @@ OutputWarnings.MP4Recording="Varoitus: MP4-muotoon tallentaessa tiedostoista tul
FinalScene.Title="Poista skene"
FinalScene.Text="Ainakin yksi skene pitää olla olemassa."
+NoSources.Title="Ei lähteitä"
+NoSources.Text="Näyttää siltä ettet ole vielä lisännyt yhtään kuvalähdettä, joten kuva on musta. Haluatko varmasti tehdä näin?"
+NoSources.Text.AddSource="Voit lisätä lähteitä klikkaamalla \"+\"-kuvaketta \"Lähteet\"-alueen alapuolella."
+
+ChangeBG="Aseta väri"
+CustomColor="Mukautettu väri"
+
+BrowserSource.EnableHardwareAcceleration="Käytä laitteistokiihdytystä \"Selain\"-lähteessä"
+
diff --git a/UI/data/locale/fil-PH.ini b/UI/data/locale/fil-PH.ini
new file mode 100644
index 000000000..80ec52996
--- /dev/null
+++ b/UI/data/locale/fil-PH.ini
@@ -0,0 +1,753 @@
+
+
+OK="Sige"
+Apply="Ilagay"
+Cancel="Kanselahin"
+Close="Sarado"
+Save="Mag-impok"
+Discard="Ialis"
+Disable="Huwag paganahin"
+Yes="Oo"
+No="Hindi"
+Add="Idagdag"
+Remove="Tanggalin"
+Rename="Baguhin ang pangalan"
+Interact="Makipag-ugnayan"
+Filters="Mga salaan"
+Properties="Mga pag-aari"
+MoveUp="Gumalaw pataas"
+MoveDown="Bumaba"
+Settings="Mga pagtatakda"
+Display="Ipamalas"
+Name="Pangalan"
+Exit="Labasan"
+Mixer="Panghalo"
+Browse="Supling"
+Mono="Mono"
+Stereo="Stereo"
+DroppedFrames="Bumaba ang mga frame %1 (%2%)"
+StudioProgramProjector="Fullscreen Projector (Programa)"
+PreviewProjector="Fullscreen Projector (Preview)"
+SceneProjector="Fullsreen Projector (Eksena)"
+SourceProjector="Fullscreen Projector (Pinagmulan)"
+StudioProgramWindow="Windowed Projector (Programa)"
+PreviewWindow="Windowed Projector (Preview)"
+SceneWindow="Windowed Projector (Eksena)"
+SourceWindow="Windowed Projector (Pinagmulan)"
+MultiviewProjector="Multiview (Fullscreen)"
+MultiviewWindowed="Multiview (Windowed)"
+Clear="Linisin"
+Revert="Ibalik"
+Show="Ipakita"
+Hide="Itago"
+UnhideAll="Huwag itago lahat"
+Untitled="Walang pamagat"
+New="Bago"
+Duplicate="Katulad"
+Enable="Paganahin"
+DisableOSXVSync="Huwag Paganahin OSX V-Sync"
+ResetOSXVSyncOnExit="I-reset ang OSX V-Sync sa Labasan"
+HighResourceUsage="Ang Encoding ay labis ang karga! Isaalang alang ang pagbaba ng video settings o gumamit ng mas mabilis na encoding preset."
+Transition="Paglipat"
+QuickTransitions="Mabilis na Paglipat"
+Left="Kaliwa"
+Right="Kanan"
+Top="Pinakamataas"
+Bottom="Kailaliman"
+Reset="Baguhin"
+Hours="Oras"
+Minutes="Minuto"
+Seconds="Segundo"
+Deprecated="Hindi na ginagamit"
+ReplayBuffer="Replay Buffer"
+Import="Mag-angkat"
+Export="I-export"
+Copy="Kopyahin"
+Paste="I-paste"
+PasteReference="I-paste (Banggit)"
+PasteDuplicate="I-paste (Pangalawang salin)"
+RemuxRecordings="Mga Pagtatala ng Remux"
+Next="Susunod"
+Back="Bumalik"
+Defaults="Mga hindi pagsipot"
+HideMixer="Itago sa panghalo"
+TransitionOverride="Override na ang Paglipat"
+None="Wala"
+StudioMode.Preview="Balikan"
+StudioMode.Program="Programa"
+ShowInMultiview="Ipakita sa Multiview"
+VerticalLayout="Patayong Layout"
+Group="Grupo"
+
+AlreadyRunning.Title="Tumatakbo na ngayon ang OBS"
+AlreadyRunning.Text="Tumatakbo na ang OBS! Maliban na lamang kung gusto mong gawin ito, pakiusap patayin ang anomang nabubuhay na mga mungkahi ng OBS bago subukang magpatakbo ng panibagong mungkahi. Kung meron kang OBS set para mabawasan ang sistemang tray, pakiusap magsiyasat para makita kung ito ay tumatakbo parin."
+AlreadyRunning.LaunchAnyway="Maglunsad parin"
+
+Copy.Filters="Kopyahin ang mga panala"
+Paste.Filters="I-paste ang mga panala"
+
+BandwidthTest.Region="Rehiyon"
+BandwidthTest.Region.US="Estados Unidos"
+BandwidthTest.Region.EU="Europa"
+BandwidthTest.Region.Asia="Asya"
+BandwidthTest.Region.Other="Iba pa"
+
+Basic.FirstStartup.RunWizard="Gusto mo bang mapatakbo ang dalubhasa sa kusang pagkonpigurasyon? Maaari mo ring mano-manuhin ang pagkonpigura ng iyong settings sa pagpindot ng Settings button sa pangunahing window."
+Basic.FirstStartup.RunWizard.BetaWarning="(Tandaan: Ang dalubhasang kusang pagkonpigurasyon ay kasalukuyang nasa beta)"
+Basic.FirstStartup.RunWizard.NoClicked="Kung magbabago ka ng isip mo, pwede mong patakbuhin ang dalubhasang kusang konpigurasyon anomang oras ulit mula sa mga kasangkapan sa menu."
+
+Basic.AutoConfig="Dalubhasang Kusang Konpigurasyon"
+Basic.AutoConfig.Beta="Dalubhasang Kusang Konpigurasyon (Beta)"
+Basic.AutoConfig.ApplySettings="Ilapat ang mga Pagtatakda"
+Basic.AutoConfig.StartPage="Paggamit ng Impormasyon"
+Basic.AutoConfig.StartPage.SubTitle="Tukuyin ang tamang program na gusto mong gamitin"
+Basic.AutoConfig.StartPage.PrioritizeStreaming="Optimize para sa streaming, pangalawa ay ang recording"
+Basic.AutoConfig.StartPage.PrioritizeRecording="Optimize para sa recording, Hindi ako mag streaming"
+Basic.AutoConfig.VideoPage="Ang mga video settings"
+Basic.AutoConfig.VideoPage.SubTitle="Tukuyin ang naayong video settings na gusto mong gamitin"
+Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="Kasulukuyang gamitin(%1x%2)"
+Basic.AutoConfig.VideoPage.BaseResolution.Display="I-Display %1 (%2x%3)"
+Basic.AutoConfig.VideoPage.FPS.UseCurrent="Pangsulukuyang Gamitin (%1)"
+Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="Sa 60 or kaya sa 30, Pero mas mabuti 60 kung maaari"
+Basic.AutoConfig.VideoPage.FPS.PreferHighRes="Sa 60 or kaya sa 30, Pero mas mabuti 60 para sa mas magandang resolusyon"
+Basic.AutoConfig.VideoPage.CanvasExplanation="Paalala: Ang kanbas (base) na ito ay hindi kinakailangan na kaparehas ng resolusyon ng iyong stream or record. Ang iyong actual stream/record na resolusyon ay maaaring pagkasyahin para sa resolusyon ng kanbas para mabawasan ang paggamit kinakailangan na bitrate."
+Basic.AutoConfig.StreamPage="Mga batis ng impormasyon"
+Basic.AutoConfig.StreamPage.SubTitle="Pakiusap ilagay ang iyong impormasyon pang stream"
+Basic.AutoConfig.StreamPage.Service="Serbisyo"
+Basic.AutoConfig.StreamPage.Service.ShowAll="Ipakita lahat..."
+Basic.AutoConfig.StreamPage.Server="Serber"
+Basic.AutoConfig.StreamPage.StreamKey="Ang susi ng iyong stream"
+Basic.AutoConfig.StreamPage.StreamKey.LinkToSite="(link)"
+Basic.AutoConfig.StreamPage.PerformBandwidthTest="I-estima ang bitrate kasama ang pag eksamina ng bandwidth (maaaring tumagal ng ilang minuto)"
+Basic.AutoConfig.StreamPage.PreferHardwareEncoding="Piliin ang hardware encoding"
+Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="Ang Hardware Encoding ay tinatanggal lahat ng nagamit na CPU, pero kailangan ng mas maraming bitrate para makuha ang parehong lebel ng kalidad"
+Basic.AutoConfig.StreamPage.StreamWarning.Title="Babala sa pag stream"
+Basic.AutoConfig.StreamPage.StreamWarning.Text="Ang bandwidth test ay tungkol sa stream randomized bidyo data at walang audio sa iyong channel. Kung maaari, mas inirerekomenda na pansamantalang i-off ang pag save ng vides of streams at itakda sa pribado hanggang matapos makumpleto ang pag eksamin"
+Basic.AutoConfig.TestPage="Huling Resulta"
+Basic.AutoConfig.TestPage.SubTitle.Testing="Ang program na ito ay isinasagawa ang mga set para eksamin para matantiya ang pinakamainam na settings"
+Basic.AutoConfig.TestPage.SubTitle.Complete="Ang iyong pagsusuri ay kumpleto na"
+Basic.AutoConfig.TestPage.TestingBandwidth="Pagsasagawa ng bandwidth test, ito ay maaaring tumagal ng ilang minuto..."
+Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="Kumukunekta sa: %1..."
+Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="Bigong kumunekta sa alin mang server, paki tignan ang koneksyon ng iyong internet at subukan ulet."
+Basic.AutoConfig.TestPage.TestingBandwidth.Server="Pagsusuri ng bandwidth para sa: %1"
+Basic.AutoConfig.TestPage.TestingStreamEncoder="Testingin ang stream encoder, ito ay maaaring tumagal ng isang minuto..."
+Basic.AutoConfig.TestPage.TestingRecordingEncoder="Testingin ang recording encoder, ito ay maaaring tumagal ng isang minuto..."
+Basic.AutoConfig.TestPage.TestingRes="Testingin ang resolusyon, ito ay maaaring tumagal ng ilang minuto..."
+Basic.AutoConfig.TestPage.TestingRes.Fail="Bigong iandar ang encoder"
+Basic.AutoConfig.TestPage.TestingRes.Resolution="Testingin %1x%2 %3 FPS..."
+Basic.AutoConfig.TestPage.Result.StreamingEncoder="Streaming Encoder"
+Basic.AutoConfig.TestPage.Result.RecordingEncoder="Recording Encoder"
+Basic.AutoConfig.TestPage.Result.Header="Ang program na ito ay napagkaisahan na ang settings tinatayang lahat ay perpekto para sayo:"
+Basic.AutoConfig.TestPage.Result.Footer="Para sa pag gamit ng settings, pindutin ang Apply Settings. Para ma reconfigure ang wizard at simulan muli, pindutin ang Back. Mano-mano i-configure ang settings, at pindutin ang Cancel at buksan ang Settings."
+
+Basic.Stats="Ang mga Statisktika"
+Basic.Stats.CPUUsage="Ang nagamit na CPU"
+Basic.Stats.HDDSpaceAvailable="Ang magagamit na espasyo ng HDD"
+Basic.Stats.MemoryUsage="Ang nagamit na Memory"
+Basic.Stats.AverageTimeToRender="Ang average time para ma render ang frame"
+Basic.Stats.SkippedFrames="Laktawin ang frames dahil sa encoding lag"
+Basic.Stats.MissedFrames="Nalampasan ang frames dahil sa rendering lag"
+Basic.Stats.Output.Stream="Stream"
+Basic.Stats.Output.Recording="Recording"
+Basic.Stats.Status="Ang estado"
+Basic.Stats.Status.Recording="Recording"
+Basic.Stats.Status.Live="Naka LIVE"
+Basic.Stats.Status.Reconnecting="Muling kumukonekta"
+Basic.Stats.Status.Inactive="Hindi na aktiba"
+Basic.Stats.DroppedFrames="Naihulog na Frames (Network)"
+Basic.Stats.MegabytesSent="Ang total na Data Output"
+Basic.Stats.Bitrate="Bitrate"
+
+Updater.Title="May bagong update na available"
+Updater.Text="May bagong update na magagamit:"
+Updater.UpdateNow="Mag update ngayon"
+Updater.RemindMeLater="Paalalahanan mo ako mamaya"
+Updater.Skip="Laktawan ang Bersyon"
+Updater.Running.Title="Programa na kasalukuyang aktibo"
+Updater.Running.Text="Ang mga output ay kasalukuyang aktibo, mangyaring i-shut down ang anumang mga aktibong output bago sinusubukang i-update"
+Updater.NoUpdatesAvailable.Title="Walang magagamit na mga update"
+Updater.NoUpdatesAvailable.Text="Walang mga update ang kasalukuyang magagamit"
+Updater.FailedToLaunch="Nabigong ilunsad ang updater"
+Updater.GameCaptureActive.Title="Kumuha ng laro na aktibo"
+Updater.GameCaptureActive.Text="Kasalukuyang nakukuha sa library ang pagkuha ng hook library. Mangyaring isara ang anumang mga laro / programa na nakukuha (o i-restart ang mga bintana) at subukang muli."
+
+QuickTransitions.SwapScenes="Swap Preview / Output Scenes Pagkatapos Transitioning"
+QuickTransitions.SwapScenesTT="Mag swap ng mga preview at output scenes matapos ang transitioning (Kung may orihinal na output scene na umiiral).\nIto ay hindi pwede baguhin ang orihinal na eksena."
+QuickTransitions.DuplicateScene="Gayahin ang eksena"
+QuickTransitions.DuplicateSceneTT="Kung mag i-edit ng parehas na eksena. pinapayag ang editing transform/visibility of sources kahit baguhin ang output.\nPara ma edit ang properties wag baguhin ang output, paganahin 'Duplicate Sources'.\nAng pagbago ng kalidad nito ay maaaring ma reset ang eksena (kung ito ay umiiral pa rin)."
+QuickTransitions.EditProperties="Gayahin ang mga pinagmulang"
+QuickTransitions.EditPropertiesTT="Kung mag i-edit ng kaparehas na eksena. payagan mag edit ng katangian ng mga pinagkukunan nang hindi binabago ang output.\nIto ay magagamit king 'Duplicate Scene' ay pinagana.\nAng mga pinagkukunan(gaya ng nakuhang media sources) hindi suportado at di pwede ma edit nang hiwalay.\nAng pagbago ng value nito ay maaaring ma reset ang kasulukuyang output scene(kung mayroon pa).\n\nBabala: Dahil sa pinagkukunan ay magiging doble, ito ay nangangailangan ng ekstrang sistema or video pagkukunan."
+QuickTransitions.HotkeyName="Ilipat ng mabilis: %1"
+
+Basic.AddTransition="Magdagdag ng configurable na transisyon"
+Basic.RemoveTransition="Tangalin ang configurable transition"
+Basic.TransitionProperties="Mga Properties ng Transisyon"
+Basic.SceneTransitions="Mga transisyon ng mga eksena"
+Basic.TransitionDuration="Katagalan"
+Basic.TogglePreviewProgramMode="Ang Studio Mode"
+
+TransitionNameDlg.Text="Pakilagay ang pangalan ng transisyon"
+TransitionNameDlg.Title="Pangalan ng Transisyon"
+
+TitleBar.Profile="Ang Profile"
+TitleBar.Scenes="Ang mga Eksena"
+
+NameExists.Title="Ang pangalan ay umiiral na"
+NameExists.Text="Ang pangalan ay nagamit na."
+
+NoNameEntered.Title="Pakilagay ang balidong pangalan"
+NoNameEntered.Text="Hindi pwede gumamit ng walang pangalan."
+
+ConfirmStart.Title="Magsimula ng mag Stream?"
+ConfirmStart.Text="Sigurado ka ba na simulang ang pag stream?"
+
+ConfirmStop.Title="Itigil ba ang Steam?"
+ConfirmStop.Text="Sigurado ka itigil ang pag i-stream?"
+
+ConfirmExit.Title="Lumabas sa OBS?"
+ConfirmExit.Text="Ang OBS ay kasulukuyang aktibo. Lahat ng streams/recordings ay magsasara. Sigurado ka ba gusto mong mag exit?"
+
+ConfirmRemove.Title="I-kumpirma ang pagtangal"
+ConfirmRemove.Text="Sigurado ka bang tangalin ang '$1'?"
+ConfirmRemove.TextMultiple="Sigurado ka bang tangalin %1 items?"
+
+Output.StartStreamFailed="Bigong simulang ang pag stream"
+Output.StartRecordingFailed="Bigong simulan ang pag record"
+Output.StartReplayFailed="Bigong simulang ang replay buffer"
+Output.StartFailedGeneric="Bigong simulang ang output. Pakitingnan ang talaan ng mga detalye.\n\nNote: kung ikaw ay gumagamit ng NVENC or AMD encoders, siguraduhin na nag video drivers ay naka update."
+
+Output.ConnectFail.Title="Bigung kumunekta"
+Output.ConnectFail.BadPath="Hindi wasto ang Path or ang Connection URL. Pakitingnan ang settings para ma kumpirma na ito ay pwede."
+Output.ConnectFail.ConnectFailed="Bigong kumunekta sa serber"
+Output.ConnectFail.InvalidStream="Di maka pasok sa tinutukoy na channel or stream key, pakitignan ng maayos ang stream key. Kung tama, Maaaring may problema sa pagkunekta sa serber."
+Output.ConnectFail.Error="Isang di-inaasahang error ng subukang kumunekta sa serber. Karagdagang impormasyon ay nasa log file."
+Output.ConnectFail.Disconnected="Nadiskonek mula sa serber."
+
+Output.RecordFail.Title="Bigong simulang ang pag record"
+Output.RecordFail.Unsupported="Ang output format ay maaring di suportado or di sinusuportahan ang higit sa isang audio track. Pakitingnan ang iyong settings at simulan ulet."
+Output.RecordNoSpace.Title="Hindi sapat ang iyong espasyo"
+Output.RecordNoSpace.Msg="Di sapat ang espasyo para ipatuloy ang pagrerekord."
+Output.RecordError.Title="May error sa pagrekord"
+Output.RecordError.Msg="Hindi tiyak na error habang nagrerekord."
+Output.ReplayBuffer.NoHotkey.Title="Walang set ng hotkey!"
+Output.ReplayBuffer.NoHotkey.Msg="Walang na i-save na hotkey para sa replay buffer. Paki \"Save\" ang gagamiting hotkey para ma i-save ang replay recordings."
+
+Output.BadPath.Title="Di mabuting File Path"
+Output.BadPath.Text="Ang na configured na file output path ay di di-wasto. Pakitignan ang iyong settings para ma kumpirma na balido ang file path at na i-set ito."
+
+LogReturnDialog="Ang na i-uload na log ay tagumpay"
+LogReturnDialog.CopyURL="Kupyahin ang URL"
+LogReturnDialog.ErrorUploadingLog="Error sa pag-upload ng log file"
+
+LicenseAgreement="Ang lisensya ng kasunduan"
+LicenseAgreement.PleaseReview="Pakitingnan ang lisensya bago gumamit ng OBS. Sa pag gamit ng program, kinikilala mo na nabasa at sumasang-ayon ka sa mga tuntunin nito GNU General Public License v2.0. Maaaring mag scroll down para makita ang ibang bahagi ng kasunduan."
+LicenseAgreement.ClickIAgreeToContinue="Kung iyong tinatanggap ang termino ng kasunuduan, pindutin ang I Agree to continue. Dapat sumang-ayon sa kasunduan sa pag-gamit ng OBS."
+LicenseAgreement.IAgree="Sumasang-ayon Ako"
+LicenseAgreement.Exit="Lumabas"
+
+Remux.SourceFile="Obs Recording"
+Remux.TargetFile="Target File"
+Remux.Remux="Remux"
+Remux.OBSRecording="OBS Recording"
+Remux.FinishedTitle="Tapos na ang Remuxing"
+Remux.Finished="Ang Recording remuxed"
+Remux.FinishedError="Ang Recording Remuxed, pero ang file ay hindi kumpleto"
+Remux.SelectRecording="Pumuli ng OBS Recording…"
+Remux.SelectTarget="Piliin ang gustong file …"
+Remux.FileExistsTitle="Ang napiling file any umiiral na"
+Remux.FileExists="Ang napiling file any umiiral na, gusto mo ba itong palitan?"
+Remux.ExitUnfinishedTitle="Ang remuxing ay naka progress"
+Remux.ExitUnfinished="Di pa tapos ang Remuxing, pag itigil ang render ang napiling file ay di magagamit.\nGusto mo bang huminto sa pag remuxing?"
+
+UpdateAvailable="May bagong update na available"
+UpdateAvailable.Text="Ang Version %1.%2.%3 ay available na. Pindutin para i-download"
+
+Basic.DesktopDevice1="Ang Desktop Audio"
+Basic.DesktopDevice2="Ang Desktop Audio 2"
+Basic.AuxDevice1="Ang Mic/Aux"
+Basic.AuxDevice2="Ang Mic/Aux 2"
+Basic.AuxDevice3="Ang Mic/Aux 3"
+Basic.AuxDevice4="Ang Mic/Aux 4"
+
+Basic.Scene="Eksena"
+Basic.DisplayCapture="Ang nakunan na display"
+
+Basic.Main.PreviewConextMenu.Enable="Ipakita muli ang Larawan"
+
+ScaleFiltering="I-filter iskala"
+ScaleFiltering.Point="Punto"
+ScaleFiltering.Bilinear="Bilinear"
+ScaleFiltering.Bicubic="Bicubic"
+ScaleFiltering.Lanczos="Lanczos"
+
+Deinterlacing="Deinterlacing"
+Deinterlacing.Discard="Baliwalain"
+Deinterlacing.Retro="Retro"
+Deinterlacing.Blend="I-timpla"
+Deinterlacing.Blend2x="I-timpla ng dalwang beses"
+Deinterlacing.Linear="Linear"
+Deinterlacing.Linear2x="Linear 2x"
+Deinterlacing.Yadif="Yadif"
+Deinterlacing.Yadif2x="Yadif 2x"
+Deinterlacing.TopFieldFirst="Pang unang itaas na field"
+Deinterlacing.BottomFieldFirst="Pang unang ibaba na field"
+
+VolControl.SliderUnmuted="Pandausdos ng volume para '%1': %2"
+VolControl.SliderMuted="Pandausdos ng volume para '%1': %2 (kasulukuyang naka mute)"
+VolControl.Mute="Mute '%1'"
+VolControl.Properties="Mga katangian '%1'"
+
+Basic.Main.AddSceneDlg.Title="Magdagdag ng mga eksena"
+Basic.Main.AddSceneDlg.Text="Pakiusap lagyan ng pangalan ang eksena"
+
+Basic.Main.DefaultSceneName.Text="Eksena %1"
+
+Basic.Main.AddSceneCollection.Title="Magdagdag ng Collection ng Eksena"
+Basic.Main.AddSceneCollection.Text="Mangyaring ipasok ang pangalan ng koleksyon ng eksena"
+
+Basic.Main.RenameSceneCollection.Title="I-rename ang Scene Collection"
+
+AddProfile.Title="Magdagdag ng Profile"
+AddProfile.Text="Pakipasok ang pangalan ng profile"
+
+RenameProfile.Title="Palitan ang pangalan ng Profile"
+
+Basic.Main.MixerRename.Title="Palitan ang pangalan ng Audio Source"
+Basic.Main.MixerRename.Text="Mangyaring ipasok ang pangalan ng pinagmulang audio"
+
+
+Basic.Main.PreviewDisabled="Kasalukuyang hindi pinagana ang pag-preview"
+
+Basic.SourceSelect="Lumikha / Piliin ang Pinagmulan"
+Basic.SourceSelect.CreateNew="Gumawa ng bago"
+Basic.SourceSelect.AddExisting="Magdagdag ng Umiiral na"
+Basic.SourceSelect.AddVisible="Gawing nakikita ang mapagkukunan"
+
+Basic.PropertiesWindow="Mga Properties para sa '%1'"
+Basic.PropertiesWindow.SelectColor="Pumili ng kulay"
+Basic.PropertiesWindow.SelectFont="Piliin ang font"
+Basic.PropertiesWindow.ConfirmTitle="Binago ang Mga Setting"
+Basic.PropertiesWindow.Confirm="Mayroong mga hindi nai-save na pagbabago. Gusto mo bang panatilihin ang mga ito?"
+Basic.PropertiesWindow.NoProperties="Walang magagamit na mga ari-arian"
+Basic.PropertiesWindow.AddFiles="Magdagdag ng Mga File"
+Basic.PropertiesWindow.AddDir="Magdagdag ng Direktoryo"
+Basic.PropertiesWindow.AddURL="Magdagdag ng Path / URL"
+Basic.PropertiesWindow.AddEditableListDir="Magdagdag ng direktoryo sa '%1'"
+Basic.PropertiesWindow.AddEditableListFiles="Magdagdag ng mga file sa '%1'"
+Basic.PropertiesWindow.AddEditableListEntry="Magdagdag ng entry sa '%1'"
+Basic.PropertiesWindow.EditEditableListEntry="I-edit ang entry mula sa '%1'"
+
+Basic.PropertiesView.FPS.Simple="Mga Simpleng FPS na Halaga"
+Basic.PropertiesView.FPS.Rational="Mga Rational Value FPS"
+Basic.PropertiesView.FPS.ValidFPSRanges="Mga saklaw na wastong FPS:"
+
+Basic.InteractionWindow="Nakikisalamuha... '%1'"
+
+Basic.StatusBar.Reconnecting="Nadiskonek, muling kumukonekta sa loob ng %2 segundo(s) (pagtatangka %1)"
+Basic.StatusBar.AttemptingReconnect="Sinusubukang kumunekta... (tangka %1)"
+Basic.StatusBar.ReconnectSuccessful="Matagumpay na reconnection"
+Basic.StatusBar.Delay="Pag antala (%1 segundo)"
+Basic.StatusBar.DelayStartingIn="Na antala(magsisimula %1 sec)"
+Basic.StatusBar.DelayStoppingIn="Na antala(hihinto %1 sec)"
+Basic.StatusBar.DelayStartingStoppingIn="Na antala (hihinto %1 sec, sisimula %2 sec)"
+
+Basic.Filters="Mga Filter"
+Basic.Filters.AsyncFilters="Mga Filter ng Audio / Video"
+Basic.Filters.AudioFilters="Mga Filter ng Audio"
+Basic.Filters.EffectFilters="Mga Filter ng Epekto"
+Basic.Filters.Title="Filter para sa mga '%1'"
+Basic.Filters.AddFilter.Title="Salain ang pangalan"
+Basic.Filters.AddFilter.Text="Mangyaring tukuyin ang pangalan ng filter"
+
+Basic.TransformWindow="Pagbabago ng Eksena ng Eksena"
+Basic.TransformWindow.Position="Posisyon"
+Basic.TransformWindow.Rotation="Pag-ikot"
+Basic.TransformWindow.Size="Sukat"
+Basic.TransformWindow.Alignment="Positional Alignment"
+Basic.TransformWindow.BoundsType="Bounding ng klase ng kahon"
+Basic.TransformWindow.BoundsAlignment="Ang pagkahanay ng Bounding Kahon"
+Basic.TransformWindow.Bounds="Ang Bounding Box Size"
+Basic.TransformWindow.Crop="I-crop ito"
+
+Basic.TransformWindow.Alignment.TopLeft="Sa taas na kaliwa"
+Basic.TransformWindow.Alignment.TopCenter="Sa gintang ibabaw"
+Basic.TransformWindow.Alignment.TopRight="Sa taas ng kanan"
+Basic.TransformWindow.Alignment.CenterLeft="Naiwan ang Gitna"
+Basic.TransformWindow.Alignment.Center="Gitna"
+Basic.TransformWindow.Alignment.CenterRight="Tama sa Gitna"
+Basic.TransformWindow.Alignment.BottomLeft="Babang Kaliwa"
+Basic.TransformWindow.Alignment.BottomCenter="Babang Gitna"
+Basic.TransformWindow.Alignment.BottomRight="Baba sa Kanan"
+
+Basic.TransformWindow.BoundsType.None="Walang hangganan"
+Basic.TransformWindow.BoundsType.MaxOnly="Pinakamalaki na sukat lamang"
+Basic.TransformWindow.BoundsType.ScaleInner="Sukat sa panloob na hangganan"
+Basic.TransformWindow.BoundsType.ScaleOuter="Sukat sa panlabas na hangganan"
+Basic.TransformWindow.BoundsType.ScaleToWidth="Sukat sa lapad ng hangganan"
+Basic.TransformWindow.BoundsType.ScaleToHeight="Sukat sa taas ng hangganan"
+Basic.TransformWindow.BoundsType.Stretch="Mag-stretch sa hangganan"
+
+Basic.Main.AddSourceHelp.Title="Hindi maaring magdagdag ng pinagmulan"
+Basic.Main.AddSourceHelp.Text="Kailangan mong magkaroon ng hindi bababa sa isang eksena sa pinagmulan."
+
+Basic.Main.Scenes="Mga eksena"
+Basic.Main.Sources="Pinagmulan"
+Basic.Main.Controls="Mga kontrol"
+Basic.Main.Connecting="Kumukonekta..."
+Basic.Main.StartRecording="Simula ng Pagtatala"
+Basic.Main.StartReplayBuffer="Simulan na ang pag Replay Buffer"
+Basic.Main.StartStreaming="Simulan ang mag stream"
+Basic.Main.StopRecording="Itigil ang Pagtatala"
+Basic.Main.StoppingRecording="Pagtigil sa Pagtatala..."
+Basic.Main.StopReplayBuffer="Itigil ang pag Re-replay Buffer"
+Basic.Main.StoppingReplayBuffer="Pagtigil sa Pagre-Replay Buffer..."
+Basic.Main.StopStreaming="Itiigil ang Pag-stream"
+Basic.Main.StoppingStreaming="Pagtigil sa Pag-stream..."
+Basic.Main.ForceStopStreaming="Itigil ang Pag-stream (Iwaksi ang Pagkaantala)"
+Basic.Main.Group="Grupo %1"
+Basic.Main.GroupItems="I-grupo ang napiling mga aytem"
+Basic.Main.Ungroup="Alisin sa Grupo"
+
+Basic.MainMenu.File="&Talaksan"
+Basic.MainMenu.File.Export="&I-export"
+Basic.MainMenu.File.Import="&Angkat"
+Basic.MainMenu.File.ShowRecordings="Ipakita at Pag-&record"
+Basic.MainMenu.File.Remux="Re&mux Recordings"
+Basic.MainMenu.File.Settings="Mga &Setting"
+Basic.MainMenu.File.ShowSettingsFolder="Ipakita ang Folder ng Mga Setting"
+Basic.MainMenu.File.ShowProfileFolder="Ipakita ang Folder ng Profile"
+Basic.MainMenu.AlwaysOnTop="L&aging Nasa Tuktok"
+Basic.MainMenu.File.Exit="E&xit"
+
+Basic.MainMenu.Edit="I-&edit"
+Basic.MainMenu.Edit.Undo="&Pawalang-bisa"
+Basic.MainMenu.Edit.Redo="&Mag-redo"
+Basic.MainMenu.Edit.UndoAction="I-&undo ang $1"
+Basic.MainMenu.Edit.RedoAction="&Redo $1"
+Basic.MainMenu.Edit.LockPreview="&I-preview ang I-preview"
+Basic.MainMenu.Edit.Scale="Preview &Scaling"
+Basic.MainMenu.Edit.Scale.Window="Scale to Window"
+Basic.MainMenu.Edit.Scale.Canvas="Kanbas (%1x%2)"
+Basic.MainMenu.Edit.Scale.Output="Output (%1x%2)"
+Basic.MainMenu.Edit.Transform="&Transform"
+Basic.MainMenu.Edit.Transform.EditTransform="&Baguhin ang Transform..."
+Basic.MainMenu.Edit.Transform.CopyTransform="Kopyahin ang Transform"
+Basic.MainMenu.Edit.Transform.PasteTransform="I-paste ang Transform"
+Basic.MainMenu.Edit.Transform.ResetTransform="I-&reset ang Transform"
+Basic.MainMenu.Edit.Transform.Rotate90CW="I-rotate ang 90 degrees CW"
+Basic.MainMenu.Edit.Transform.Rotate90CCW="I-rotate ang 90 degrees CCW"
+Basic.MainMenu.Edit.Transform.Rotate180="I-rotate ang 180 degrees"
+Basic.MainMenu.Edit.Transform.FlipHorizontal="Flip &Horizontal"
+Basic.MainMenu.Edit.Transform.FlipVertical="Flip &Vertical"
+Basic.MainMenu.Edit.Transform.FitToScreen="&Fit sa screen"
+Basic.MainMenu.Edit.Transform.StretchToScreen="Mag-&stretch sa screen"
+Basic.MainMenu.Edit.Transform.CenterToScreen="&Center sa screen"
+Basic.MainMenu.Edit.Order="&Order"
+Basic.MainMenu.Edit.Order.MoveUp="Ilipat at Pataas (&U)"
+Basic.MainMenu.Edit.Order.MoveDown="Ibaba or bumaba (&D)"
+Basic.MainMenu.Edit.Order.MoveToTop="Ilipat sa &Tuktok"
+Basic.MainMenu.Edit.Order.MoveToBottom="Ilipat sa Ika (&B)"
+Basic.MainMenu.Edit.AdvAudio="&Advanced Audio Properties"
+
+Basic.MainMenu.View="&View"
+Basic.MainMenu.View.Toolbars="Mga &Toolbar"
+Basic.MainMenu.View.Docks="Docks"
+Basic.MainMenu.View.Docks.ResetUI="I-reset ang UI"
+Basic.MainMenu.View.Docks.LockUI="I-lock ang UI"
+Basic.MainMenu.View.Toolbars.Listboxes="Mga &Listbox"
+Basic.MainMenu.View.SceneTransitions="S&cene Mga Paglilipat"
+Basic.MainMenu.View.StatusBar="&Status bar"
+Basic.MainMenu.View.Fullscreen.Interface="Fullscreen Interface"
+
+Basic.MainMenu.SceneCollection="Kolek&syon ng Eksena"
+Basic.MainMenu.Profile="&Profile"
+Basic.MainMenu.Profile.Import="Mag-import ng Profile"
+Basic.MainMenu.Profile.Export="I-export ang Profile"
+Basic.MainMenu.SceneCollection.Import="Pag Angkat ng Nakolektang eksena"
+Basic.MainMenu.SceneCollection.Export="Magluwas ng Nakolektang Eksena"
+Basic.MainMenu.Profile.Exists="Ang Profile ay umiiral na ngayon"
+Basic.MainMenu.SceneCollection.Exists="Ang Nakolektang Eksena ay umiiral na ngayon"
+
+Basic.MainMenu.Tools="&Mga Kasangkapan"
+
+Basic.MainMenu.Help="&Tulong"
+Basic.MainMenu.Help.HelpPortal="Tulong &lagusan"
+Basic.MainMenu.Help.Website="Pagbisita &website"
+Basic.MainMenu.Help.Discord="Sumali sa &Discord Server"
+Basic.MainMenu.Help.Logs="Mag-&log ng mga File"
+Basic.MainMenu.Help.Logs.ShowLogs="&ipakita ang Pag-log ng mga File"
+Basic.MainMenu.Help.Logs.UploadCurrentLog="Mag-upload &Kasalukuyang Mag-log ng File"
+Basic.MainMenu.Help.Logs.UploadLastLog="Mag-upload &Huling pagla-log ng File"
+Basic.MainMenu.Help.Logs.ViewCurrentLog="&Tignan ang Kasalukuyang pagla-log"
+Basic.MainMenu.Help.CheckForUpdates="Magsiyasat para sa mga update"
+
+Basic.Settings.ProgramRestart="Ang mga programa ay dapat na-restart para sa mga maaapektuhan na setting."
+Basic.Settings.ConfirmTitle="Konpirmahin ang mga pagbabago"
+Basic.Settings.Confirm="Hindi mo nai-save ang mga pagbabago. Gusto mo bang i-save ang mga pagbabago?"
+
+Basic.Settings.General="Pangkalahatan"
+Basic.Settings.General.Theme="Tema"
+Basic.Settings.General.Language="Lenguwahe"
+Basic.Settings.General.EnableAutoUpdates="Awtomatikong pagsusuri para sa mga update tungkol sa startup"
+Basic.Settings.General.OpenStatsOnStartup="Magbukas ng palitang-usap ng awtomatikongng stats tungkol sa startup"
+Basic.Settings.General.WarnBeforeStartingStream="Ipakita ang konpirmasyon ng palitang-usap nang magsimula ang mga stream"
+Basic.Settings.General.WarnBeforeStoppingStream="Ipakita ang konpirmasyon ng palitang-usap nang ihinto ang mga stream"
+Basic.Settings.General.Projectors="Mga prodyektor"
+Basic.Settings.General.HideProjectorCursor="Itago ang kursor sa kabila ng mga prodyektor"
+Basic.Settings.General.ProjectorAlwaysOnTop="Gumawa ng mga prodyektor na laging nakakataas"
+Basic.Settings.General.Snapping="Pinagmulan ng Paghahanay na isnaping"
+Basic.Settings.General.ScreenSnapping="Paglagot sa mga Pinagmulan ukol sa gilid ng iskrin"
+Basic.Settings.General.CenterSnapping="Paglagot sa mga Pinagmulan ukol sa pahalang at patayong sentro"
+Basic.Settings.General.SourceSnapping="Paglagot sa mga Pinagmulan ukol sa iba pang mga pinagmulan"
+Basic.Settings.General.SnapDistance="Pagkamadamdam na Paglagot"
+Basic.Settings.General.RecordWhenStreaming="awtomatikong pagtala nang anod"
+Basic.Settings.General.KeepRecordingWhenStreamStops="Panatilihing ang pagtatala kahit tumigil ang stream"
+Basic.Settings.General.ReplayBufferWhileStreaming="Awtomatikong pagsisimula ng replay buffer kapag streaming"
+Basic.Settings.General.KeepReplayBufferStreamStops="Panatilihing aktibo ang replay buffer kahit tumigil ang stream"
+Basic.Settings.General.SysTray="Bandehadong Sistema"
+Basic.Settings.General.SysTrayWhenStarted="Magbawas sa bandehadong sistema kapag nagsimula na"
+Basic.Settings.General.SystemTrayHideMinimize="Palaging magbawas sa bandehadong sistema sa halip na task bar"
+Basic.Settings.General.SaveProjectors="I-save ang mga prodyektor sa labasan"
+Basic.Settings.General.SwitchOnDoubleClick="Paglipat sa eksena kahit makadalawang-pindot"
+Basic.Settings.General.StudioPortraitLayout="Paganahin ang larawan/vertical layout"
+Basic.Settings.General.MultiviewLayout="Multiview Layout"
+
+Basic.Settings.Stream="Stream"
+Basic.Settings.Stream.StreamType="Mga uri ng Stream"
+
+Basic.Settings.Output="Ang awput"
+Basic.Settings.Output.Format="Pagtatala ng recording"
+Basic.Settings.Output.Encoder="Encoder"
+Basic.Settings.Output.SelectDirectory="Piliin ang direktoryong pagtatala"
+Basic.Settings.Output.SelectFile="Piliin ang file ng pagtatala"
+Basic.Settings.Output.EnforceBitrate="Ipatupad ang serbisyo ng limitadong bitrate"
+Basic.Settings.Output.Mode="Awput Mode"
+Basic.Settings.Output.Mode.Simple="Simple"
+Basic.Settings.Output.Mode.Adv="Pagsulong"
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg Awput"
+Basic.Settings.Output.UseReplayBuffer="Simulan ang pag replay ng buffer"
+Basic.Settings.Output.ReplayBuffer.SecondsMax="Pinakamataas na oras ng replay (segundos)"
+Basic.Settings.Output.ReplayBuffer.MegabytesMax="Pinakamataas na memorya (Megabytes)"
+Basic.Settings.Output.ReplayBuffer.Estimate="Ang na estimang nagamit na memorya: %1 MB"
+Basic.Settings.Output.ReplayBuffer.EstimateUnknown="Hindi ma-estima ang nagamit na memorya. Pakilagay ng pinakamataas na limitasyon ng memorya."
+Basic.Settings.Output.ReplayBuffer.HotkeyMessage="(Nota: Siguraduhin na naka takda ang hotkey para sa pag replay ng buffer sa bahaging hotkeys)"
+Basic.Settings.Output.ReplayBuffer.Prefix="Ang panlapi ng Replay Buffer Filename"
+Basic.Settings.Output.ReplayBuffer.Suffix="Suffix"
+Basic.Settings.Output.Simple.SavePath="Recording Path"
+Basic.Settings.Output.Simple.RecordingQuality="Pagrekord ng Kalidad"
+Basic.Settings.Output.Simple.RecordingQuality.Stream="Parehong stream"
+Basic.Settings.Output.Simple.RecordingQuality.Small="Mataas na Kalidad, Katamtamang Laki ng File"
+Basic.Settings.Output.Simple.RecordingQuality.HQ="Indistinguishable Quality, Large File Size"
+Basic.Settings.Output.Simple.RecordingQuality.Lossless="Lossless Quality, Napakalaki ng Laki ng File"
+Basic.Settings.Output.Simple.Warn.VideoBitrate="Babala: Ang bitrate ng streaming video ay itatakda sa%1, na kung saan ay ang itaas na limitasyon para sa kasalukuyang streaming service. Kung sigurado ka na gusto mong pumunta sa itaas%1, paganahin ang mga advanced na mga pagpipilian sa encoder at alisan ng tsek ang \"Ipatupad ang mga limitasyong bitrate ng service streaming\"."
+Basic.Settings.Output.Simple.Warn.AudioBitrate="Babala: Itatakda ang streaming audio bitrate, na kung saan ay ang itaas na limitasyon para sa kasalukuyang streaming service. Kung sigurado ka na gusto mong pumunta sa itaas, paganahin ang mga advanced na pagpipilian ng encoder at alisan ng tsek ang \"Ipataw ang mga limitasyong bitrate ng service streaming\"."
+Basic.Settings.Output.Simple.Warn.Encoder="Babala: Ang pagrekord sa isang encoder ng software sa ibang kalidad kaysa sa stream ay mangangailangan ng dagdag na paggamit ng CPU kung mag-stream at mag-record ka sa parehong oras."
+Basic.Settings.Output.Simple.Warn.Lossless="Babala: Hindi mawawalan ng kalidad ang bumubuo ng napakalaking malalaking sukat ng file! Maaaring gumamit ng walang humpay na kalidad ng hanggang 7 gigabytes ng puwang ng disk kada minuto sa mataas na resolution at framerates. Ang hindi nawawala ay hindi inirerekomenda para sa mahabang pag-record maliban kung mayroon kang isang napakalaking halaga ng disk space na magagamit."
+Basic.Settings.Output.Simple.Warn.Lossless.Msg="Sigurado ka bang gusto mong gumamit ng kalidad na walang pagkawala?"
+Basic.Settings.Output.Simple.Warn.Lossless.Title="Lossless quality warning!"
+Basic.Settings.Output.Simple.Warn.MultipleQSV="Babala: Hindi ka maaaring gumamit ng maraming magkahiwalay na mga encoder ng QSV kapag nag-stream at nagre-record nang sabay. Kung nais mong i-stream at i-record nang sabay-sabay, mangyaring baguhin ang alinman sa encoder ng pag-record o stream encoder."
+Basic.Settings.Output.Simple.Encoder.Software="Software (x264)"
+Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Hardware (QSV)"
+Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Hardware (AMD)"
+Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Hardware (NVENC)"
+Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Software (x264 mababang preset ng paggamit ng CPU, nagpapataas ng laki ng file)"
+Basic.Settings.Output.VideoBitrate="Bitrate ng Video"
+Basic.Settings.Output.AudioBitrate="Bitrate ng Audio"
+Basic.Settings.Output.Reconnect="Awtomatikong mag-reconnect"
+Basic.Settings.Output.RetryDelay="Retry Delay (segundo)"
+Basic.Settings.Output.MaxRetries="Pinakamataas na Retries"
+Basic.Settings.Output.Advanced="Paganahin ang Mga Setting ng Advanced Encoder"
+Basic.Settings.Output.EncoderPreset="Encoder Preset (mas mataas = mas CPU)"
+Basic.Settings.Output.CustomEncoderSettings="Mga Setting ng Custom Encoder"
+Basic.Settings.Output.CustomMuxerSettings="Mga Setting ng Custom Muxer"
+Basic.Settings.Output.NoSpaceFileName="Bumuo ng Pangalan ng File nang walang Space"
+
+Basic.Settings.Output.Adv.Rescale="Rescale Output"
+Basic.Settings.Output.Adv.AudioTrack="Audio Track"
+Basic.Settings.Output.Adv.Streaming="Streaming"
+Basic.Settings.Output.Adv.ApplyServiceSettings="Ipatupad ang mga setting ng encoder ng streaming ng serbisyo"
+Basic.Settings.Output.Adv.Audio.Track1="Subaybayan ang 1"
+Basic.Settings.Output.Adv.Audio.Track2="Subaybayan ang 2"
+Basic.Settings.Output.Adv.Audio.Track3="Subaybayan ang 3"
+Basic.Settings.Output.Adv.Audio.Track4="Subaybayan ang 4"
+Basic.Settings.Output.Adv.Audio.Track5="Subaybayan ang 5"
+Basic.Settings.Output.Adv.Audio.Track6="Subaybayan ang 6"
+
+Basic.Settings.Output.Adv.Recording="Pagre-record"
+Basic.Settings.Output.Adv.Recording.Type="Uri"
+Basic.Settings.Output.Adv.Recording.Type.Standard="Standard"
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Custom Output (FFmpeg)"
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Gamitin ang stream encoder)"
+Basic.Settings.Output.Adv.Recording.Filename="Pag-format ng Filename"
+Basic.Settings.Output.Adv.Recording.OverwriteIfExists="I-overwrite kung umiiral ang file"
+Basic.Settings.Output.Adv.FFmpeg.Type="FFmpeg Output Type"
+Basic.Settings.Output.Adv.FFmpeg.Type.URL="Output sa URL"
+Basic.Settings.Output.Adv.FFmpeg.Type.RecordToFile="Output to File"
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Mga format ng karaniwang recording"
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Lahat ng Mga File"
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Landas ng file or ang URL"
+Basic.Settings.Output.Adv.FFmpeg.Format="Lalagyang ng Format"
+Basic.Settings.Output.Adv.FFmpeg.FormatAudio="Tunog"
+Basic.Settings.Output.Adv.FFmpeg.FormatVideo="Bidyo"
+Basic.Settings.Output.Adv.FFmpeg.FormatDefault="Default Format"
+Basic.Settings.Output.Adv.FFmpeg.FormatDesc="Ang lagayan ng deskripsyon ng format"
+Basic.Settings.Output.Adv.FFmpeg.FormatDescDef="Tunog/Bidyo Codec guessed mula sa landas ng File or URL"
+Basic.Settings.Output.Adv.FFmpeg.AVEncoderDefault="Default Encoder"
+Basic.Settings.Output.Adv.FFmpeg.AVEncoderDisable="Huwag paganahin ang Encoder"
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Bidyo Encoder"
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Ang settings ng Bidyo Encoder(kung mayroon)"
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Tonog ng Encoder"
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Ang Settings ng Tonog Encoder(kung mayroon)"
+Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Ang mga Settings ng Muxer (kung mayroon)"
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="Ang pagitan ng Keyframe (frames)"
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Ipakita lahat ng codecs (kahit itoy posibleng di-kompatibol)"
+
+FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
+
+FilenameFormatting.TT="%CCYY Taon, apat na numero\n%YY Taon, huling dalawang numero (00-99)\n%MM Buwan bilang decimal na numero (01-12)\n%DD Araw ng buwan, zero-padded (01-31)\n%hh Oras sa 24h format (00-23)\n%mm Minuto (00-59)\n%ss Segundo (00-61)\n%% A % tanda\n%a Paikliin ang pangalan at araw ng trabaho\n%A Buong araw ng trabaho ng pangalan\n%b Paikliin ang pangalan at Buwan ng trabaho\n%B Buong pangalan ng buwan\n%d Araw ng Buwan, zero-padded (01-31)\n%H Oras sa 24h format (00-23)\n%I Oras sa 12h format (01-12)\n%m Buwan bilang decimal na numero (01-12)\n%M Minute (00-59)\n%p AM or PM ng pagtatalaga\n%S Segundo (00-61)\n%y Taon, huling dalawang numero (00-99)\n%Y Taon\n%z ISO 8601 offset mula sa UTC or timezone\n Pangalan or Pangpaikli\n%Z Timezone na pangalan or pangpaikli\n"
+
+Basic.Settings.Video="Bidyo"
+Basic.Settings.Video.Adapter="Adapter ng Bidyo"
+Basic.Settings.Video.BaseResolution="Base (Kanbas) Resolusyon"
+Basic.Settings.Video.ScaledResolution="Output (Pinaliit) Resolusyon"
+Basic.Settings.Video.DownscaleFilter="Downscale Filter"
+Basic.Settings.Video.DisableAeroWindows="Huwag Paganahin ang Aero (Windows only)"
+Basic.Settings.Video.FPS="FPS"
+Basic.Settings.Video.FPSCommon="Karaniwang Balyo ng FPS"
+Basic.Settings.Video.FPSInteger="Balyo ng Integer FPS"
+Basic.Settings.Video.FPSFraction="Balyo ng Fractional FPS"
+Basic.Settings.Video.Numerator="Numerator"
+Basic.Settings.Video.Denominator="Denominator"
+Basic.Settings.Video.Renderer="Renderer"
+Basic.Settings.Video.InvalidResolution="Ang Balyo ng resolusyong ay imbalido. Dapat ito [width]x[height] (i.e. 1920x1080)"
+Basic.Settings.Video.CurrentlyActive="Ang kasulukuyang Bidyo output ay aktibo. Paki turn off ang anumang output para mabago ang bidyo settings."
+Basic.Settings.Video.DisableAero="Hindi paganahin ang Aero"
+
+Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (Pinakamabilis, pero malabo pag mag i-scaling)"
+Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubic (Sharpened scaling, 16 mga halimbawa)"
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Sharpened scaling, 32 mga halimbawa)"
+
+Basic.Settings.Audio="Tunog"
+Basic.Settings.Audio.SampleRate="Halimbawa ng Antas"
+Basic.Settings.Audio.Channels="Mga Channel"
+Basic.Settings.Audio.MeterDecayRate="Ang Audio Meter Decay Rate"
+Basic.Settings.Audio.MeterDecayRate.Fast="Pabilisin"
+Basic.Settings.Audio.MeterDecayRate.Medium="Katamtaman (Tipo I PPM)"
+Basic.Settings.Audio.MeterDecayRate.Slow="Mabagal (Tipo II PPM)"
+Basic.Settings.Audio.MultiChannelWarning.Enabled="Babala: Ang Surround sound audio ay naka andar."
+Basic.Settings.Audio.MultichannelWarning="Kung nag streaming, paki tignan kung ang iyong streaming service ay parehong supportado ang surround sound ingest at surround sound playback. Twitch, Facebook, 360 Live, Mixer RTMP, Smashcast ay ang mga halimbawa kung saan ang surround sound ay ganap na suportado, pati YouTube Live umaandar lamang sa dawalang channels.\n\nOBS audio filters ay kompatibol lamang sa surround sound, pero hindi siguradong supportado ang VST plugin."
+Basic.Settings.Audio.MultichannelWarning.Title="Paganahin ang surround sound audio?"
+Basic.Settings.Audio.MultichannelWarning.Confirm="Sigurado ka ba gusto mong paganahin ang surround sound audio?"
+Basic.Settings.Audio.DesktopDevice="Ang Kagamitan sa Desktop Audio"
+Basic.Settings.Audio.DesktopDevice2="Ang 2 Kagamitan sa Desktop Audio"
+Basic.Settings.Audio.AuxDevice="Mic / Auxiliary Audio Device"
+Basic.Settings.Audio.AuxDevice2="Mic / Auxiliary Audio Device 2"
+Basic.Settings.Audio.AuxDevice3="Mic / Auxiliary Audio Device 3"
+Basic.Settings.Audio.EnablePushToMute="Paganahin ang Push-to-mute"
+Basic.Settings.Audio.PushToMuteDelay="Push-to-mute delay"
+Basic.Settings.Audio.EnablePushToTalk="Paganahin ang Push-to-talk"
+Basic.Settings.Audio.PushToTalkDelay="Push-to-talk delay"
+Basic.Settings.Audio.UnknownAudioDevice="[Hindi konektado o hindi magagamit ang device]"
+
+Basic.Settings.Advanced="Advanced"
+Basic.Settings.Advanced.General.ProcessPriority="Prayoridad sa Proseso"
+Basic.Settings.Advanced.General.ProcessPriority.High="Mataas"
+Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="Higit sa Normal"
+Basic.Settings.Advanced.General.ProcessPriority.Normal="Normal"
+Basic.Settings.Advanced.General.ProcessPriority.BelowNormal="Mas mababa sa normal"
+Basic.Settings.Advanced.General.ProcessPriority.Idle="Walang ginagawa"
+Basic.Settings.Advanced.FormatWarning="Babala: Ang mga format ng kulay maliban sa NV12 ay pangunahing inilaan para sa pag-record, at hindi inirerekomenda kapag nag-stream. Maaaring mapalawak ng streaming ang paggamit ng CPU dahil sa conversion ng format ng kulay."
+Basic.Settings.Advanced.Audio.BufferingTime="Audio Buffering Time"
+Basic.Settings.Advanced.Video.ColorFormat="Format ng Kulay"
+Basic.Settings.Advanced.Video.ColorSpace="Ang espasyong kulay ng YUV"
+Basic.Settings.Advanced.Video.ColorRange="Ang saklaw ng kulay ng YUV"
+Basic.Settings.Advanced.Video.ColorRange.Partial="Bahagyang"
+Basic.Settings.Advanced.Video.ColorRange.Full="Buo"
+Basic.Settings.Advanced.Audio.MonitoringDevice="Ang kagamitan para sa Audio Monitoring"
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="I-Default"
+Basic.Settings.Advanced.Audio.DisableAudioDucking="Huwag paganahin ang Windows audio ducking"
+Basic.Settings.Advanced.StreamDelay="Ang Antala ng Stream"
+Basic.Settings.Advanced.StreamDelay.Duration="Ang Katagalan (segundo)"
+Basic.Settings.Advanced.StreamDelay.Preserve="Ingatang ang cutoff point (pataas ng antala) kapang kumokonekta"
+Basic.Settings.Advanced.StreamDelay.MemoryUsage="Ang na estimang nagamit na memorya: %1 MB"
+Basic.Settings.Advanced.Network="Network"
+Basic.Settings.Advanced.Network.BindToIP="Ibigkis sa IP"
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Paganahin ang bagong networking code"
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Mababang latency mode"
+
+Basic.AdvAudio="Ang aria-arian ng Advanced Audio"
+Basic.AdvAudio.Name="Pangalan"
+Basic.AdvAudio.Volume="Kalakasan (%)"
+Basic.AdvAudio.Mono="Downmix ito sa Mono"
+Basic.AdvAudio.Panning="Ang Panning"
+Basic.AdvAudio.SyncOffset="Ang Sync Offset (ms)"
+Basic.AdvAudio.Monitoring="Ang subaybay ng Audio"
+Basic.AdvAudio.Monitoring.None="I-Off ang Monitor"
+Basic.AdvAudio.Monitoring.MonitorOnly="Monitor lamang (i-mute ang output)"
+Basic.AdvAudio.Monitoring.Both="Monitor at Awput"
+Basic.AdvAudio.AudioTracks="Mga Tracks"
+
+Basic.Settings.Hotkeys="Ang mga Hotkeys"
+Basic.Settings.Hotkeys.Pair="Ang nabahaging kombinasyon ng susi na may '%1' akto sa toggles"
+
+Basic.Hotkeys.SelectScene="Lumipat sa eksena"
+
+Basic.SystemTray.Show="Ipakita"
+Basic.SystemTray.Hide="Itago"
+
+Basic.SystemTray.Message.Reconnecting="Nadiskonek. Kumokonekta..."
+
+Hotkeys.Insert="Ipasok"
+Hotkeys.Delete="Burahin"
+Hotkeys.Home="Pinagmulan"
+Hotkeys.End="Tapos"
+Hotkeys.PageUp="Itaas ng Pahina"
+Hotkeys.PageDown="Ibaba ng pahina"
+Hotkeys.NumLock="Num Lock"
+Hotkeys.ScrollLock="Scroll Lock"
+Hotkeys.CapsLock="Caps Lock"
+Hotkeys.Backspace="Backspace"
+Hotkeys.Tab="Tab"
+Hotkeys.Print="Printa"
+Hotkeys.Pause="Itigil"
+Hotkeys.Left="Kaliwa"
+Hotkeys.Right="Kanan"
+Hotkeys.Up="Itaas"
+Hotkeys.Down="Ibaba"
+Hotkeys.Windows="Windows"
+Hotkeys.Super="Super"
+Hotkeys.Menu="Pagpipilian"
+Hotkeys.Space="Espasyo"
+Hotkeys.NumpadNum="Numpad %1"
+Hotkeys.NumpadMultiply="Paramihin ang Numpad"
+Hotkeys.NumpadDivide="Hatiin ang Numpad"
+Hotkeys.NumpadAdd="Magdagdag ng Numpad"
+Hotkeys.NumpadSubtract="Magbawas ng Numpad"
+Hotkeys.NumpadDecimal="Numero ng Numpad"
+Hotkeys.AppleKeypadNum="%1 (Keypad)"
+Hotkeys.AppleKeypadMultiply="* (Keypad)"
+Hotkeys.AppleKeypadDivide="/ (Keypad)"
+Hotkeys.AppleKeypadAdd="+ (Keypad)"
+Hotkeys.AppleKeypadSubtract="- (Keypad)"
+Hotkeys.AppleKeypadDecimal=". (Keypad)"
+Hotkeys.AppleKeypadEqual="= (Keypad)"
+Hotkeys.MouseButton="Mouse %1"
+
+Mute="I-Mute"
+Unmute="I-Unmute"
+Push-to-mute="Pindutin-para-i-mute"
+Push-to-talk="Pindutan-para-magsalita"
+
+SceneItemShow="Ipakita '%1'"
+SceneItemHide="Itago '%1'"
+
+OutputWarnings.NoTracksSelected="Dapat pumili ka ng kahit isang track"
+OutputWarnings.MultiTrackRecording="Babala: Tiyak na pormat (gaya ng FLV) hindi suportado ang maraming tracks kada recording"
+OutputWarnings.MP4Recording="Babala: Ang Recording na naka-save sa MP4 ay hindi unrecoverable kung ang file any hindi tinapos (e.g bilang resulta nito BSODs, power losses, atbp.). Kung gusto mo i-record ng maraming audio tracks isaalang-alang ang paggamit ng MKV at remux ang recording para sa mp4 pagkatapos nitong matapos (File->Remux Recordings)"
+
+FinalScene.Title="Tanggaling ang Eksena"
+FinalScene.Text="Doon kailangan ng kahit isang eksena."
+
+
+
+
diff --git a/UI/data/locale/fr-FR.ini b/UI/data/locale/fr-FR.ini
index 17e52e017..0e12f988b 100644
--- a/UI/data/locale/fr-FR.ini
+++ b/UI/data/locale/fr-FR.ini
@@ -78,6 +78,8 @@ None="Aucune"
StudioMode.Preview="Aperçu"
StudioMode.Program="Programme"
ShowInMultiview="Montrer en Multivues"
+VerticalLayout="Disposition Verticale"
+Group="Groupe"
AlreadyRunning.Title="OBS est déjà en cours d'exécution"
AlreadyRunning.Text="OBS est déjà en cours d'exécution, merci de bien fermer toute autre instances existantes d'OBS avant d'en exécuter une nouvelle. Vérifiez dans votre barre d'état s'il n'est pas réduit et en cours d’exécution."
@@ -92,7 +94,7 @@ BandwidthTest.Region.EU="Europe"
BandwidthTest.Region.Asia="Asie"
BandwidthTest.Region.Other="Autre"
-Basic.FirstStartup.RunWizard="Exécutez l'Assistant de configuration ? Vous pouvez configurer manuellement vos paramètre en cliquant sur le bouton des Paramètres situer dans la fenêtre principale."
+Basic.FirstStartup.RunWizard="Exécuter l'Assistant de configuration ? Vous pouvez configurer manuellement vos paramètres en cliquant sur le bouton des Paramètres situé dans la fenêtre principale."
Basic.FirstStartup.RunWizard.BetaWarning="(Remarque : l’Assistant de configuration automatique est actuellement en version bêta)"
Basic.FirstStartup.RunWizard.NoClicked="Si vous changez d’avis, vous pouvez réexécuter l’Assistant de configuration automatique n’importe quel moment dans le menu outils."
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="Arrêt du tampon de relecture..."
Basic.Main.StopStreaming="Arrêter le streaming"
Basic.Main.StoppingStreaming="Arrêt du stream..."
Basic.Main.ForceStopStreaming="Arrêter le streaming (annule le retard)"
+Basic.Main.Group="Groupe %1"
+Basic.Main.GroupItems="Grouper les éléments sélectionnés"
+Basic.Main.Ungroup="Dissocier"
Basic.MainMenu.File="&Fichier"
Basic.MainMenu.File.Export="&Exporter"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="Outils"
Basic.MainMenu.Help="&Aide"
Basic.MainMenu.Help.HelpPortal="&Portail d'aide"
Basic.MainMenu.Help.Website="Consulter le site &Web"
+Basic.MainMenu.Help.Discord="Rejoindre le serveur &Discord"
Basic.MainMenu.Help.Logs="&Fichiers journaux"
Basic.MainMenu.Help.Logs.ShowLogs="Afficher les &fichiers de log"
Basic.MainMenu.Help.Logs.UploadCurrentLog="Mettre en ligne le fichier journal &actuel"
Basic.MainMenu.Help.Logs.UploadLastLog="Mettre en ligne le &dernier fichier journal"
Basic.MainMenu.Help.Logs.ViewCurrentLog="&Voir le journal actuel"
Basic.MainMenu.Help.CheckForUpdates="Rechercher des mises à jour"
+Basic.MainMenu.Help.CrashLogs="Rapports d'e&rreurs"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="Montrer les rapport&s d'erreur"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="Envoyer &le Dernier Rapport d'Erreur"
Basic.Settings.ProgramRestart="Le programme doit être redémarré pour que les paramètres prennent effet."
Basic.Settings.ConfirmTitle="Valider les modifications"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Toujours réduire dans la zone de
Basic.Settings.General.SaveProjectors="Enregistrer les projecteurs en quittant"
Basic.Settings.General.SwitchOnDoubleClick="Effectuer la transition vers la scène en cas de double clic"
Basic.Settings.General.StudioPortraitLayout="Activer la mise en page portrait/verticale"
+Basic.Settings.General.Multiview="Multivues"
+Basic.Settings.General.Multiview.MouseSwitch="Cliquez pour changer de scène"
+Basic.Settings.General.Multiview.DrawSourceNames="Montrer les noms des scènes"
+Basic.Settings.General.Multiview.DrawSafeAreas="Afficher les zones sûres (EBU R 95)"
Basic.Settings.General.MultiviewLayout="Disposition de la multivue"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontal, haut"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontal, bas"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertical, gauche"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertical, droit"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontal, Haut (8 Scènes)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontal, Bas (8 Scènes)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertical, Gauche (8 Scènes)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertical, Droite (8 Scènes)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Horizontal, Haut (24 Scènes)"
Basic.Settings.Stream="Flux"
Basic.Settings.Stream.StreamType="Type de diffusion"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="Vitesse de dégradation audiométrique"
Basic.Settings.Audio.MeterDecayRate.Fast="Rapide"
Basic.Settings.Audio.MeterDecayRate.Medium="Moyenne (Type I PPM)"
Basic.Settings.Audio.MeterDecayRate.Slow="Lente (Type II PPM)"
+Basic.Settings.Audio.PeakMeterType="Type de crête-mètre"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Pic d'échantillon"
+Basic.Settings.Audio.PeakMeterType.TruePeak="Crête vraie (plus grande utilisation du CPU)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="ATTENTION : le son multicanal est activé."
Basic.Settings.Audio.MultichannelWarning="Pour de besoins de diffusion, vérifiez que votre service de diffusion supporte l'intégration et la lecture du son multicanal. Twitch, Facebook 360 Live, Mixer RTMP ou Smashcast sont des exemples de services où le son multicanal est entièrement supporté. Bien que Facebook Live et YouTube Live acceptent l'intégration de son multicanal, Facebook Live transcode en stéréo, et YouTube Live ne lit que deux canaux.\n\nLes filtres audio d'OBS sont compatibles avec le son multicanal, toutefois le support du plugin VST n'est pas garanti."
Basic.Settings.Audio.MultichannelWarning.Title="Activer le son multicanal ?"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="Carte réseau (adresse IP source du flux)"
Basic.Settings.Advanced.Network.BindToIP="Lier à :"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Activer le nouveau code réseau"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Mode faible latence"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Désactiver les raccourcis clavier lorsque la fenêtre principale est au premier plan"
Basic.AdvAudio="Propriétés audio avancées"
Basic.AdvAudio.Name="Nom"
@@ -749,3 +767,12 @@ OutputWarnings.MP4Recording="Avertissement : les enregistrements sauvegardés en
FinalScene.Title="Supprimer la scène"
FinalScene.Text="Il doit y avoir au moins une scène."
+NoSources.Title="Aucune source"
+NoSources.Text="Il semble que vous n'ayez pas ajouté de source vidéo pour le moment, vous aurez donc un écran noir. Êtes-vous sûr de vouloir continuer ?"
+NoSources.Text.AddSource="Vous pouvez à tout moment ajouter des sources en cliquant sur l'icone + sous le bloc Sources de la fenêtre principale."
+
+ChangeBG="Définir la couleur"
+CustomColor="Couleur personnalisée"
+
+BrowserSource.EnableHardwareAcceleration="Activer l’accélération matériel de la source navigateur"
+
diff --git a/UI/data/locale/gd-GB.ini b/UI/data/locale/gd-GB.ini
new file mode 100644
index 000000000..0ea4d8659
--- /dev/null
+++ b/UI/data/locale/gd-GB.ini
@@ -0,0 +1,770 @@
+
+Language="Gàidhlig"
+Region="Alba"
+
+OK="Ceart ma-thà"
+Apply="Cuir an sàs"
+Cancel="Sguir dheth"
+Close="Dùin"
+Save="Sàbhail"
+Discard="Tilg air falbh"
+Disable="Cuir à comas"
+Yes="Tha"
+No="Chan eil"
+Add="Cuir ris"
+Remove="Thoir air falbh"
+Rename="Thoir ainm ùr air"
+Interact="Eadar-ghnìomhach"
+Filters="Criathragan"
+Properties="Roghainnean"
+MoveUp="Gluais suas"
+MoveDown="Gluais sìos"
+Settings="Roghainnean"
+Display="Uidheam-taisbeanaidh"
+Name="Ainm"
+Exit="Fàg an-seo"
+Mixer="Measgadair"
+Browse="Rùraich"
+Mono="Mono"
+Stereo="Stereo"
+DroppedFrames="Frèamaichean a thuit: %1 (%2%)"
+StudioProgramProjector="Proiseactar làn-sgrìn (prògram)"
+PreviewProjector="Proiseactar làn-sgrìn (ro-shealladh)"
+SceneProjector="Proiseactar làn-sgrìn (sealladh)"
+SourceProjector="Proiseactar làn-sgrìn (tùs)"
+StudioProgramWindow="Proiseactar uinneagaichte (prògram)"
+PreviewWindow="Proiseactar uinneagaichte (ro-shealladh)"
+SceneWindow="Proiseactar uinneagaichte (sealladh)"
+SourceWindow="Proiseactar uinneagaichte (tùs)"
+MultiviewProjector="Ioma-shealladh (làn-sgrìn)"
+MultiviewWindowed="Ioma-shealladh (uinneagaichte)"
+Clear="Falamhaich"
+Revert="Till"
+Show="Seall"
+Hide="Falaich"
+UnhideAll="Seall na h-uile"
+Untitled="Gun tiotal"
+New="Ùr"
+Duplicate="Dùblaich"
+Enable="Cuir an comas"
+DisableOSXVSync="Cuir à comas sioncronachadh-V air OSX"
+ResetOSXVSyncOnExit="Ath-shuidhich sioncronachadh-V air OSX nuar a dh’fhàgar"
+HighResourceUsage="Tha an còdachadh ro thrang! Feuch an tagh thu roghainnean video nas ìsle no an cleachd thu ro-sheata còdachaidh nas luaithe."
+Transition="Tar-mhùthadh"
+QuickTransitions="Tar-mhùthaidhean luatha"
+Left="Clì"
+Right="Deas"
+Top="Barr"
+Bottom="Bonn"
+Reset="Ath-shuidhich"
+Hours="Uair"
+Minutes="Mionaid"
+Seconds="Diog"
+Deprecated="Cha mholar seo tuilleadh"
+Import="Ion-phortaich"
+Export="Às-phortaich"
+Copy="Dèan lethbhreac"
+Paste="Cuir ann"
+PasteReference="Cuir ann (iomradh)"
+PasteDuplicate="Cuir ann (dùblachadh)"
+RemuxRecordings="Iompaich clàraidhean"
+Next="Air adhart"
+Back="Air ais"
+Defaults="Bun-roghainnean"
+HideMixer="Falaich sa mheasgadair"
+TransitionOverride="Tar-àithneadh an tar-mhùthaidh"
+None="Chan eil gin"
+StudioMode.Preview="Ro-shealladh"
+StudioMode.Program="Prògram"
+ShowInMultiview="Seall san ioma-shealladh"
+VerticalLayout="Co-dhealbhachd inghearach"
+Group="Buidhnich"
+
+AlreadyRunning.Title="Tha OBS ’ga ruith mar-thà"
+AlreadyRunning.Text="Tha OBS ’ga ruith mar-thà! Mur ann gun robh thu airson seo a dhèanamh, dùin sìos gach ionstans de dh’OBS mus fheuch thu ri ionstans eile dheth a ruith. Ma shuidhich thu OBS ach an dèid fhìor-lùghdachadh gu treidhe an t-siostaim thoir sùil a bheil e ’ga ruith an-siud fhathast."
+AlreadyRunning.LaunchAnyway="Cuir gu dol e co-dhiù"
+
+Copy.Filters="Dèan lethbhreac dhe na criathragan"
+Paste.Filters="Cuir ann criathragan"
+
+BandwidthTest.Region="Roinn-dùthcha"
+BandwidthTest.Region.US="Na Stàitean Aonaichte"
+BandwidthTest.Region.EU="An Roinn-Eòrpa"
+BandwidthTest.Region.Asia="Àisia"
+BandwidthTest.Region.Other="Roinn-dùthcha eile"
+
+Basic.FirstStartup.RunWizard="A bheil thu airson draoidh an fhèin-rèiteachaidh a ruith? ’S urrainn dhut na roghainnean agad a rèiteachadh a làimh cuideachd ’s tu a’ briogadh air a’ phutan “Roghainnean” sa phrìomh-uinneag."
+Basic.FirstStartup.RunWizard.BetaWarning="(An aire: Tha draoidh an fhèin-rèiteachaidh ’na thionndadh beta fhathast)"
+Basic.FirstStartup.RunWizard.NoClicked="Ma chuireas tu an caochladh romhad, ’s urrainn dhut draoidh an fhèin-rèiteachaidh a ruith a-rithist on chlàr-taice “Innealan” uair sam bith."
+
+Basic.AutoConfig="Draoidh an fhèin-rèiteachaidh"
+Basic.AutoConfig.Beta="Draoidh an fhèin-rèiteachaidh (beta)"
+Basic.AutoConfig.ApplySettings="Cuir na roghainnean an sàs"
+Basic.AutoConfig.StartPage="Fiosrachadh a’ chleachdaidh"
+Basic.AutoConfig.StartPage.SubTitle="Sònraich na h-adhbharan air an cleachd thu am prògram"
+Basic.AutoConfig.StartPage.PrioritizeStreaming="Gleus airson sruthadh is chan eil clàradh cho cudromach sin"
+Basic.AutoConfig.StartPage.PrioritizeRecording="Gleus airson clàradh a-mhàin, cha dèan mi sruthadh"
+Basic.AutoConfig.VideoPage="Roghainnean video"
+Basic.AutoConfig.VideoPage.SubTitle="Sònraich na roghainnean video a bu toigh leat cleachdadh"
+Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="An roghainn làithreach (%1x%2)"
+Basic.AutoConfig.VideoPage.BaseResolution.Display="Uidheam-taisbeanaidh %1 (%2x%3)"
+Basic.AutoConfig.VideoPage.FPS.UseCurrent="An roghainn làithreach (%1)"
+Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="An dà chuid 60 no 30 ach b’ fhearr leam 60"
+Basic.AutoConfig.VideoPage.FPS.PreferHighRes="An dà chuid 60 no 30 ach b’ fhearr leam dùmhlachd-bhreacaidh àrd"
+Basic.AutoConfig.VideoPage.CanvasExplanation="An aire: Cha bhi dùmhlachd-bhreacaidh bhunasach (a’ chanabhais) co-ionnan ris an dùmhlachd-bhreacaidh a thèid a chlàradh no a shruthadh an-còmhnaidh. Dh’fhaoidte gun dèid an dùbhlachd-bhreacaidh air sruthadh no clàradh ìsleachadh o dhùmhlachd-bhreacaidh a’ chanabhais airson freagairt ri feumalachdan cleachdaidh no reat bhiotaichean."
+Basic.AutoConfig.StreamPage="Fiosrachadh an t-sruthaidh"
+Basic.AutoConfig.StreamPage.SubTitle="Cuid a-steach fiosrachadh an t-sruthaidh agad"
+Basic.AutoConfig.StreamPage.Service="Seirbheis"
+Basic.AutoConfig.StreamPage.Service.ShowAll="Seall na h-uile…"
+Basic.AutoConfig.StreamPage.Server="Frithealaiche"
+Basic.AutoConfig.StreamPage.StreamKey="Iuchair an t-sruthaidh"
+Basic.AutoConfig.StreamPage.StreamKey.LinkToSite="(Ceangal)"
+Basic.AutoConfig.StreamPage.PerformBandwidthTest="Dèan tuairmse air reat bhiotaichean le deuchainn air an leud-bhanna (dh’fhaoidte gun doir seo mionaid no dhà)"
+Basic.AutoConfig.StreamPage.PreferHardwareEncoding="B’ fhearr leam còdachadh bathair-chruthaidh"
+Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="Le còdachadh bathair-chruaidh, cha dèid ach glè bheag dhen CPU a chleachdadh ach dh’fhaoidte gum bi feum air reat bhiotaichean nas àirde airson ann aon ìre a chàileachd fhaighinn."
+Basic.AutoConfig.StreamPage.StreamWarning.Title="Rabhadh sruthaidh"
+Basic.AutoConfig.StreamPage.StreamWarning.Text="Tha an deuchainn air an leud-bhanna gu bhith dàta video tuaireamach gun fhuaim a shruthadh dhan t-seanail agad. Ma ghabhas seo a dhèanamh, mholamaid gun cuir thu dheth sàbhaladh sruthaidh video agus gun dèan thu an sruth agad prìobhaideach gus am bi an deuchainn deiseil. A bheil thu airson leantainn air adhart?"
+Basic.AutoConfig.TestPage="Na toraidhean deireannach"
+Basic.AutoConfig.TestPage.SubTitle.Testing="Tha am prògram a’ ruith deuchainnean airson tuairmse a dhèanamh air na roghainnean as fhearr"
+Basic.AutoConfig.TestPage.SubTitle.Complete="Tha an deuchainn deiseil"
+Basic.AutoConfig.TestPage.TestingBandwidth="A’ cur an leud-bhanna fo dheuchainn, dh’fhaoidte gun doir seo mionaid no dhà…"
+Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="A’ ceangal ri: %1…"
+Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="Cha deach leinn ceangal a dhèanamh ri frithealaiche sam bith, thoir sùil air a’ cheangal agad dhan eadar-lìon is feuch ris a-rithist an uairsin."
+Basic.AutoConfig.TestPage.TestingBandwidth.Server="A’ cur an leud-bhanna fo dheuchainn airson: %1"
+Basic.AutoConfig.TestPage.TestingStreamEncoder="A’ cur inneal-còdachaidh an t-sruthaidh fo dheuchainn, dh’fhaoidte gun doir seo mionaid no dhà…"
+Basic.AutoConfig.TestPage.TestingRecordingEncoder="A’ cur inneal-còdachaidh a’ chlàraidh fo dheuchainn, dh’fhaoidte gun doir seo mionaid no dhà…"
+Basic.AutoConfig.TestPage.TestingRes="A’ cur nan dùmhlachdan-breacaidh fo dheuchainn, dh’fhaoidte gun doir seo mionaid no dhà…"
+Basic.AutoConfig.TestPage.TestingRes.Fail="Cha deach leinn an t-inneal-còdachaidh a chur gu dol"
+Basic.AutoConfig.TestPage.TestingRes.Resolution="A’ feuchainn %1x%2 %3 FPS…"
+Basic.AutoConfig.TestPage.Result.StreamingEncoder="Inneal-còdachaidh an t-sruthaidh"
+Basic.AutoConfig.TestPage.Result.RecordingEncoder="Inneal-còdachaidh a’ chlàraidh"
+Basic.AutoConfig.TestPage.Result.Header="Rinn am prògram tuairmse gur e seo na roghainnean as fhearr dhut:"
+Basic.AutoConfig.TestPage.Result.Footer="Airson na roghainnean seo a chleachdadh, briog air “Cuir na roghainnean an sàs”. Airson an draoidh a rèiteachadh às ùr is fheuchainn is a-rithist, briog air “Air ais”. Airson na roghainnean a rèiteachadh a làimh, briog air “Sguir dheth” is fosgail na “Roghainnean”."
+
+Basic.Stats="Stadastaireachd"
+Basic.Stats.CPUUsage="Cleachdadh a’ CPU"
+Basic.Stats.HDDSpaceAvailable="Àite ri fhaighinn air a’ chlàr-chruaidh"
+Basic.Stats.MemoryUsage="Cleachdadh a’ chuimhne"
+Basic.Stats.AverageTimeToRender="Ùine cuibheasach air reandaradh frèama"
+Basic.Stats.SkippedFrames="Na frèamaichean air an leigeil seachad ri linn dàil còdachaidh"
+Basic.Stats.MissedFrames="Na frèamaichean a chaidh a dhìth ri linn dàil còdachaidh"
+Basic.Stats.Output.Stream="Sruthadh"
+Basic.Stats.Output.Recording="Clàradh"
+Basic.Stats.Status="Staid"
+Basic.Stats.Status.Recording="Clàradh"
+Basic.Stats.Status.Live="BEÒ"
+Basic.Stats.Status.Reconnecting="’Ga ath-cheangal"
+Basic.Stats.Status.Inactive="Neo-ghnìomhach"
+Basic.Stats.DroppedFrames="Frèamaichean a thuit: (lìonra)"
+Basic.Stats.MegabytesSent="Às-chur dàta iomlan"
+Basic.Stats.Bitrate="Reat bhiotaichean"
+
+Updater.Title="Tha ùrachadh ri fhaighinn"
+Updater.Text="Tha ùrachadh ri fhaighinn:"
+Updater.UpdateNow="Ùraich an-dràsta"
+Updater.RemindMeLater="Cuir nam chuimhne uaireigin eile"
+Updater.Skip="Leig seachad an tionndadh"
+Updater.Running.Title="Tha am prògram gnìomhach"
+Updater.Running.Text="Tha às-chur gnìomhach ann, cuir stad air gach às-chur mus fheuch thu ris an ùrachadh"
+Updater.NoUpdatesAvailable.Title="Chan eil ùrachadh ri fhaighinn"
+Updater.NoUpdatesAvailable.Text="Chan eil ùrachadh ri fhaighinn an-dràsta"
+Updater.FailedToLaunch="Cha deach leinn an t-inneal-ùrachaidh a chur gu dol"
+Updater.GameCaptureActive.Title="Tha glacadh geama gnìomhach"
+Updater.GameCaptureActive.Text="Tha leabharlann glacaidh geama ’ga chleachdadh. Dùin gad geama no prògram a tha ’ga ghlacadh (no ath-thòisich Windows) is feuch ris a-rithist."
+
+QuickTransitions.SwapScenes="Dèan iomlaid air seallaidhean an ro-sheallaidh ’s an às-chuir às dèid an tar-mhùthaidh"
+QuickTransitions.SwapScenesTT="Nì seo iomlaid air seallaidhean an ro-sheallaidh ’s an às-chuir às dèidh an tar-mhùthaidh (ma tha sealladh tùsail an às-chuir ann fhathast).\nCha neo-dhèan seo atharrachadh sam bith a chaidh a dhèanamh air sealladh tùsail an às-chuir."
+QuickTransitions.DuplicateScene="Dùblaich an t-sealladh"
+QuickTransitions.DuplicateSceneTT="Nuair a nì thu deasachadh air an aon shealladh, leigidh seo leat cruth-atharrachadh no faicsinneachd nan tùsan a dheasachadh gun atharrachadh air an às-chur.\nAirson roghainnean nan tùsan atharrachadh gun a bhith ag atharrachadh an às-chuir, cuir an comas “Dùblaich na tùsan”.\nNuair a dh’atharraicheas tu an luach seo, thèid sealladh an às-chuir làithrich atharrachadh (ma tha e ann fhathast)."
+QuickTransitions.EditProperties="Dùblaich na tùsan"
+QuickTransitions.EditPropertiesTT="Nuair a nì thu deasachadh air an aon shealladh, leigidh seo leat roghainnean nan tùsan atharrachadh gun atharrachadh air an às-chur.\nCha ghabh seo a chleachdadh ach ma tha “Dùblaich an t-sealladh” an comas.\nTha tùsan ann (can tùsan glacaidh no meadhain) nach cuir taic ri seo agus cha ghabh an deasachadh fa leth.\nNuair a dh’atharraicheas tu an luach seo, thèid sealladh an às-chuir làithrich ath-shuidheachadh (ma tha e ann fhathast).\n\nRabhadh: On a thèid na tùsan a dhùblachadh, bi feum air barrachd ghoireasan siostaim no video."
+QuickTransitions.HotkeyName="Tar-mhùthadh luath: %1"
+
+Basic.AddTransition="Cuir ris tar-mhùthadh a ghabhas rèiteachadh"
+Basic.RemoveTransition="Thoir air falbh tar-mhùthadh a ghabhas rèiteachadh"
+Basic.TransitionProperties="Roghainnean an tar-mhùthaidh"
+Basic.SceneTransitions="Tar-mhùthaidhean an t-seallaidh"
+Basic.TransitionDuration="Faide"
+Basic.TogglePreviewProgramMode="Modh stiùideo"
+
+TransitionNameDlg.Text="Cuir a-steach ainm an tar-mhùthaidh"
+TransitionNameDlg.Title="Ainm an tar-mhùthaidh"
+
+TitleBar.Profile="Pròifil"
+TitleBar.Scenes="Seallaidhean"
+
+NameExists.Title="Tha an t-ainm ann mu thràth"
+NameExists.Text="Tha an t-ainm seo ’ga chleachdadh mu thràth."
+
+NoNameEntered.Title="Cuir a-steach ainm dligheach"
+NoNameEntered.Text="Chan urrainn dhut ainm falamh a chleachdadh."
+
+ConfirmStart.Title="A bheil thu airson tòiseachadh air sruthadh?"
+ConfirmStart.Text="A bheil thu cinnteach gu bheil thu airson tòiseachadh air an t-sruthadh?"
+
+ConfirmStop.Title="A bheil thu airson stad a chur air an t-sruthadh?"
+ConfirmStop.Text="A bheil thu cinnteach gu bheil thu airson stad a chur air an t-sruthadh?"
+
+ConfirmExit.Title="A bheil thu airson OBS fhàgail?"
+ConfirmExit.Text="Tha OBS gnìomhach an-dràsta. Thèid gach sruthadh no clàradh a chur gu crìch. A bheil thu cinnteach gu bheil thu airson fhàgail?"
+
+ConfirmRemove.Title="Dearbh an toirt air falbh"
+ConfirmRemove.Text="A bheil thu cinnteach gu bheil thu airson “$1” a thoirt air falbh?"
+ConfirmRemove.TextMultiple="A bheil thu cinnteach gu bheil thu airson %1 nithean a thoirt air falbh?"
+
+Output.StartStreamFailed="Cha deach leinn tòiseachadh air an t-sruthadh"
+Output.StartRecordingFailed="Cha deach leinn tòiseachadh air a’ chlàradh"
+Output.StartReplayFailed="Cha deach leinn tòiseachadh air bufair na h-ath-chluiche"
+Output.StartFailedGeneric="Cha deach leinn tòiseachadh air an às-chur. Thoir sùil air an loga airson barrachd fiosrachaidh.\n\nAn aire: Ma tha thu a’ cleachdadh inneal-còdachaidh NVENC no AMD, dèan cinneach gu bheil na draibhearan video agad cho ùr ’s a ghabhas."
+
+Output.ConnectFail.Title="Cha deach leinn ceangal a dhèanamh"
+Output.ConnectFail.BadPath="Tha slighe no URL a’ cheangail mì-dhligheach. Thoir sùil air na roghainnean agad feuch a bheil iad mar bu chòir."
+Output.ConnectFail.ConnectFailed="Dh’fhàillig an ceangal ris an fhrithealaiche"
+Output.ConnectFail.InvalidStream="Bha b’ urrainn dhuinn an t-seanail no an iuchair sruthaidh a shònraich thu inntrigeadh, dearbhaidh an iuchair sruthaidh agad. Ma tha i ceart, dh’fhaoidte gu bheil duilgheadas ann le ceangal ris an fhrithealaiche."
+Output.ConnectFail.Error="Thachair mearachd ris nach robh dùil nuair a dh’fheuch sinn ri ceangal ris an fhrithealaiche. Tha barrachd fiosrachaidh ann am faidhle an loga."
+Output.ConnectFail.Disconnected="Chaidh an ceangal dhan fhrithealaiche a bhriseadh."
+
+Output.RecordFail.Title="Cha deach leinn tòiseachadh air a’ chlàradh"
+Output.RecordFail.Unsupported="Cha chuirear taic ri fòrmat an às-chuir no cha chuir e taic ri corr is aon traca fuaime. Thoir sùil air na roghainnean agad is feuch ris a-rithist."
+Output.RecordNoSpace.Title="Chan eil àite gu leòr air an diosga"
+Output.RecordNoSpace.Msg="Chan eil àite gu leòr air an diosga airson leantainn air adhart leis a’ chlàradh."
+Output.RecordError.Title="Mearachd clàraidh"
+Output.RecordError.Msg="Thachair mearachd nach deach a shònrachadh rè a’ chlàraidh."
+Output.ReplayBuffer.NoHotkey.Title="Cha deach grad-iuchair a shuidheachadh!"
+Output.ReplayBuffer.NoHotkey.Msg="Cha deach grad-iuchair sàbhalaidh a shuidheachadh airson bufair na h-ath-chluiche. Suidhich an grad-iuchair “Sàbhail” a thèid a chleachdadh airson clàraidhean air ath-chluichean a shàbhaladh."
+
+Output.BadPath.Title="Droch-shlighe faidhle"
+Output.BadPath.Text="Chan eil an t-slighe às-chuir a chaidh a rèiteachadh dligheach. Thoir sùil air na roghainnean agad airson dearbhadh gun deach slighe faidhle dhligheach a shuidheachadh."
+
+LogReturnDialog="Chaidh an loga a luchdadh suas"
+LogReturnDialog.CopyURL="Dèan lethbhreac dhen URL"
+LogReturnDialog.ErrorUploadingLog="Mearachd le luchdadh suas an loga"
+
+LicenseAgreement="Aonta ceadachais"
+LicenseAgreement.PleaseReview="Thoir sùil air teirmichean a’ cheadachais mus cleachd thu OBS. Le cleachdadh a’ phrògraim seo, aidichidh tu gun do leugh thu is gun aontaich thu ri teirmichean ceadachas GNU General Public License v2.0. Sgrolaich sìos airson an corr dhen aonta fhaicinn."
+LicenseAgreement.ClickIAgreeToContinue="Ma ghabhas tu ri teirmichean an aonta, briog air “Gabhaidh mi ris” airson leantainn air adhart. Feumaidh tu gabhail ris an aonta airson OBS a chleachdadh."
+LicenseAgreement.IAgree="Gabhaidh mi ris"
+LicenseAgreement.Exit="Fàg an-seo"
+
+Remux.SourceFile="Clàradh OBS"
+Remux.TargetFile="Faidhle amais"
+Remux.Remux="Iompaich"
+Remux.OBSRecording="Clàradh OBS"
+Remux.FinishedTitle="Tha an t-iompachadh deiseil"
+Remux.Finished="Chaidh an clàradh iompachadh"
+Remux.FinishedError="Chaidh an clàradh iompachadh ach ’s ma dh’fhaoidte nach eil am faidhle coileanta"
+Remux.SelectRecording="Tagh clàradh OBS…"
+Remux.SelectTarget="Tagh faidhle amais…"
+Remux.FileExistsTitle="Tha am faidhle amais ann"
+Remux.FileExists="Tha am faidhle amais ann mu thràth, a bheil thu airson seo a chur ’na àite?"
+Remux.ExitUnfinishedTitle="’Ga iompachadh"
+Remux.ExitUnfinished="Chan eil an t-iompachadh deiseil agus dh’fhaoidte nach gabh am faidhle amais a cleachdadh ma chuireas tu stad air an-dràsta.\nA bheil thu cinnteach gu bheil thu airson stad a chur air an iompachadh?"
+
+UpdateAvailable="Tha ùrachadh ri fhaighinn"
+UpdateAvailable.Text="Tha tionndadh %1.%2.%3 ri fhaighinn a-nis. Briog an-seo gus a luchdadh a-nuas"
+
+Basic.DesktopDevice1="Fuaim an deasg"
+Basic.DesktopDevice2="Fuaim an deasg 2"
+Basic.AuxDevice1="Micreofon/Taic"
+Basic.AuxDevice2="Micreofon/Taic 2"
+Basic.AuxDevice3="Micreofon/Taic 3"
+Basic.AuxDevice4="Micreofon/Taic 4"
+
+Basic.Scene="Sealladh"
+Basic.DisplayCapture="Glacadh an uidheim-taisbeanaidh"
+
+Basic.Main.PreviewConextMenu.Enable="Cuir an ro-shealladh an comas"
+
+ScaleFiltering="Criathradh sgèilidh"
+ScaleFiltering.Point="Puing"
+ScaleFiltering.Bilinear="Dà-loidhneach"
+ScaleFiltering.Bicubic="Dà-chiùbach"
+ScaleFiltering.Lanczos="Lanczos"
+
+Deinterlacing="Dì-fhilleadh"
+Deinterlacing.Discard="Tilg air falbh"
+Deinterlacing.Retro="Retro"
+Deinterlacing.Blend="Co-mheasgachadh"
+Deinterlacing.Blend2x="Co-mheasgachadh 2x"
+Deinterlacing.Linear="Loidhneach"
+Deinterlacing.Linear2x="Loidhneach 2x"
+Deinterlacing.Yadif="Yadif"
+Deinterlacing.Yadif2x="Yadif 2x"
+Deinterlacing.TopFieldFirst="An raon air a’ bharr an toiseach"
+Deinterlacing.BottomFieldFirst="An raon aig a’ bhonn an toiseach"
+
+VolControl.SliderUnmuted="Sleamhnachan àirde airson “%1”: %2"
+VolControl.SliderMuted="Sleamhnachan àirde airson “%1”: %2 (mùchte an-dràsta)"
+VolControl.Mute="Mùch “%1”"
+VolControl.Properties="Roghainnean airson “%1”"
+
+Basic.Main.AddSceneDlg.Title="Cuir sealladh ris"
+Basic.Main.AddSceneDlg.Text="Cuir a-steach ainm an t-seallaidh"
+
+Basic.Main.DefaultSceneName.Text="Sealladh %1"
+
+Basic.Main.AddSceneCollection.Title="Cuir cruinneachadh sheallaidhean ris"
+Basic.Main.AddSceneCollection.Text="Cuir a-steach ainm a’ chruinneachaidh sheallaidhean"
+
+Basic.Main.RenameSceneCollection.Title="Thoir ainm ùr air a’ chruinneachadh sheallaidhean"
+
+AddProfile.Title="Cuir pròifil ris"
+AddProfile.Text="Cuir a-steach ainm na pròifil"
+
+RenameProfile.Title="Thoir ainm ùr air a’ phròifil"
+
+Basic.Main.MixerRename.Title="Thoir ainm ùr air an tùs fuaime"
+Basic.Main.MixerRename.Text="Cuir a-steach ainm an tùis fuaime"
+
+
+Basic.Main.PreviewDisabled="Tha an ro-shealladh às comas an-dràsta"
+
+Basic.SourceSelect="Cruthaich/Tagh tùs"
+Basic.SourceSelect.CreateNew="Cruthaich tùs ùr"
+Basic.SourceSelect.AddExisting="Cuir ris tùs a tha ann"
+Basic.SourceSelect.AddVisible="Seall an tùs"
+
+Basic.PropertiesWindow="Roghainnean airson “%1”"
+Basic.PropertiesWindow.AutoSelectFormat="%1 (taghadh fèin-obrachail: %2)"
+Basic.PropertiesWindow.SelectColor="Tagh dath"
+Basic.PropertiesWindow.SelectFont="Tagh cruth-clò"
+Basic.PropertiesWindow.ConfirmTitle="Chaidh na roghainnean atharrachadh"
+Basic.PropertiesWindow.Confirm="Tha atharraichean gun sàbhaladh ann. A bheil thu airson an cumail?"
+Basic.PropertiesWindow.NoProperties="Chan eil roghainn ann"
+Basic.PropertiesWindow.AddFiles="Cuir faidhlichean ris"
+Basic.PropertiesWindow.AddDir="Cuir pasgan ris"
+Basic.PropertiesWindow.AddURL="Cuir slighe/URL ris"
+Basic.PropertiesWindow.AddEditableListDir="Cuir pasgan ri “%1”"
+Basic.PropertiesWindow.AddEditableListFiles="Cuir faidhlichean ri “%1”"
+Basic.PropertiesWindow.AddEditableListEntry="Cuir innteart ri “%1”"
+Basic.PropertiesWindow.EditEditableListEntry="Deasaich innteart o “%1”"
+
+Basic.PropertiesView.FPS.Simple="Luachan FPS simplidh"
+Basic.PropertiesView.FPS.Rational="Luachan FPS reusanta"
+Basic.PropertiesView.FPS.ValidFPSRanges="Rainsean FPS dligheach:"
+
+Basic.InteractionWindow="Conaltradh le “%1”"
+
+Basic.StatusBar.Reconnecting="Gun cheangal, ’ga ath-cheangal an ceann %2 diog(an) (oidhirp %1)"
+Basic.StatusBar.AttemptingReconnect="A’ feuchainn ri ath-cheangal… (oidhirp %1)"
+Basic.StatusBar.ReconnectSuccessful="Chaidh ath-cheangal"
+Basic.StatusBar.Delay="Dàil (%1d)"
+Basic.StatusBar.DelayStartingIn="Dàil (a’ tòiseachadh an ceann %1d)"
+Basic.StatusBar.DelayStoppingIn="Dàil (a’ stad an ceann %1d)"
+Basic.StatusBar.DelayStartingStoppingIn="Dàil (a’ stad an ceann %1d, a’ tòiseachadh an ceann %1d)"
+
+Basic.Filters="Criathragan"
+Basic.Filters.AsyncFilters="Criathragan fuaime/video"
+Basic.Filters.AudioFilters="Criathragan fuaime"
+Basic.Filters.EffectFilters="Criathragan èifeachd"
+Basic.Filters.Title="Crathragan airson “%1”"
+Basic.Filters.AddFilter.Title="Ainm na criathraige"
+Basic.Filters.AddFilter.Text="Cuir a-steach ainm na criathraige"
+
+Basic.TransformWindow="Tar-mhùthadh air nì an t-seallaidh"
+Basic.TransformWindow.Position="Ionad"
+Basic.TransformWindow.Rotation="Cuairteachadh"
+Basic.TransformWindow.Size="Meud"
+Basic.TransformWindow.Alignment="Co-thaobhadh ionaid"
+Basic.TransformWindow.BoundsType="Seòrsa a’ bhogsa-iadhaidh"
+Basic.TransformWindow.BoundsAlignment="Co-thaobhadh sa bhogsa-iadhaidh"
+Basic.TransformWindow.Bounds="Meud a’ bhogsa-iadhaidh"
+Basic.TransformWindow.Crop="Bearr"
+
+Basic.TransformWindow.Alignment.TopLeft="Taobh clì aig a’ bharr"
+Basic.TransformWindow.Alignment.TopCenter="Sa mheadhan aig a’ bharr"
+Basic.TransformWindow.Alignment.TopRight="Taobh deas aig a’ bharr"
+Basic.TransformWindow.Alignment.CenterLeft="Sa mheadhan air an taobh chlì"
+Basic.TransformWindow.Alignment.Center="Sa mheadhan"
+Basic.TransformWindow.Alignment.CenterRight="Sa mheadhan air an taobh deas"
+Basic.TransformWindow.Alignment.BottomLeft="Taobh clì aig a’ bhonn"
+Basic.TransformWindow.Alignment.BottomCenter="Sa mheadhan aig a’ bhonn"
+Basic.TransformWindow.Alignment.BottomRight="Taobh deas aig a’ bhonn"
+
+Basic.TransformWindow.BoundsType.None="Gun iadhadh"
+Basic.TransformWindow.BoundsType.MaxOnly="Am meud as motha a-mhàin"
+Basic.TransformWindow.BoundsType.ScaleInner="Sgèilich ri iadhadh a-staigh"
+Basic.TransformWindow.BoundsType.ScaleOuter="Sgèilich ri iadhadh a-muigh"
+Basic.TransformWindow.BoundsType.ScaleToWidth="Sgèilich ri leud an iadhaidh"
+Basic.TransformWindow.BoundsType.ScaleToHeight="Sgèilich ri àirde an iadhaidh"
+Basic.TransformWindow.BoundsType.Stretch="Sìn gun iadhadh"
+
+Basic.Main.AddSourceHelp.Title="Chan urrainn dhuinn an tùs a chur ris"
+Basic.Main.AddSourceHelp.Text="Feumaidh do shealladh a bhith agad mus cuir thu tùs ris."
+
+Basic.Main.Scenes="Seallaidhean"
+Basic.Main.Sources="Tùsan"
+Basic.Main.Controls="Uidheaman-smachd"
+Basic.Main.Connecting="’Ga cheangal…"
+Basic.Main.StartRecording="Tòisich air clàradh"
+Basic.Main.StartReplayBuffer="Tòisich air bufair ath-chluiche"
+Basic.Main.StartStreaming="Tòisich air sruthadh"
+Basic.Main.StopRecording="Cuir stad air a’ chlàradh"
+Basic.Main.StoppingRecording="A’ cur stad air a’ chlàradh…"
+Basic.Main.StopReplayBuffer="Cuir stad air bufair na h-ath-chluiche"
+Basic.Main.StoppingReplayBuffer="A’ cur stad air bufair na h-ath-chluiche…"
+Basic.Main.StopStreaming="Cuir stad air an t-sruthadh"
+Basic.Main.StoppingStreaming="A’ cur stad air an t-sruthadh…"
+Basic.Main.ForceStopStreaming="Cuir stad air an t-sruthadh (leig seachad an dàil)"
+Basic.Main.Group="Buidheann %1"
+Basic.Main.GroupItems="Buidhnich na thagh thu"
+Basic.Main.Ungroup="Sgaoil am buidheann"
+
+Basic.MainMenu.File="&Faidhle"
+Basic.MainMenu.File.Export="Às-phor&taich"
+Basic.MainMenu.File.Import="&Ion-phortaich"
+Basic.MainMenu.File.ShowRecordings="Seall na &clàraidhean"
+Basic.MainMenu.File.Remux="Io&mpaich na clàraidhean"
+Basic.MainMenu.File.Settings="&Roghainnean"
+Basic.MainMenu.File.ShowSettingsFolder="Seall pasgan nan roghainnean"
+Basic.MainMenu.File.ShowProfileFolder="Seall pasgan na pròifil"
+Basic.MainMenu.AlwaysOnTop="&Air uachdar an-còmhnaidh"
+Basic.MainMenu.File.Exit="&Fàg an-seo"
+
+Basic.MainMenu.Edit="D&easaich"
+Basic.MainMenu.Edit.Undo="&Neo-dhèan"
+Basic.MainMenu.Edit.Redo="Ath-&dhèan"
+Basic.MainMenu.Edit.UndoAction="&Neo-dhèan $1"
+Basic.MainMenu.Edit.RedoAction="Ath-&dhèan $1"
+Basic.MainMenu.Edit.LockPreview="G&lais an ro-shealladh"
+Basic.MainMenu.Edit.Scale="&Sgèileadh an ro-sheallaidh"
+Basic.MainMenu.Edit.Scale.Window="Sgèilich ris an uinneag"
+Basic.MainMenu.Edit.Scale.Canvas="Canabhas (%1x%2)"
+Basic.MainMenu.Edit.Scale.Output="Às-chur (%1x%2)"
+Basic.MainMenu.Edit.Transform="&Tar-mhùth"
+Basic.MainMenu.Edit.Transform.EditTransform="D&easaich an tar-mhùthadh…"
+Basic.MainMenu.Edit.Transform.CopyTransform="Dèan lethbhreac dhen tar-mhùthadh"
+Basic.MainMenu.Edit.Transform.PasteTransform="Cuir ann tar-mhùthadh"
+Basic.MainMenu.Edit.Transform.ResetTransform="Ath-&shuidhich an tar-mhùthadh"
+Basic.MainMenu.Edit.Transform.Rotate90CW="Cuairtich gu deiseil le 90 ceum"
+Basic.MainMenu.Edit.Transform.Rotate90CCW="Cuairtich gu tuathail le 90 ceum"
+Basic.MainMenu.Edit.Transform.Rotate180="Cuairtich le 180 ceum"
+Basic.MainMenu.Edit.Transform.FlipHorizontal="T&hoir flip air a’ chòmhnard"
+Basic.MainMenu.Edit.Transform.FlipVertical="&Thoir flip gu h-inghearach"
+Basic.MainMenu.Edit.Transform.FitToScreen="Co-&fhreagair ri meud na sgrìn"
+Basic.MainMenu.Edit.Transform.StretchToScreen="&Sìn gu meud na sgrìn"
+Basic.MainMenu.Edit.Transform.CenterToScreen="Cuir air &meadhan na sgrìn"
+Basic.MainMenu.Edit.Order="Òrdu&gh"
+Basic.MainMenu.Edit.Order.MoveUp="Gluais s&uas"
+Basic.MainMenu.Edit.Order.MoveDown="Gluais &sìos"
+Basic.MainMenu.Edit.Order.MoveToTop="Gluais gun bh&arr"
+Basic.MainMenu.Edit.Order.MoveToBottom="Gluais gun &bhonn"
+Basic.MainMenu.Edit.AdvAudio="Roghainnean &adhartach na fuaime"
+
+Basic.MainMenu.View="&Seall"
+Basic.MainMenu.View.Toolbars="&Bàraichean-inneal"
+Basic.MainMenu.View.Docks="Docaichean"
+Basic.MainMenu.View.Docks.ResetUI="Ath-shuidhich an eadar-aghaidh"
+Basic.MainMenu.View.Docks.LockUI="Glais an eadar-aghaidh"
+Basic.MainMenu.View.Toolbars.Listboxes="Bogsaichean-&liosta"
+Basic.MainMenu.View.SceneTransitions="Tar-&mhùthaidhean an t-seallaidh"
+Basic.MainMenu.View.StatusBar="Bàr-s&taide"
+Basic.MainMenu.View.Fullscreen.Interface="Eadar-aghaidh làn-sgrìn"
+
+Basic.MainMenu.SceneCollection="Cruinneachadh &sheallaidhean"
+Basic.MainMenu.Profile="&Pròifil"
+Basic.MainMenu.Profile.Import="Ion-phortaich pròifil"
+Basic.MainMenu.Profile.Export="Às-phortaich a’ phròifil"
+Basic.MainMenu.SceneCollection.Import="Ion-phortaich cruinneachadh sheallaidhean"
+Basic.MainMenu.SceneCollection.Export="Às-phortaich cruinneachadh sheallaidhean"
+Basic.MainMenu.Profile.Exists="Tha a’ phròifil ann mu thràth"
+Basic.MainMenu.SceneCollection.Exists="Tha an cruinneachadh sheallaidhean ann mu thràth"
+
+Basic.MainMenu.Tools="Innea&lan"
+
+Basic.MainMenu.Help="Cob&hair"
+Basic.MainMenu.Help.HelpPortal="&Portal na cobharach"
+Basic.MainMenu.Help.Website="&Tadhail air an làrach-lìn"
+Basic.MainMenu.Help.Logs="Faidhlichean an &loga"
+Basic.MainMenu.Help.Logs.ShowLogs="&Seall faidhlichean an loga"
+Basic.MainMenu.Help.Logs.UploadCurrentLog="Luchdai&ch suas faidhle an loga làithrich"
+Basic.MainMenu.Help.Logs.UploadLastLog="&Luchdaich suas faidhle an loga mu dheireadh"
+Basic.MainMenu.Help.Logs.ViewCurrentLog="&Seall an loga làithreach"
+Basic.MainMenu.Help.CheckForUpdates="Thoir sùil airson ùrachaidhean"
+Basic.MainMenu.Help.CrashLogs="Aithis&gean tuislidh"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="&Seall na h-aithisgean tuislidh"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="&Luchdaich suas an aithisg tuislidh mu dheireadh"
+
+Basic.Settings.ProgramRestart="Feumaidh tu am prògram ath-thòiseachadh gus na roghainnean seo a chur an sàs."
+Basic.Settings.ConfirmTitle="Dearbh na h-atharraichean"
+Basic.Settings.Confirm="Tha atharraichean gun sàbhaladh agad. A bheil thu airson an sàbhaladh?"
+
+Basic.Settings.General="Coitcheann"
+Basic.Settings.General.Theme="Ùrlar"
+Basic.Settings.General.Language="Cànan"
+Basic.Settings.General.EnableAutoUpdates="Thoir sùil airson ùrachaidhean gu fèin-obrachail aig an toiseach"
+Basic.Settings.General.OpenStatsOnStartup="Fosglaidh seo còmhradh na stadastaireachd aig an toiseach"
+Basic.Settings.General.WarnBeforeStartingStream="Seall còmhradh dearbhaidh mus dèid sruthadh a thòiseachadh"
+Basic.Settings.General.WarnBeforeStoppingStream="Seall còmhradh dearbhaidh mus dèid stad a chur air sruthadh"
+Basic.Settings.General.Projectors="Proiseactaran"
+Basic.Settings.General.HideProjectorCursor="Falaich an cùrsair os cionn proiseactaran"
+Basic.Settings.General.ProjectorAlwaysOnTop="Cuir na proiseactaran air uachdar an-còmhnaidh"
+Basic.Settings.General.Snapping="Greimeachadh co-thaobhadh nan tùsan"
+Basic.Settings.General.ScreenSnapping="Greimich na tùsan ri oir na sgrìn"
+Basic.Settings.General.CenterSnapping="Greimich na tùsan ris a’ mheadhan"
+Basic.Settings.General.SourceSnapping="Greimich na tùsan ri tùsan eile"
+Basic.Settings.General.SnapDistance="Mothalachd a’ ghreimeachaidh"
+Basic.Settings.General.RecordWhenStreaming="Clàraich gu fèil-obrachail nuair a thèid rud a shruthadh"
+Basic.Settings.General.KeepRecordingWhenStreamStops="Cum an clàradh nuair a thèid stad a chur air an t-sruthadh"
+Basic.Settings.General.ReplayBufferWhileStreaming="Tòisich bufair na h-ath-chluiche gu fèin-obrachail nuair a bhios rud ’ga shruthadh"
+Basic.Settings.General.KeepReplayBufferStreamStops="Cum bufair na h-ath-chluiche gnìomhach nuair a thèid stad a chur air sruthadh"
+Basic.Settings.General.SysTray="Treidhe an t-siostaim"
+Basic.Settings.General.SysTrayWhenStarted="Fìor-lùghdaich gu treidhe an t-siostaim aig an toiseach"
+Basic.Settings.General.SystemTrayHideMinimize="Fìor-lùghdaich gu treidhe an t-siostaim seach bàr nan saothair an-còmhnaidh"
+Basic.Settings.General.SaveProjectors="Sàbhail na proiseactaran nuair a thèid fàgail an-seo"
+Basic.Settings.General.SwitchOnDoubleClick="Tar-mhùth gu sealladh le briogadh dùbailte"
+Basic.Settings.General.StudioPortraitLayout="Cuir an comas co-dhealbhachd portraid/inghearach"
+Basic.Settings.General.Multiview="Ioma-shealladh"
+Basic.Settings.General.Multiview.MouseSwitch="Briog airson leum a ghearradh eadar seallaidhean"
+Basic.Settings.General.Multiview.DrawSourceNames="Seall ainmean nan seallaidhean"
+Basic.Settings.General.Multiview.DrawSafeAreas="Tarraing raointean sàbhailte (EBU R 95)"
+Basic.Settings.General.MultiviewLayout="Co-dhealbhachd an ioma-sheallaidh"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Còmhnard, barr (8 seallaidhean)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Còmhnard, bonn (8 seallaidhean)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Inghearach, clì (8 seallaidhean)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Inghearach, deas (8 seallaidhean)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Còmhnard, barr (24 sealladh)"
+
+Basic.Settings.Stream="Sruthadh"
+Basic.Settings.Stream.StreamType="Seòrsa an t-sruthaidh"
+
+Basic.Settings.Output="Às-chur"
+Basic.Settings.Output.Format="Fòrmat a’ chlàraidh"
+Basic.Settings.Output.Encoder="Inneal-còdachaidh"
+Basic.Settings.Output.SelectDirectory="Tagh pasgan a’ chlàraidh"
+Basic.Settings.Output.SelectFile="Tagh faidhle clàraidh"
+Basic.Settings.Output.EnforceBitrate="Èignich cuingeachaidhean reat bhiotaichean aig an t-seirbheis sruthaidh"
+Basic.Settings.Output.Mode="Modh an às-chuir"
+Basic.Settings.Output.Mode.Simple="Simplidh"
+Basic.Settings.Output.Mode.Adv="Adhartach"
+Basic.Settings.Output.Mode.FFmpeg="Às-chur FFmpeg"
+Basic.Settings.Output.UseReplayBuffer="Cuir an comas bufair ath-chluiche"
+Basic.Settings.Output.ReplayBuffer.SecondsMax="Ùine as motha nan ath-chluichean (diog)"
+Basic.Settings.Output.ReplayBuffer.MegabytesMax="A’ chuimhne as motha (meaga-baidht)"
+Basic.Settings.Output.ReplayBuffer.Estimate="Tuairmse air cleachdadh na cuimhne: %1 MB"
+Basic.Settings.Output.ReplayBuffer.EstimateUnknown="Chan urrainn dhuinn tuairmse a dhèanamh air cleachdadh na cuimhne. Suidhich crìoch as motha na cuimhne."
+Basic.Settings.Output.ReplayBuffer.HotkeyMessage="(An aire: Dèan cinnteach gun suidhich thu grad-iuchair airson bufair na h-ath-chluiche ann an earrann nan grad-iuchraichean)"
+Basic.Settings.Output.ReplayBuffer.Prefix="Ro-leasachan air ainmean faidhle aig bufair na h-ath-chluiche"
+Basic.Settings.Output.ReplayBuffer.Suffix="Iar-leasachan"
+Basic.Settings.Output.Simple.SavePath="Slighe a’ chlàraidh"
+Basic.Settings.Output.Simple.RecordingQuality="Càileachd a’ chlàraidh"
+Basic.Settings.Output.Simple.RecordingQuality.Stream="Co-ionnann ri tè an t-sruthaidh"
+Basic.Settings.Output.Simple.RecordingQuality.Small="Càileachd àrd, faidhle meadhanach mòr"
+Basic.Settings.Output.Simple.RecordingQuality.HQ="Cha ghabh diofar aithneachadh, faidhle mòr"
+Basic.Settings.Output.Simple.RecordingQuality.Lossless="Càileachd gun chall, faidhle uabhasach mòr"
+Basic.Settings.Output.Simple.Warn.VideoBitrate="Rabhadh: Thèid reat bhiotaichean video an t-sruthaidh a shuidheachadh air %1, seo a’ chrìoch as àirde aig an t-seirbheis sruthaidh làithreach. Ma tha thu cinnteach bu bheil thu airson corr is %1 a chleachdadh, cuir an comas roghainnean adhartach an inneil-chòdachaidh agus thoir a’ chromag far “Èignich cuingeachaidhean reat bhiotaichean aig an t-seirbheis sruthaidh”."
+Basic.Settings.Output.Simple.Warn.AudioBitrate="Rabhadh: Thèid reat bhiotaichean fuaime an t-sruthaidh a shuidheachadh air %1, seo a’ chrìoch as àirde aig an t-seirbheis sruthaidh làithreach. Ma tha thu cinnteach bu bheil thu airson corr is %1 a chleachdadh, cuir an comas roghainnean adhartach an inneil-chòdachaidh agus thoir a’ chromag far “Èignich cuingeachaidhean reat bhiotaichean aig an t-seirbheis sruthaidh”."
+Basic.Settings.Output.Simple.Warn.Encoder="Rabhadh: Ma nì thu clàradh le inneal-còdachaidh bathair-bhog air nach eil an aon chàileachd ’s a th’ air an t-sruthadh, bi feum air barrachd cleachdadh a’ CPU nuair a bhios tu a’ sruthadh ’s a’ clàradh aig an aon àm."
+Basic.Settings.Output.Simple.Warn.Lossless="Rabhadh: Cruthaichidh càileachd gun chall faidhlichean uabhasach mòr! Faodaidh càileachd gun chall corr is 7 giga-baidht a dh’àite a chleachdadh air an diosg gach mionaid ma tha an dùmhlachd-bhreacaidh agus an reat fhrèamaichean àrd. Cha mholamaid càileachd gun chall airson clàraidhean fada ach ma tha torr àite agad air an diosg."
+Basic.Settings.Output.Simple.Warn.Lossless.Msg="A bheil thu cinnteach gu bheil thu airson càileachd gun chall a chleachdadh?"
+Basic.Settings.Output.Simple.Warn.Lossless.Title="Rabhadh a thaobh càileachd gun chall!"
+Basic.Settings.Output.Simple.Warn.MultipleQSV="Rabhadh: Chan urrainn dhut iomadh inneal-còdachaidh QSV fa leth a chleachdadh nuair a bhios tu a’ sruthadh ’s a clàradh aig an aon àm. Nam bu toigh leat sruthadh is clàradh aig an aon àm, feuch an atharraich thu inneal-còdachaidh a’ chlàraidh no an t-sruthaidh."
+Basic.Settings.Output.Simple.Encoder.Software="Bathar-bog (x264)"
+Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Bathar-cruaidh (QSV)"
+Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Bathar-cruaidh (AMD)"
+Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Bathar-cruaidh (NVENC)"
+Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Bathar-bog (ro-shuidheachadh air x264 le cleachdadh a’ CPU ìosal, meudaichidh seo na faidhlichean)"
+Basic.Settings.Output.VideoBitrate="Reat bhiotaichean a’ video"
+Basic.Settings.Output.AudioBitrate="Reat bhiotaichean na fuaime"
+Basic.Settings.Output.Reconnect="Ath-cheangail gu fèin-obrachail"
+Basic.Settings.Output.RetryDelay="Dàil na feuchainn a-rithist (diog)"
+Basic.Settings.Output.MaxRetries="Oidhirpean as motha"
+Basic.Settings.Output.Advanced="Cuir an comas roghainnean adhartach an inneil-chòdachaidh"
+Basic.Settings.Output.EncoderPreset="Ro-shuidheachadh an inneil-chòdachaidh (nas àirde = nas lugha dhen CPU)"
+Basic.Settings.Output.CustomEncoderSettings="Roghainnean gnàthaichte an inneil-chòdachaidh"
+Basic.Settings.Output.CustomMuxerSettings="Roghainnean gnàthaichte an iompaicheir"
+Basic.Settings.Output.NoSpaceFileName="Gin ainm faidhle gun spàs"
+
+Basic.Settings.Output.Adv.Rescale="Ath-sgèilich an t-às-chur"
+Basic.Settings.Output.Adv.AudioTrack="Traca fuaime"
+Basic.Settings.Output.Adv.Streaming="Sruthadh"
+Basic.Settings.Output.Adv.ApplyServiceSettings="Èignich na roghainnean inneil-chòdachaidh aig an t-seirbheis sruthaidh"
+Basic.Settings.Output.Adv.Audio.Track1="Traca 1"
+Basic.Settings.Output.Adv.Audio.Track2="Traca 2"
+Basic.Settings.Output.Adv.Audio.Track3="Traca 3"
+Basic.Settings.Output.Adv.Audio.Track4="Traca 4"
+Basic.Settings.Output.Adv.Audio.Track5="Traca 5"
+Basic.Settings.Output.Adv.Audio.Track6="Traca 6"
+
+Basic.Settings.Output.Adv.Recording="Clàradh"
+Basic.Settings.Output.Adv.Recording.Type="Seòrsa"
+Basic.Settings.Output.Adv.Recording.Type.Standard="Stannardach"
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Às-chur gnàthaichte (FFmpeg)"
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Cleachd inneal-còdachaidh sruthaidh)"
+Basic.Settings.Output.Adv.Recording.Filename="Fòrmatadh nan ainmean faidhle"
+Basic.Settings.Output.Adv.Recording.OverwriteIfExists="Sgrìobh thairis air faidhle ma tha e ann"
+Basic.Settings.Output.Adv.FFmpeg.Type="Seòrsa às-chur FFmpeg"
+Basic.Settings.Output.Adv.FFmpeg.Type.URL="Às-chuir gu URL"
+Basic.Settings.Output.Adv.FFmpeg.Type.RecordToFile="Às-chuir gu faidhle"
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Fòrmatan clàraidh cumanta"
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Na h-uile faidhle"
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Slighe faidhle no URL"
+Basic.Settings.Output.Adv.FFmpeg.Format="Fòrmat an t-soithich"
+Basic.Settings.Output.Adv.FFmpeg.FormatAudio="Fuaim"
+Basic.Settings.Output.Adv.FFmpeg.FormatVideo="Video"
+Basic.Settings.Output.Adv.FFmpeg.FormatDefault="Am fòrmat tùsail"
+Basic.Settings.Output.Adv.FFmpeg.FormatDesc="Tuairisgeul air fòrmat an t-soithich"
+Basic.Settings.Output.Adv.FFmpeg.FormatDescDef="Chaidh codec fuaime/video a thuairmeas o shlighe an fhaidhle no URL"
+Basic.Settings.Output.Adv.FFmpeg.AVEncoderDefault="An t-inneal-còdachaidh tùsail"
+Basic.Settings.Output.Adv.FFmpeg.AVEncoderDisable="Cuir an t-inneal-còdachaidh à comas"
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Inneal-còdachaidh video"
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Roghainnean an inneil-chòdachaidh video (ma tha gin ann)"
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Inneal-còdachaidh fuaime"
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Roghainnean an inneil-chòdachaidh fuaime (ma tha gin ann)"
+Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Roghainnean an iompaicheir (ma tha gin ann)"
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="Eadaramh nam frèamaichean-iuchrach (frèam)"
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Seall na h-uile codec (fiù an fheadhainn nach eil co-chòrdail ma dh’fhaoidte)"
+
+FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
+
+FilenameFormatting.TT="%CCYY Am bliadhna, ceithir àireamhan\n%YY Am bliadhna, an dà àireamh mu dheireadh (00-99)\n%MM Am mìos ’na àireamh dheicheach (01-12)\n%DD Latha a’ mhìosa, le pada neoni (01-31)\n%hh An uair san fhòrmat 24u (00-23)\n%mm Am mionaid (00-59)\n%ss An diog (00-61)\n%% Samhla %\n%a Gearr-ainm air latha na seachdaine\n%A Ainm slàn air latha na seachdaine\n%b Gearr-ainm a’ mhìosa\n%B Ainm slàn a’ mhìosa\n%d Latha a’ mhìosa le pada neoni (01-31)\n%H An uair san fhòrmat 24u (00-23)\n%I An uair san fhòrmat 12u (01-12)\n%m Am mìos ’na àireamh dheicheach (01-12)\n%M A’ mhionaid (00-59)\n%p Sònrachadh m no f\n%S An diog (00-61)\n%y am bliadhna, an dà àireamh mu dheireadh (00-99)\n%Y Am bliadhna\n%z Frìth-àireamh ISO 8601 o UTC no\n ainm no giorrachadh na roinn-tìde\n%Z Ainm no giorrachadh na roinn-tìde\n"
+
+Basic.Settings.Video="Video"
+Basic.Settings.Video.Adapter="Adaptar video"
+Basic.Settings.Video.BaseResolution="Dùmhlachd-bhreacaidh bhunasach (a’ chanabhais)"
+Basic.Settings.Video.ScaledResolution="Dùmhlachd-bhreacaidh (sgèilichte) an às-chuir"
+Basic.Settings.Video.DownscaleFilter="Criathrag sgèileachaidh"
+Basic.Settings.Video.DisableAeroWindows="Cuir à comas Aero (Windows a-mhàin)"
+Basic.Settings.Video.FPS="FPS"
+Basic.Settings.Video.FPSCommon="Luachan FPS cumanta"
+Basic.Settings.Video.FPSInteger="Luach FPS slàn"
+Basic.Settings.Video.FPSFraction="Luachan FPS bloigheach"
+Basic.Settings.Video.Numerator="Àireamhaiche"
+Basic.Settings.Video.Denominator="Seòrsaiche"
+Basic.Settings.Video.Renderer="Inneal-reandaraidh"
+Basic.Settings.Video.InvalidResolution="Chan eil luach na dùmhlachd-breacaidh dligheach. Feumaidh e a bhith ’na [leud]x[àirde] (can 1920x1080)"
+Basic.Settings.Video.CurrentlyActive="Tha às-chur video gnìomhach an-dràsta. cuir dheth gach às-chur airson roghainnean a’ video atharrachadh."
+Basic.Settings.Video.DisableAero="Cuir à comas Aero"
+
+Basic.Settings.Video.DownscaleFilter.Bilinear="Dà-loidhneach (as luaithe ach sgleò air le sgèilachadh)"
+Basic.Settings.Video.DownscaleFilter.Bicubic="Dà-chiùbach (sgèileachadh geuraichte, 16 sampallan)"
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (sgèileachadh geuraichte, 32 sampall)"
+
+Basic.Settings.Audio="Fuaim"
+Basic.Settings.Audio.SampleRate="Reat shampallan"
+Basic.Settings.Audio.Channels="Seanailean"
+Basic.Settings.Audio.MeterDecayRate="Reat crìonaidh a’ mheidheadair-fhuaime"
+Basic.Settings.Audio.MeterDecayRate.Fast="Luath"
+Basic.Settings.Audio.MeterDecayRate.Medium="Meadhanach (PPM seòrsa I)"
+Basic.Settings.Audio.MeterDecayRate.Slow="Slaodach (PPM seòrsa II)"
+Basic.Settings.Audio.PeakMeterType="Seòrsa a’ mheidheadair-bharran"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Ball-sampaill de bharr"
+Basic.Settings.Audio.PeakMeterType.TruePeak="Barr fìrinneach (cleachdadh nas àirde a’ CPU)"
+Basic.Settings.Audio.MultiChannelWarning.Enabled="RABHADH: Tha fuaim cuairteachaidh an comas."
+Basic.Settings.Audio.MultichannelWarning="Ma tha thu a’ dèanamh sruthadh, dearbh gun doir an t-seirbheis sruthaidh agad taic an dà chuid ri ion-chur is cluich fuaime cuairteachaidh. Mar eisimpleir, cuiridh Twitch, Facebook 360 Live, Mixer RTMP is Smashcast làn-taic ri fuaim cuairteachaidh. Ged a ghabhas Facebook Live is youTube Live ri sruthan fuaime cuairteachaidh, nì Facebook Live measgachadh sìos stereo dheth agus cha chluich YouTube live ach dà sheanail.\n\nTha criathragan fuaime OBS co-chòrdail ri fuaim cuairteachaidh ged nach doir sinn barantas gun obraich plugain VST."
+Basic.Settings.Audio.MultichannelWarning.Title="A bheil thu airson fuaim cuairteachaidh a chur an comas?"
+Basic.Settings.Audio.MultichannelWarning.Confirm="A bheil thu cinnteach gu bheil thu airson fuaim cuairteachaidh a chur an comas?"
+Basic.Settings.Audio.DesktopDevice="Uidheam fuaime an deasg"
+Basic.Settings.Audio.DesktopDevice2="Uidheam fuaime an deasg 2"
+Basic.Settings.Audio.AuxDevice="Uidheam fuaime micreofoin/taice"
+Basic.Settings.Audio.AuxDevice2="Uidheam fuaime micreofoin/taice 2"
+Basic.Settings.Audio.AuxDevice3="Uidheam fuaime micreofoin/taice 3"
+Basic.Settings.Audio.EnablePushToMute="Cuir an comas brùth-airson-mùchadh"
+Basic.Settings.Audio.PushToMuteDelay="Dàil air brùth-airson-mùchadh"
+Basic.Settings.Audio.EnablePushToTalk="Cuir an comas brùth-airson-bruidhinn"
+Basic.Settings.Audio.PushToTalkDelay="Dàil air brùth-airson-bruidhinn"
+Basic.Settings.Audio.UnknownAudioDevice="[Chan eil uidheam ceangailte no ri fhaighinn]"
+
+Basic.Settings.Advanced="Adhartach"
+Basic.Settings.Advanced.General.ProcessPriority="Prìomhachas a’ phròiseis"
+Basic.Settings.Advanced.General.ProcessPriority.High="Àrd"
+Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="Nas àirde na àbhaisteach"
+Basic.Settings.Advanced.General.ProcessPriority.Normal="Àbhaisteach"
+Basic.Settings.Advanced.General.ProcessPriority.BelowNormal="Nas ìsle na àbhaisteach"
+Basic.Settings.Advanced.General.ProcessPriority.Idle="’Na tàmh"
+Basic.Settings.Advanced.FormatWarning="Rabhadh: Chaidh fòrmatan datha seach NV12 a dhealbhachadh a chum clàraidh agus cha molamaid airson sruthadh iad. Cleachdaidh an sruthadh barrachd dhen CPU ri linn iompachadh air fòrmat nan dathan."
+Basic.Settings.Advanced.Audio.BufferingTime="Ùine bufair na fuaime"
+Basic.Settings.Advanced.Video.ColorFormat="Fòrmat nan dathan"
+Basic.Settings.Advanced.Video.ColorSpace="Spàs dhathan YUV"
+Basic.Settings.Advanced.Video.ColorRange="Rainse dhathan YUV"
+Basic.Settings.Advanced.Video.ColorRange.Partial="Leth-phàirteach"
+Basic.Settings.Advanced.Video.ColorRange.Full="Làn"
+Basic.Settings.Advanced.Audio.MonitoringDevice="Uidheam sgrùdadh fuaime"
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Tùsail"
+Basic.Settings.Advanced.Audio.DisableAudioDucking="Cuir à comas tumadh fuaime Windows"
+Basic.Settings.Advanced.StreamDelay="Dàil an t-sruthaidh"
+Basic.Settings.Advanced.StreamDelay.Duration="Faide (diog)"
+Basic.Settings.Advanced.StreamDelay.Preserve="Glèidh puing a’ ghearraidh (meudaich an dàil) nuair a nithear ath-cheangal"
+Basic.Settings.Advanced.StreamDelay.MemoryUsage="Tuairmse air cleachdadh na cuimhne: %1 MB"
+Basic.Settings.Advanced.Network="Lìonra"
+Basic.Settings.Advanced.Network.BindToIP="Nasg ri IP"
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Cuir an comas an còd lìonraidh ùr"
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Modh foillidheachd ìosail"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Cuir à comas na grad-iuchraichean nuair a bhios am fòcas air a’ phrìomh-uinneag"
+
+Basic.AdvAudio="Roghainnean adhartach na fuaime"
+Basic.AdvAudio.Name="Ainm"
+Basic.AdvAudio.Volume="Àirde (%)"
+Basic.AdvAudio.Mono="Measgaich sìos gu mono"
+Basic.AdvAudio.Panning="Panachadh"
+Basic.AdvAudio.SyncOffset="Frìth-àireamh an t-sioncronachaidh (ms)"
+Basic.AdvAudio.Monitoring="Sgrùdadh fuaime"
+Basic.AdvAudio.Monitoring.None="Gun sgrùdadh"
+Basic.AdvAudio.Monitoring.MonitorOnly="Sgrùdadh a-mhàin (mùch an t-às-chur)"
+Basic.AdvAudio.Monitoring.Both="Sgrùdadh is às-chur"
+Basic.AdvAudio.AudioTracks="Tracaichean"
+
+Basic.Settings.Hotkeys="Grad-iuchraichean"
+Basic.Settings.Hotkeys.Pair="Nì na co-iuchraichean a tha ’gan co-roinneadh le “%1” toglachadh"
+
+Basic.Hotkeys.SelectScene="Gearr leum dhan t-sealladh"
+
+Basic.SystemTray.Show="Seall"
+Basic.SystemTray.Hide="Falaich"
+
+Basic.SystemTray.Message.Reconnecting="Gun cheangal. ’Ga ath-cheangal…"
+
+Hotkeys.Insert="Cuir a-steach"
+Hotkeys.Delete="Sguab às"
+Hotkeys.Home="Home"
+Hotkeys.End="End"
+Hotkeys.PageUp="Page Up"
+Hotkeys.PageDown="Page Down"
+Hotkeys.NumLock="Num Lock"
+Hotkeys.ScrollLock="Scroll Lock"
+Hotkeys.CapsLock="Caps Lock"
+Hotkeys.Backspace="Backspace"
+Hotkeys.Tab="Tab"
+Hotkeys.Print="Print"
+Hotkeys.Pause="Pause"
+Hotkeys.Left="Gu clì"
+Hotkeys.Right="Gu deas"
+Hotkeys.Up="Suas"
+Hotkeys.Down="Sìos"
+Hotkeys.Windows="Windows"
+Hotkeys.Super="Super"
+Hotkeys.Menu="Menu"
+Hotkeys.Space="Space"
+Hotkeys.NumpadNum="%1 air pada nan àireamh"
+Hotkeys.NumpadMultiply="Iomadachadh air pada nan àireamh"
+Hotkeys.NumpadDivide="Roinneadh air pada nan àireamh"
+Hotkeys.NumpadAdd="Cur ris air pada nan àireamh"
+Hotkeys.NumpadSubtract="Toir air falbh air pada nan àireamh"
+Hotkeys.NumpadDecimal="Puing air pada nan àireamh"
+Hotkeys.AppleKeypadNum="%1 (pada nan àireamh)"
+Hotkeys.AppleKeypadMultiply="* (pada nan àireamh)"
+Hotkeys.AppleKeypadDivide="/ (pada nan àireamh)"
+Hotkeys.AppleKeypadAdd="+ (pada nan àireamh)"
+Hotkeys.AppleKeypadSubtract="- (pada nan àireamh)"
+Hotkeys.AppleKeypadDecimal=". (pada nan àireamh)"
+Hotkeys.AppleKeypadEqual="= (pada nan àireamh)"
+Hotkeys.MouseButton="%1 na luchaige"
+
+Mute="Mùch"
+Unmute="Dì-mhùch"
+Push-to-mute="Brùth-airson-mùchadh"
+Push-to-talk="Brùth-airson-bruidhinn"
+
+SceneItemShow="Seall “%1”"
+SceneItemHide="Falaich “%1”"
+
+OutputWarnings.NoTracksSelected="Feumaidh tu traca no dhà a thaghadh"
+OutputWarnings.MultiTrackRecording="Rabhadh: Tha fòrmatan ann (can FLV) nach cuir taic ri iomadh traca sa chlàradh"
+OutputWarnings.MP4Recording="Rabhadh: Cha ghabh clàraidhean a thèid a shàbhaladh gu MP4 aiseag mura gabh am faidhle a thoirt gu crìch (can ri linn tuisleachaidh, call cumhachd is msaa.). Nam bu toigh leat iomadh traca fuaime a chlàradh, mholamaid gun cleachd thu MKV agus gun iompaich thu an clàradh gu mp4 nuair a bhios e deiseil (Faidhle->Iompaich clàraidhean)"
+
+FinalScene.Title="Sguab às an sealladh"
+FinalScene.Text="Feumaidh do shealladh a bhith ann."
+
+
+
+
diff --git a/UI/data/locale/gl-ES.ini b/UI/data/locale/gl-ES.ini
index 4411f70b1..c90dfc701 100644
--- a/UI/data/locale/gl-ES.ini
+++ b/UI/data/locale/gl-ES.ini
@@ -413,3 +413,6 @@ OutputWarnings.NoTracksSelected="Debes seleccionar, cando menos, unha pista"
OutputWarnings.MultiTrackRecording="Aviso: certos formatos (caso de FLV) non admiten múltiples pistas para gravar"
+
+
+
diff --git a/UI/data/locale/he-IL.ini b/UI/data/locale/he-IL.ini
index 051cb50bb..0f8e6a029 100644
--- a/UI/data/locale/he-IL.ini
+++ b/UI/data/locale/he-IL.ini
@@ -28,16 +28,21 @@ Browse="עיון"
Mono="מונו"
Stereo="סטריאו"
DroppedFrames="השמטת תמונות %1 (%2%)"
+StudioProgramProjector="מקרן מסך מלא (תוכנה)"
PreviewProjector="מקרן מסך מלא (תצוגה מקדימה)"
SceneProjector="מקרן מסך מלא (סצנה)"
SourceProjector="מקרן מסך מלא (מקור)"
+StudioProgramWindow="מקרן חלון (תוכנה)"
PreviewWindow="הקרנה בחלון (תצוגה מקדימה)"
SceneWindow="הקרנה בחלון (סצנה)"
SourceWindow="הקרנה בחלון (מקור)"
+MultiviewProjector="תצוגה מרובה (מסך מלא)"
+MultiviewWindowed="תצוגה מרובה (חלון)"
Clear="נקה"
Revert="החזר לקדמותו"
Show="הצג"
Hide="הסתר"
+UnhideAll="הצג הכל"
Untitled="ללא כותרת"
New="חדש"
Duplicate="שכפל"
@@ -66,6 +71,13 @@ PasteDuplicate="הדבק (כפול)"
RemuxRecordings="רימיקס הקלטות"
Next="הבא"
Back="קודם"
+Defaults="ברירות מחדל"
+HideMixer="מוחבא בתוך המיקסר"
+TransitionOverride="מעבר דרוס"
+None="ללא"
+StudioMode.Preview="תצוגה מקדימה"
+StudioMode.Program="תוכנה"
+ShowInMultiview="הראה בתצוגה מרובה"
AlreadyRunning.Title="OBS פועל כבר"
AlreadyRunning.Text="OBS פועל כבר! אלא אם התכוונת לעשות את זה, אנא סגור כל מופע קיים לפני נסיון להפעיל מופע חדש. אנא בדוק אם קיים מופע הגדר ממוזער במגש המערכת."
@@ -110,6 +122,7 @@ Basic.AutoConfig.StreamPage.PerformBandwidthTest="הערכת קצב נתונים
Basic.AutoConfig.StreamPage.PreferHardwareEncoding="העדף קידוד בחומרה"
Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="קידוד בחומרה מבטלת רוב השימוש ב- CPU, אבל עשויים לדרוש קצב נתונים גבוה יותר בכדי להשיג את אותה רמת איכות."
Basic.AutoConfig.StreamPage.StreamWarning.Title="אזהרת זרם"
+Basic.AutoConfig.StreamPage.StreamWarning.Text="בדיקת רוחב הפס עומדת להזרים נתוני וידאו אקראיים ללא שמע לערוץ שלך. אם אתה מסוגל, מומלץ לבטל באופן זמני את שמירת קטעי הוידאו של הזרם וקבע את הזרם לפרטי עד לאחר שהבדיקה תסתיים. להמשיך?"
Basic.AutoConfig.TestPage="תוצאות סופיות"
Basic.AutoConfig.TestPage.SubTitle.Testing="התוכנית מתבצעת עכשיו סט של בדיקות כדי להעריך את ההגדרות המיטביות"
Basic.AutoConfig.TestPage.SubTitle.Complete="הבדיקה הסתיימה"
@@ -156,6 +169,7 @@ Updater.NoUpdatesAvailable.Title="אין עדכונים זמינים"
Updater.NoUpdatesAvailable.Text="אין עדכונים זמינים כעת"
Updater.FailedToLaunch="נכשלה הפעלת העידכון"
Updater.GameCaptureActive.Title="לכידת משחק פעיל"
+Updater.GameCaptureActive.Text="לכידת משחק נמצאת כעת בשימוש. בבקשה סגור את המשחקים/תוכנות שנמצאים בלכידה (או הפעל מחדש את ווינדוס) ונסה שינת."
QuickTransitions.SwapScenes="החלף סצינות תצוגה מקדימה/פלט לאחר המעבר"
QuickTransitions.SwapScenesTT="החלף הסצינות של התצוגה המקדימה ושל הפלט לאחר המעבר (באם הסצינה המקורית של הפלט עדיין קיימת). \n פעולה זו לא תבטל כל שינוי שייתכן ובוצע לסצינה המקורית של הפלט."
@@ -200,6 +214,7 @@ ConfirmRemove.TextMultiple="האם אתה בטוח שברצונך להסיר %1
Output.StartStreamFailed="נכשלה הפעלת זרימה"
Output.StartRecordingFailed="נכשלה הפעלת הקלטה"
Output.StartReplayFailed="נכשלה הפעלת מאגר החוזר"
+Output.StartFailedGeneric="הפלט נכשל. בבקשה בדוק את הרישומים עבור. \n\nNote: אם אתה משתמש בNVNEC או AMD מקודדים, הקפד שמנהלי ההתקן של הכרטיס מסך מעודכנים."
Output.ConnectFail.Title="ההתחברות נכשלה"
Output.ConnectFail.BadPath="URL לא חוקי של נתיב או חיבור. נא בדוק את ההגדרות שלך כדי לוודא כי הם נכונים."
@@ -214,6 +229,8 @@ Output.RecordNoSpace.Title="אין די שטח דיסק"
Output.RecordNoSpace.Msg="אין די שטח דיסק כדי להמשיך הקלטה."
Output.RecordError.Title="שגיאה הקלטה"
Output.RecordError.Msg="אירעה שגיאה לא מוגדרת בזמן ההקלטה."
+Output.ReplayBuffer.NoHotkey.Title="אין מקש קיצור שנבחר!"
+Output.ReplayBuffer.NoHotkey.Msg="אין hotkey שמור למאגר החוזר. בבקשה הגדר את \"שמור\" hotkey לשימוש עבור שמירת מאגר חוזר להקלטות."
Output.BadPath.Title="נתיב קובץ לא תקין"
Output.BadPath.Text="נתיב פלט הקובץ שהוגדר אינו חוקי. נא בדוק את הגדרות כדי לוודא שנתיב קובץ תקני נקבע."
@@ -295,6 +312,8 @@ AddProfile.Text="אנא הזן את שם הפרופיל"
RenameProfile.Title="שנה שם פרופיל"
+Basic.Main.MixerRename.Title="שינוי שם מקור שמע"
+Basic.Main.MixerRename.Text="בבקשה הכנס את שם קובץ השמע"
Basic.Main.PreviewDisabled="תצוגה מקדימה אינה זמינה כעת"
@@ -374,6 +393,7 @@ Basic.Main.AddSourceHelp.Text="צריכה להיות לפחות סצנה אחת
Basic.Main.Scenes="סצינות"
Basic.Main.Sources="מקורות"
+Basic.Main.Controls="בקרה"
Basic.Main.Connecting="מתחבר..."
Basic.Main.StartRecording="התחל הקלטה"
Basic.Main.StartReplayBuffer="התחל מאגר החוזר"
@@ -429,19 +449,27 @@ Basic.MainMenu.Edit.AdvAudio="מאפייני קול מתקדמים(&A)"
Basic.MainMenu.View="&מבט"
Basic.MainMenu.View.Toolbars="&סרגלי כלים"
+Basic.MainMenu.View.Docks="עגינה"
+Basic.MainMenu.View.Docks.ResetUI="איפוס UI"
+Basic.MainMenu.View.Docks.LockUI="נעילת UI"
Basic.MainMenu.View.Toolbars.Listboxes="&תיבות רשימה"
Basic.MainMenu.View.SceneTransitions="&מעברי סצינות"
Basic.MainMenu.View.StatusBar="&שורת מצב"
+Basic.MainMenu.View.Fullscreen.Interface="ממשק מסך מלא"
Basic.MainMenu.SceneCollection="אוסף סצינות(&S)"
Basic.MainMenu.Profile="פרופיל(&P)"
Basic.MainMenu.Profile.Import="ייבא פרופיל"
Basic.MainMenu.Profile.Export="ייצא פרופיל"
+Basic.MainMenu.SceneCollection.Import="ייבא אוסף סצינות"
+Basic.MainMenu.SceneCollection.Export="ייצא אוסף סצנות"
Basic.MainMenu.Profile.Exists="הפרופיל קיים כבר"
+Basic.MainMenu.SceneCollection.Exists="אוסף הסצנות כבר קיים"
Basic.MainMenu.Tools="& כלים"
Basic.MainMenu.Help="עזרה(&H)"
+Basic.MainMenu.Help.HelpPortal="עזרה & פורטל"
Basic.MainMenu.Help.Website="בקר אתר(&W)"
Basic.MainMenu.Help.Logs="קבצי יומן רישום(&L)"
Basic.MainMenu.Help.Logs.ShowLogs="הצג קבצי יומן רישום(&S)"
@@ -458,10 +486,12 @@ Basic.Settings.General="כללי"
Basic.Settings.General.Theme="ערכת עיצוב"
Basic.Settings.General.Language="שפה"
Basic.Settings.General.EnableAutoUpdates="בדוק באופן אוטומטי אם יש עדכונים בעת ההפעלה"
+Basic.Settings.General.OpenStatsOnStartup="פתח סטטיסטיקת דיאלוג בעת ההפעלה"
Basic.Settings.General.WarnBeforeStartingStream="הצג תיבת דו-שיח לאישור בעת הפעלת זרם נתונים"
Basic.Settings.General.WarnBeforeStoppingStream="הצג תיבת דו-שיח לאישור בעת עצירת זרם נתונים"
Basic.Settings.General.Projectors="מקרנים"
Basic.Settings.General.HideProjectorCursor="הסתר את הסמן מעל מקרנים"
+Basic.Settings.General.ProjectorAlwaysOnTop="הפוך מקרנים תמיד בעליון"
Basic.Settings.General.Snapping="יישור הצמדת מקור"
Basic.Settings.General.ScreenSnapping="הצמד מקורות לקצה המסך"
Basic.Settings.General.CenterSnapping="הצמד מקורות למרכז אופקי ואנכי"
@@ -469,10 +499,15 @@ Basic.Settings.General.SourceSnapping="הצמד מקור למקור נוסף"
Basic.Settings.General.SnapDistance="רגישות צמד"
Basic.Settings.General.RecordWhenStreaming="הקלטה אוטומטית בעת הזרמת נתונים"
Basic.Settings.General.KeepRecordingWhenStreamStops="המשך הקלטה כאשר הזרמת נתונים מפסיקה"
+Basic.Settings.General.ReplayBufferWhileStreaming="הפעל מאגר חוזר באופן אוטומטי בעת הזרמה"
+Basic.Settings.General.KeepReplayBufferStreamStops="השאר את המאגר החוזר פעיל כאשר ההזרמה מפסיקה"
Basic.Settings.General.SysTray="מגש המערכת"
Basic.Settings.General.SysTrayWhenStarted="מזער למגש המערכת בתחילה"
Basic.Settings.General.SystemTrayHideMinimize="מזער תמיד למגש המערכת במקום שורת המשימות"
Basic.Settings.General.SaveProjectors="שמור את המקרנים ביציאה"
+Basic.Settings.General.SwitchOnDoubleClick="מעבר לסצנה על ידי הקלקה כפולה"
+Basic.Settings.General.StudioPortraitLayout="אפשר פריסה אנכית/דיוקן"
+Basic.Settings.General.MultiviewLayout="פריסת תצוגה מרובה"
Basic.Settings.Stream="זרם נתונים"
Basic.Settings.Stream.StreamType="סוג זרם נתונים"
@@ -592,6 +627,14 @@ Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (חד בשינוי קנה
Basic.Settings.Audio="אודיו"
Basic.Settings.Audio.SampleRate="קצב דגימה"
Basic.Settings.Audio.Channels="ערוצים"
+Basic.Settings.Audio.MeterDecayRate="קצב דעיכה ממד שמע"
+Basic.Settings.Audio.MeterDecayRate.Fast="מהיר"
+Basic.Settings.Audio.MeterDecayRate.Medium="בינוני (סוג I PPM)"
+Basic.Settings.Audio.MeterDecayRate.Slow="איטי (סוג II PPM)"
+Basic.Settings.Audio.MultiChannelWarning.Enabled="אזהרה: שמע צליל היקפי מאופשר."
+Basic.Settings.Audio.MultichannelWarning="אם הזרימה, בדוק את הזרמת השירות תומך בסראונד סאונד להבלע ואת היקפי הסראונד פלייבק. טוויץ',פייסבוק,360 Liev, מיקסר RTMP, Smashcast דוגמאות לאיפה שסראונד סאונד הוא נתמך. למרות פייסבוק לייב ויוטיוב לייב שניהם מאפשרים סראונד להבלע, פייסבוק לייב משנה לסטריאו ויוטיוב לייב מפעיל בשני ערוצים. \n\nOBS Studio מסנן עם הסראונד סאונד, למרות תמיכת תוסף VST אינו מאובטח."
+Basic.Settings.Audio.MultichannelWarning.Title="האם להפעיל שמע צליל היקפי?"
+Basic.Settings.Audio.MultichannelWarning.Confirm="אתה בטוח שאתה רוצה לאפשר קול שמע מקיף?"
Basic.Settings.Audio.DesktopDevice="התקן שמע בשולחן עבודה"
Basic.Settings.Audio.DesktopDevice2="התקן שמע בשולחן עבודה 2"
Basic.Settings.Audio.AuxDevice="התקן שמע מיקרופון/עזר"
@@ -608,6 +651,7 @@ Basic.Settings.Advanced.General.ProcessPriority="עדיפות תהליך"
Basic.Settings.Advanced.General.ProcessPriority.High="גבוה"
Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="מעל לרגיל"
Basic.Settings.Advanced.General.ProcessPriority.Normal="רגיל"
+Basic.Settings.Advanced.General.ProcessPriority.BelowNormal="מתחת לעדיפות רגילה"
Basic.Settings.Advanced.General.ProcessPriority.Idle="לא פעיל"
Basic.Settings.Advanced.FormatWarning="אזהרה: תבניות צבע שונות מ-NV12 נועדו בעיקר עבור הקלטה, והם אינם מומלצות בעת הזרמת נתונים. הזרמת נתונים עלולה לגרום למשאבי עיבוד מוגברים כתוצאה מהמרת תבנית צבע."
Basic.Settings.Advanced.Audio.BufferingTime="זמן אוגר שמע"
@@ -701,3 +745,6 @@ OutputWarnings.MP4Recording="אזהרה: הקלטות שנשמרו MP4 תהיה
FinalScene.Title="מחק סצינה"
FinalScene.Text="נדרשת סצנה אחת לפחות."
+
+
+
diff --git a/UI/data/locale/hi-IN.ini b/UI/data/locale/hi-IN.ini
new file mode 100644
index 000000000..16c8600bb
--- /dev/null
+++ b/UI/data/locale/hi-IN.ini
@@ -0,0 +1,124 @@
+
+Language="हिन्दी"
+Region="इंडिया"
+
+OK="ठीक है"
+Apply="लागू करें"
+Cancel="रद्द करें"
+Close="बंद करें"
+Save="सहेजें"
+Discard="छोड़ें"
+Yes="हां"
+No="नहीं"
+Add="जोड़ें"
+Remove="निकालें"
+Rename="नाम बदलें"
+Interact="बातचीत"
+MoveUp="ऊपर ले जाएँ"
+MoveDown="नीचे ले जाएँ"
+Settings="सेटिंग्स"
+Display="प्रदर्शन"
+Name="नाम"
+Exit="निकास"
+Clear="साफ़ करें"
+Revert="पहले जैसा करें"
+Show="दिखाएँ"
+Hide="छुपायें"
+UnhideAll="कुछ ना छिपाएं"
+New="नया"
+Duplicate="दोहरा"
+Left="बाएं"
+Right="दाएँ"
+Top="शीर्ष"
+Bottom="नीचे"
+Hours="घंटे"
+Minutes="मिनट"
+Seconds="सेकंड"
+Copy="प्रतिलिपि"
+Paste="चिपकाएँ"
+Next="अगले"
+Back="वापस"
+
+
+
+BandwidthTest.Region.Asia="एशिया"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UI/data/locale/hr-HR.ini b/UI/data/locale/hr-HR.ini
index c7ca15a24..744d7c6be 100644
--- a/UI/data/locale/hr-HR.ini
+++ b/UI/data/locale/hr-HR.ini
@@ -604,3 +604,6 @@ OutputWarnings.NoTracksSelected="Morate odabrati makar jednu traku"
OutputWarnings.MultiTrackRecording="Upozorenje: Određeni formati (kao što je FLV) ne podržavaju više traka po snimku"
+
+
+
diff --git a/UI/data/locale/hu-HU.ini b/UI/data/locale/hu-HU.ini
index d8b91f036..6413a5584 100644
--- a/UI/data/locale/hu-HU.ini
+++ b/UI/data/locale/hu-HU.ini
@@ -14,7 +14,7 @@ No="Nem"
Add="Hozzáadás"
Remove="Eltávolítás"
Rename="Átnevezés"
-Interact="Kölcsönhatás"
+Interact="Ráhatás"
Filters="Szűrők"
Properties="Tulajdonságok"
MoveUp="Mozgatás Fel"
@@ -78,6 +78,8 @@ None="Nincs"
StudioMode.Preview="Előnézet"
StudioMode.Program="Program"
ShowInMultiview="Mutatás Multiviewban"
+VerticalLayout="Függőleges elrendezés"
+Group="Csoport"
AlreadyRunning.Title="Az OBS már fut"
AlreadyRunning.Text="Az OBS már fut! Ha nem teljesen biztos benne mit tesz, akkor állítsa le az összes már futó OBS programot. Ha a programot úgy állította be, hogy rendszertálcára minimalizálódjon, akkor ellenőrizze, hogy ott megtalálható e."
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="Visszajátszás puffer leáll..."
Basic.Main.StopStreaming="Stream leállítása"
Basic.Main.StoppingStreaming="Stream leállítása..."
Basic.Main.ForceStopStreaming="Stream leállítása (Késleltetés elvetése)"
+Basic.Main.Group="Csoport %1"
+Basic.Main.GroupItems="Kijelölt elemek csoportosítása"
+Basic.Main.Ungroup="Csoport megszüntetése"
Basic.MainMenu.File="&Fájl"
Basic.MainMenu.File.Export="&Exportálás"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="&Eszközök"
Basic.MainMenu.Help="&Segítség"
Basic.MainMenu.Help.HelpPortal="Segítség &Portál"
Basic.MainMenu.Help.Website="Weboldal megtekintése"
+Basic.MainMenu.Help.Discord="Csatlakozás &Discord szerverre"
Basic.MainMenu.Help.Logs="&Naplófájlok"
Basic.MainMenu.Help.Logs.ShowLogs="&Naplófájlok megjelenítése"
Basic.MainMenu.Help.Logs.UploadCurrentLog="&Aktuális Naplófájl feltöltése"
Basic.MainMenu.Help.Logs.UploadLastLog="&Utolsó Naplófájl feltöltése"
Basic.MainMenu.Help.Logs.ViewCurrentLog="&Jelenlegi Naplófájl megtekintése"
Basic.MainMenu.Help.CheckForUpdates="Frissítések ellenőrzése"
+Basic.MainMenu.Help.CrashLogs="Hibajelentések (&R)"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="Hibajelentések megjelenítése (&S)"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="Utolsó Hibajelentés feltöltése (&L)"
Basic.Settings.ProgramRestart="A beállítások érvénybe lépéséhez a program újraindítása szükséges."
Basic.Settings.ConfirmTitle="Változtatások megerősítése"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Mindig a rendszertálcára minima
Basic.Settings.General.SaveProjectors="Projektorok mentése kilépéskor"
Basic.Settings.General.SwitchOnDoubleClick="Átmenet a jelenetre dupla kattintás esetén"
Basic.Settings.General.StudioPortraitLayout="Portré/függőleges elrendezés engedélyezése"
+Basic.Settings.General.Multiview="MultiView"
+Basic.Settings.General.Multiview.MouseSwitch="Kattintás a jelenetek közötti váltáshoz"
+Basic.Settings.General.Multiview.DrawSourceNames="Jelenetek neveinek megjelenítése"
+Basic.Settings.General.Multiview.DrawSafeAreas="Biztonságos területek kirajzolása (EBU R 95)"
Basic.Settings.General.MultiviewLayout="MultiView elrendezés"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Vízszintes, Felső"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Vízszintes, Alsó"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Függőleges, Bal"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Függőleges, Jobb"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Vízszintes, felső (8 jelenet)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Vízszintes, alsó (8 jelenet)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Függőleges, bal (8 jelenet)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Függőleges, jobb (8 jelenet)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Vízszintes, felső (24 jelenet)"
Basic.Settings.Stream="Stream"
Basic.Settings.Stream.StreamType="Stream típusa"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="Hangmérő halkulási aránya"
Basic.Settings.Audio.MeterDecayRate.Fast="Gyors"
Basic.Settings.Audio.MeterDecayRate.Medium="Medium (Típus | PPM)"
Basic.Settings.Audio.MeterDecayRate.Slow="Lassú (Típus II PPM)"
+Basic.Settings.Audio.PeakMeterType="Csúcsmérték Típus"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Csúcsminta"
+Basic.Settings.Audio.PeakMeterType.TruePeak="Valós Csúcs (Magasabb CPU használat)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="Figyelmeztetés: Surround sound hang engedélyezve van."
Basic.Settings.Audio.MultichannelWarning="Ha közvetít, ellenőrizze, hogy a stream szolgáltatója támogatja mind a surround sound kezelést, mind pedig a surround sound lejátszást. Twitch, Facebook 360 Live, Mixer RTMP, Smashcast a legjobb példa, hogy mely platformokon van teljes támogatás. Ellenben a Facebook Live és a YouTube Live minden elfogadja a térhangzású hangot, a Facebook Live lekeveri stereora és a YouTube Live csak két csatornát játszik le.\n\nOBS audio szűrők kompatibilisek a térhangzású hanggal, viszont a VST bővítmények támogatása nem garantált."
Basic.Settings.Audio.MultichannelWarning.Title="Engedélyezi a surround hangzást?"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="Hálózat"
Basic.Settings.Advanced.Network.BindToIP="IP-hez rendelés"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Új hálózatkezelő kód engedélyezése"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Alacsony késleltetésű mód"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Gyorsbillentyűk letiltása, ha a fő ablak fókuszban van"
Basic.AdvAudio="Speciális hangtulajdonságok"
Basic.AdvAudio.Name="Név"
@@ -749,3 +767,12 @@ OutputWarnings.MP4Recording="Figyelem: Az MP4-be mentett állományok javíthata
FinalScene.Title="Jelenet törlése"
FinalScene.Text="Legalább egy jelenetnek lennie kell."
+NoSources.Title="Nincsenek Források"
+NoSources.Text="Úgy fest, hogy nem adott hozzá valamilyen videoforrást, úgyhogy fekete képet fog adni. Biztos benne, hogy ezt kívánja tenni?"
+NoSources.Text.AddSource="Hozzáadhat forrásokat bármikor a + ikonra kattintva a Források doboz alatt a fő ablakban."
+
+ChangeBG="Szín megadása"
+CustomColor="Egyedi szín"
+
+BrowserSource.EnableHardwareAcceleration="Böngészőforrás hardveres támogatásának engedélyezése"
+
diff --git a/UI/data/locale/it-IT.ini b/UI/data/locale/it-IT.ini
index 39d72e9cf..2a121b429 100644
--- a/UI/data/locale/it-IT.ini
+++ b/UI/data/locale/it-IT.ini
@@ -78,6 +78,8 @@ None="Nessuno"
StudioMode.Preview="Anteprima"
StudioMode.Program="Programma"
ShowInMultiview="Mostra in Vista-Multipla"
+VerticalLayout="Layout verticale"
+Group="Gruppo"
AlreadyRunning.Title="OBS è già in esecuzione"
AlreadyRunning.Text="OBS è già in esecuzione! A meno che non si intendeva effettuare questa operazione, chiudere tutte le istanze esistenti di OBS prima di provare a eseguirne una nuova. Se avete OBS impostato per minimizzarsi nell'area di notifica, si prega di controllare per vedere se è ancora in esecuzione."
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="Arresto del buffer di riproduzione in corso..."
Basic.Main.StopStreaming="Ferma trasmissione"
Basic.Main.StoppingStreaming="Arresto trasmissione..."
Basic.Main.ForceStopStreaming="Ferma trasmissione (annulla ritardo)"
+Basic.Main.Group="Gruppo %1"
+Basic.Main.GroupItems="Elementi selezionati"
+Basic.Main.Ungroup="Separa"
Basic.MainMenu.File="&File"
Basic.MainMenu.File.Export="&Esporta"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="&Strumenti"
Basic.MainMenu.Help="&Aiuto"
Basic.MainMenu.Help.HelpPortal="Portale Aiuto"
Basic.MainMenu.Help.Website="Visita il sito"
+Basic.MainMenu.Help.Discord="Join & Discord Server"
Basic.MainMenu.Help.Logs="File di &log"
Basic.MainMenu.Help.Logs.ShowLogs="&Visualizza i file di Log"
Basic.MainMenu.Help.Logs.UploadCurrentLog="Carica file di log &corrente"
Basic.MainMenu.Help.Logs.UploadLastLog="Carica u<imo file di log"
Basic.MainMenu.Help.Logs.ViewCurrentLog="&Vedi attuale file di log"
Basic.MainMenu.Help.CheckForUpdates="Controlla aggiornamenti"
+Basic.MainMenu.Help.CrashLogs="Segnalazione c&rash "
+Basic.MainMenu.Help.CrashLogs.ShowLogs="Vi&sualizza Segnalazione crash"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="Carica l'u<imo Crash Report"
Basic.Settings.ProgramRestart="Il programma deve essere riavviato perché questi cambiamenti abbiano effetto."
Basic.Settings.ConfirmTitle="Conferma cambiamenti"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Minimizza sempre nel vassoio di s
Basic.Settings.General.SaveProjectors="Salva i proiettori all'uscita"
Basic.Settings.General.SwitchOnDoubleClick="Transizione alla scena al doppio-click"
Basic.Settings.General.StudioPortraitLayout="Attiva il layout Orizzontale/Verticale"
+Basic.Settings.General.Multiview="Visualizzazione Multipla"
+Basic.Settings.General.Multiview.MouseSwitch="Clicca per passare da una scena all'altra"
+Basic.Settings.General.Multiview.DrawSourceNames="Visualizza il nome della scena"
+Basic.Settings.General.Multiview.DrawSafeAreas="Evidenziare aree sicure (EBU R 95)"
Basic.Settings.General.MultiviewLayout="Layout a viste multiple"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Orizzontale, Alto"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Orizzontale, Basso"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Orizzontale, Sinistra"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Orizzontale, Destra"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Orizzontale, In alto (8 scene)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Orizzontale, In basso (8 scene)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Verticale, A sinistra (8 scene)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Verticale, A destra (8 scene)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Orizzontale, In alto (24 scene)"
Basic.Settings.Stream="Trasmissione"
Basic.Settings.Stream.StreamType="Tipo di stream"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="Tasso di decadimento audio"
Basic.Settings.Audio.MeterDecayRate.Fast="Veloce"
Basic.Settings.Audio.MeterDecayRate.Medium="Medio (Tipo 1 PPM)"
Basic.Settings.Audio.MeterDecayRate.Slow="Lento (Tipo 2 PPM)"
+Basic.Settings.Audio.PeakMeterType="Modalità Peak Meter"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Sample Peak"
+Basic.Settings.Audio.PeakMeterType.TruePeak="True Peak (alto utilizzo della CPU)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="ATTENZIONE: L'audio Surround è attivo."
Basic.Settings.Audio.MultichannelWarning="Per lo streaming, accertati che il servizio di streaming supporti sia integrazione che riproduzione di suono surround. Twitch, Facebook 360 Live, Mixer RTMP e Smashcast sono esempi di servizi in cui il suono surround è completamente supportato. Anche se sia Facebook Live che YouTube Live implementano il suono surround, Facebook Live lo converte in stereo, mentre YouTube Live ne riproduce solo due canali.\n\nI filtri di OBS Studio sono compatibili con il suono surround, anche se il supporto per il plugin VST non è garantito."
Basic.Settings.Audio.MultichannelWarning.Title="Abilitare l'audio surround?"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="Rete"
Basic.Settings.Advanced.Network.BindToIP="Associa a IP"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Attiva il nuovo codice di rete"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Modalità a bassa latenza"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Disabilitare i tasti di scelta rapida quando la finestra principale è a fuoco"
Basic.AdvAudio="Proprietà audio avanzate"
Basic.AdvAudio.Name="Nome"
@@ -749,3 +767,7 @@ OutputWarnings.MP4Recording="Avviso: le registrazioni salvate in MP4 non saranno
FinalScene.Title="Elimina scena"
FinalScene.Text="Deve esserci almeno una scena."
+NoSources.Title="Nessuna sorgente"
+
+
+
diff --git a/UI/data/locale/ja-JP.ini b/UI/data/locale/ja-JP.ini
index f1f4da49a..6dc4ddc78 100644
--- a/UI/data/locale/ja-JP.ini
+++ b/UI/data/locale/ja-JP.ini
@@ -28,15 +28,15 @@ Browse="参照"
Mono="モノラル"
Stereo="ステレオ"
DroppedFrames="ドロップしたフレーム %1 (%2%)"
-StudioProgramProjector="全画面プロジェクター (プログラム)"
+StudioProgramProjector="全画面プロジェクター (番組)"
PreviewProjector="全画面プロジェクター (プレビュー)"
SceneProjector="全画面プロジェクター (シーン)"
SourceProjector="全画面プロジェクター (ソース)"
-StudioProgramWindow="ウィンドウ付きプロジェクター (プログラム)"
+StudioProgramWindow="ウィンドウ プロジェクター (番組)"
PreviewWindow="ウィンドウ プロジェクター (プレビュー)"
SceneWindow="ウィンドウ プロジェクター (シーン)"
SourceWindow="ウィンドウ プロジェクター (ソース)"
-MultiviewProjector="マルチビュー (フルスクリーン)"
+MultiviewProjector="マルチビュー (全画面)"
MultiviewWindowed="マルチビュー (ウィンドウ)"
Clear="クリア"
Revert="元に戻す"
@@ -78,6 +78,8 @@ None="未設定"
StudioMode.Preview="プレビュー"
StudioMode.Program="番組"
ShowInMultiview="マルチビューで表示"
+VerticalLayout="垂直レイアウト"
+Group="グループ化"
AlreadyRunning.Title="OBSは既に実行中です"
AlreadyRunning.Text="OBSは既に実行されています! この操作を行うつもりがない限り、新しいインスタンスを実行する前に既存のOBSインスタンスを終了してください。OBSがシステムトレイに最小化されるように設定されている場合は、まだ実行中であるかどうかを確認してください。"
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="リプレイバッファー停止処理中..."
Basic.Main.StopStreaming="配信終了"
Basic.Main.StoppingStreaming="配信停止処理中..."
Basic.Main.ForceStopStreaming="配信停止 (遅延破棄)"
+Basic.Main.Group="グループ化 %1"
+Basic.Main.GroupItems="選択したアイテムのグループ化"
+Basic.Main.Ungroup="グループ化の解除"
Basic.MainMenu.File="ファイル(&F)"
Basic.MainMenu.File.Export="エクスポート(&E)"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="ツール(&T)"
Basic.MainMenu.Help="ヘルプ(&H)"
Basic.MainMenu.Help.HelpPortal="ヘルプポータル(&P)"
Basic.MainMenu.Help.Website="ウェブサイト(&W)"
+Basic.MainMenu.Help.Discord="Discordサーバーに参加(&D)"
Basic.MainMenu.Help.Logs="ログファイル(&L)"
Basic.MainMenu.Help.Logs.ShowLogs="ログファイルを表示(&S)"
Basic.MainMenu.Help.Logs.UploadCurrentLog="現在のログファイルをアップロード(&C)"
Basic.MainMenu.Help.Logs.UploadLastLog="最新のログファイルをアップロード(&L)"
Basic.MainMenu.Help.Logs.ViewCurrentLog="現在のログを表示(&V)"
Basic.MainMenu.Help.CheckForUpdates="更新を確認"
+Basic.MainMenu.Help.CrashLogs="クラッシュレポート(&R)"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="クラッシュレポートを表示(&S)"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="最新のクラッシュレポートをアップロード(&L)"
Basic.Settings.ProgramRestart="これらの設定を有効にするためにはプログラムの再起動が必要です。"
Basic.Settings.ConfirmTitle="変更確認"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="タスクバーの代わりにシ
Basic.Settings.General.SaveProjectors="終了時にプロジェクターを保存する"
Basic.Settings.General.SwitchOnDoubleClick="ダブルクリックしたときにシーンに遷移"
Basic.Settings.General.StudioPortraitLayout="縦長/垂直レイアウトを有効にする"
+Basic.Settings.General.Multiview="マルチビュー"
+Basic.Settings.General.Multiview.MouseSwitch="クリックするとシーンを切り替える"
+Basic.Settings.General.Multiview.DrawSourceNames="シーン名を表示"
+Basic.Settings.General.Multiview.DrawSafeAreas="安全領域を描画 (EBU R95)"
Basic.Settings.General.MultiviewLayout="マルチビューレイアウト"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="水平, 上"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="水平, 下"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="垂直, 左"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="垂直, 右"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="水平上側 (8 シーン)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="水平下側 (8 シーン)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="垂直左側 (8 シーン)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="垂直右側 (8 シーン)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="水平上側 (24 シーン)"
Basic.Settings.Stream="配信"
Basic.Settings.Stream.StreamType="配信種別"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="音声メーターの減衰率"
Basic.Settings.Audio.MeterDecayRate.Fast="速い"
Basic.Settings.Audio.MeterDecayRate.Medium="中 (タイプ I PPM)"
Basic.Settings.Audio.MeterDecayRate.Slow="遅い (タイプ II PPM)"
+Basic.Settings.Audio.PeakMeterType="ピークメーターの種類"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="サンプル ピーク"
+Basic.Settings.Audio.PeakMeterType.TruePeak="真のピーク (CPU使用率高い)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="警告: サラウンド音声が有効です。"
Basic.Settings.Audio.MultichannelWarning="配信する場合、配信サービスがサラウンド音声の取り込みと再生の両方をサポートしているかどうかを確認してください。Twitch、Facebook 360 Live、Mixer RTMP、Smashcastは、サラウンド音声が完全にサポートされている例です。しかしFacebook LiveとYouTube Liveはどちらもサラウンド取り込みを受信しますが、Facebook Liveはステレオにダウンミックスし、YouTube Liveは2チャンネルのみしか再生できません。\n\nVSTプラグインのサポートは保証されていませんが、OBS音声フィルタはサラウンド音声と互換性があります。"
Basic.Settings.Audio.MultichannelWarning.Title="サラウンド音声を有効にしますか?"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="ネットワーク"
Basic.Settings.Advanced.Network.BindToIP="IP選択"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="新しいネットワークコードを有効にする"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="低遅延モード"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="メインウィンドウにフォーカスがあるときはホットキーを無効にする"
Basic.AdvAudio="オーディオの詳細プロパティ"
Basic.AdvAudio.Name="名称"
@@ -749,3 +767,12 @@ OutputWarnings.MP4Recording="警告: ファイルをファイナライズ出来
FinalScene.Title="シーンを削除する"
FinalScene.Text="1つ以上のシーンが必要です。"
+NoSources.Title="ソース無し"
+NoSources.Text="映像ソースをまだ追加していないようなので、空白の画面だけが出力されます。よろしいですか?"
+NoSources.Text.AddSource="メインウィンドウのソースボックスの下にある + アイコンをクリックすると、いつでもソースを追加することができます。"
+
+ChangeBG="色の設定"
+CustomColor="カスタム色"
+
+BrowserSource.EnableHardwareAcceleration="ブラウザソースのハードウェアアクセラレーションを有効にする"
+
diff --git a/UI/data/locale/ka-GE.ini b/UI/data/locale/ka-GE.ini
index 2b8684d83..eb59e36f4 100644
--- a/UI/data/locale/ka-GE.ini
+++ b/UI/data/locale/ka-GE.ini
@@ -1,6 +1,9 @@
+Language="ქართული"
+Region="საქართველო"
-OK="კაი"
+OK="კარგი"
+Apply="მიღება"
Cancel="გაუქმება"
Close="დახურვა"
Save="შენახვა"
@@ -11,16 +14,32 @@ No="არა"
Add="დამატება"
Remove="წაშლა"
Rename="გადარქმევა"
+Interact="ურთიერთქმედება"
Filters="ფილტრები"
+Properties="პარამეტრები"
MoveUp="ზევით"
MoveDown="ქვევით"
Settings="პარამეტრები"
+Display="ეკრანი"
Name="სახელი"
Exit="გასვლა"
Mixer="მიქშერი"
Browse="მოძიება"
Mono="მონო"
Stereo="სტერეო"
+DroppedFrames="კადრების ვარდნა %1 (%2%)"
+StudioProgramProjector="სრულეკრანიანი ჩვენება (შედეგი)"
+PreviewProjector="სრულეკრანიანი ჩვენება (შეთვალიერება)"
+SceneProjector="სრულეკრანიანი ჩვენება (სცენა)"
+SourceProjector="სრულეკრანიანი ჩვენება (წყარო)"
+StudioProgramWindow="ფანჯარაში ჩვენება (შედეგი)"
+PreviewWindow="ფანჯარაში ჩვენება (შეთვალიერება)"
+SceneWindow="ფანჯარაში ჩვენება (სცენა)"
+SourceWindow="ფანჯარაში ჩვენება (წყარო)"
+MultiviewProjector="მრავალხედიანი (სრულ ეკრანზე)"
+MultiviewWindowed="მრავალხედიანი (ფანჯარაში)"
+Clear="გასუფთავება"
+Revert="დაბრუნება"
Show="ჩვენება"
Hide="დამალვა"
UnhideAll="ყველაფრის გამოჩენა"
@@ -30,118 +49,730 @@ Duplicate="დუბლირება"
Enable="ჩართვა"
DisableOSXVSync="OSX V-Sync-ის გამორთვა"
ResetOSXVSyncOnExit="OSX V-Sync-ის გადატვირთვა გასვლისას"
+HighResourceUsage="დამშიფრავი გადაიტვირთა! სცადეთ ვიდეოს პარამეტრების შემცირება, ან უფრო სწრაფი შიფრაციის პარამეტრების გამოყენება."
+Transition="გადასვლა"
+QuickTransitions="სწრაფი გადასვლები"
+Left="მარცხნივ"
+Right="მარჯვნივ"
+Top="ზემოთ"
+Bottom="ქვემოთ"
+Reset="განულება"
+Hours="საათი"
Minutes="წუთი"
Seconds="წამი"
-
-
-
-
-
-
+Deprecated="მოძველებული"
+ReplayBuffer="უკან გადახვევის დრო"
+Import="შემოტანა"
+Export="გატანა"
+Copy="დაკოპირება"
+Paste="ჩასმა"
+PasteReference="ჩასმა (ბმული)"
+PasteDuplicate="ჩასმა (ასლი)"
+RemuxRecordings="ჩანაწერების გარდაქმნა"
+Next="შემდეგ"
+Back="უკან"
+Defaults="ნაგულისხმევი"
+HideMixer="ხმის მიქშერში დამალვა"
+TransitionOverride="გადასვლა გადაფარვით"
+None="არცერთი"
+StudioMode.Preview="შეთვალიერება"
+StudioMode.Program="შედეგი"
+ShowInMultiview="მრავალხედიანი ჩვენება"
+VerticalLayout="შვეული განლაგება"
+Group="დაჯგუფება"
+
+AlreadyRunning.Title="OBS უკვე გაშვებულია"
+AlreadyRunning.Text="OBS უკვე გაშვებულია! გთხოვთ, ჯერ დახუროთ OBS-ის ყველა გაშვებული პროცესი, სანამ ახლის გაშვებას შეეცდებით. თუ მითითებული გაქვთ, რომ დახურვის ნაცვლად, OBS სისტემურ არეში უნდა ჩაიკეცოს, გთხოვთ მანდაც გადაამოწმოთ, დარჩენილი ხომ არაა."
+AlreadyRunning.LaunchAnyway="მაინც გაშვება"
+
+Copy.Filters="ფილტრების დაკოპირება"
+Paste.Filters="ფილტრების ჩასმა"
+
+BandwidthTest.Region="რეგიონი"
+BandwidthTest.Region.US="შეერთებული შტატები"
+BandwidthTest.Region.EU="ევროპა"
+BandwidthTest.Region.Asia="აზია"
+BandwidthTest.Region.Other="სხვა"
+
+Basic.FirstStartup.RunWizard="გსურთ, გაეშვას თვითგამართვის მეგზური? ამასთან, შეგიძლიათ პარამეტრების ხელით გამართვა მთავარ ფანჯარაში, პარამეტრების ღილაკზე დაწკაპებით."
+Basic.FirstStartup.RunWizard.BetaWarning="(შენიშვნა: თვითგამართვის მეგზური ჯერჯერობით საცდელია)"
+Basic.FirstStartup.RunWizard.NoClicked="თუ გადაიფიქრებთ, თვითგამართვის გაშვება შეგეძლებათ ნებისმიერ დროს, ხელსაწყოების მენიუდან."
+
+Basic.AutoConfig="თვითგამართვის მეგზური"
+Basic.AutoConfig.Beta="თვითგამართვის მეგზური (Beta)"
+Basic.AutoConfig.ApplySettings="პარამეტრების მიღება"
+Basic.AutoConfig.StartPage="გამოყენების შესახებ"
+Basic.AutoConfig.StartPage.SubTitle="მიუთითეთ, თუ რა მიზნით გსურთ პროგრამის გამოყენება"
+Basic.AutoConfig.StartPage.PrioritizeStreaming="ნაკადების გაშვებისთვის მორგება, ვიდეოს ჩაწერა მეორეხარისხოვანია"
+Basic.AutoConfig.StartPage.PrioritizeRecording="ვიდეოების ჩაწერისთვის მორგება, ნაკადების გაშვებას არ ვაპირებ"
+Basic.AutoConfig.VideoPage="ვიდეოს პარამეტრები"
+Basic.AutoConfig.VideoPage.SubTitle="მიუთითეთ სასურველი ვიდეო-პარამეტრები"
+Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="მიმდინარეს გამოყენება (%1x%2)"
+Basic.AutoConfig.VideoPage.BaseResolution.Display="ეკრანი %1 (%2x%3)"
+Basic.AutoConfig.VideoPage.FPS.UseCurrent="მიმდინარეს გამოყენება (%1)"
+Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="60 ან 30, თუმცა უმჯობესია 60, როცა შესაძლებელია"
+Basic.AutoConfig.VideoPage.FPS.PreferHighRes="60 ან 30, თუმცა უმჯობესია მაღალი გარჩევადობით"
+Basic.AutoConfig.VideoPage.CanvasExplanation="შენიშვნა: ეკრანის ფონის (ძირითადი) გაფართოება არაა აუცილებელი გაშვებული ნაკადის ან გადაღებული ვიდეოს გაფართოებას ემთხვეოდეს. ცალკეული ნაკადის/ვიდეოს ზომები შეიძლება შემცირდეს, რესურსების მოხმარების ან ბიტური სიხშირის შესამცირებლად."
+Basic.AutoConfig.StreamPage="ნაკადის მონაცემები"
+Basic.AutoConfig.StreamPage.SubTitle="გთხოვთ მიუთითოთ ნაკადის მონაცემები"
+Basic.AutoConfig.StreamPage.Service="მომსახურება"
+Basic.AutoConfig.StreamPage.Service.ShowAll="ყველას ჩვენება..."
+Basic.AutoConfig.StreamPage.Server="სერვერი"
+Basic.AutoConfig.StreamPage.StreamKey="ნაკადის გასაღები"
+Basic.AutoConfig.StreamPage.StreamKey.LinkToSite="(ბმული)"
+Basic.AutoConfig.StreamPage.PerformBandwidthTest="მიახლოებითი ბიტური სიხშირე, გამოთვლილი ქსელის გამტარუნარიანობის შემოწმებით (რამდენიმე წუთს შესაძლოა გასტანოს)"
+Basic.AutoConfig.StreamPage.PreferHardwareEncoding="აპარატურული დაშიფვრის გამოყენება"
+Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="აპარატურული დაშიფვრა შეამცირებს პროცესორზე დატვირთვას, თუმცა შესაძლოა მეტი ბიტური სიხშირე დასჭირდეს, იმავე ხარისხის მისაღწევად."
+Basic.AutoConfig.StreamPage.StreamWarning.Title="გაფრთხილება ნაკადის გაშვებისას"
+Basic.AutoConfig.StreamPage.StreamWarning.Text="ქსელის გამტარუნარიანობის შემოწმება გულისხმობს, თქვენს არხზე შემთხვევითი ვიდეოფაილების ხმის გაშერე ნაკადად გაშვებას. სასურველია, თუ დროებით გათიშავთ ნაკადის შენახვის შესაძლებლობას და შემოწმების დასრულებამდე ამ ნაკადს გადაიყვანთ პირად რეჟიმში. გსურთ, განაგრძოთ?"
+Basic.AutoConfig.TestPage="საბოლოო შედეგები"
+Basic.AutoConfig.TestPage.SubTitle.Testing="პროგრამა ახლა უშვებს სხვადასხვა სახის შემოწმებებს, სასურველი პარამეტრების დადგენის მიზნით"
+Basic.AutoConfig.TestPage.SubTitle.Complete="შემოწმება დასრულებულია"
+Basic.AutoConfig.TestPage.TestingBandwidth="ქსელის გამტარუნარიანობის შემოწმება, შესაძლოა რამდენიმე წუთს გასტანოს..."
+Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="უკავშირდება სერვერს: %1..."
+Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="ვერცერთ სერვერთან დაკავშირება ვერ მოხერხდა. შეამოწმეთ თქვენი ინტერნეტთან კავშირი და სცადეთ ხელახლა."
+Basic.AutoConfig.TestPage.TestingBandwidth.Server="გამტარუნარიანობის შემოწმება სერვერისთვის: %1"
+Basic.AutoConfig.TestPage.TestingStreamEncoder="ნაკადის დამშიფრავის შემოწმება, შესაძლოა ერთ წუთამდე გასტანოს..."
+Basic.AutoConfig.TestPage.TestingRecordingEncoder="ჩანაწერის დამშიფრავის შემოწმება, შესაძლოა ერთ წუთამდე გასტანოს..."
+Basic.AutoConfig.TestPage.TestingRes="გაფართოებების შემოწმება, შესაძლოა რამდენიმე წუთს გასტანოს..."
+Basic.AutoConfig.TestPage.TestingRes.Fail="დამშიფრავის ჩართვა ვერ მოხერხდა"
+Basic.AutoConfig.TestPage.TestingRes.Resolution="მოწმდება %1x%2 %3 FPS (კადრ/წმ)..."
+Basic.AutoConfig.TestPage.Result.StreamingEncoder="ნაკადის დამშიფრავი"
+Basic.AutoConfig.TestPage.Result.RecordingEncoder="ჩანაწერის დამშიფრავი"
+Basic.AutoConfig.TestPage.Result.Header="პროგრამის მიერ დადგენილი მიახლოებითი პარამეტრები, რომელიც მეტად გამოსადეგია თქვენთვის:"
+Basic.AutoConfig.TestPage.Result.Footer="თუ გსურთ ამ პარამეტრების გამოყენება, დააწკაპეთ „პარამეტრების მიღებას“. თუ გსურთ პარამეტრების ხელახლა დადგენა, დააწკაპეთ ღილაკს „უკან“. ხოლო, თუ პარამეტრების ხელით გამართვა გსურთ, დააწკაპეთ „გაუქმებას“ და გადადით პარამეტრებზე."
+
+Basic.Stats="სტატისტიკა"
+Basic.Stats.CPUUsage="CPU დატვირთვა"
+Basic.Stats.HDDSpaceAvailable="ხელმისაწვდომი ადგილი დისკზე"
+Basic.Stats.MemoryUsage="მეხსიერების დატვირთვა"
+Basic.Stats.AverageTimeToRender="კადრის დამუშავების საშუალო დრო"
+Basic.Stats.SkippedFrames="დაშიფვრის დაყოვნების გამო გამოტოვებული კადრები"
+Basic.Stats.MissedFrames="დამუშავების დაყოვნების გამო გამოტოვებული კადრები"
+Basic.Stats.Output.Stream="ნაკადი"
+Basic.Stats.Output.Recording="ჩაწერა"
+Basic.Stats.Status="მდგომარეობა"
+Basic.Stats.Status.Recording="მიმდინარეობს"
+Basic.Stats.Status.Live="ეთერშია"
+Basic.Stats.Status.Reconnecting="ხელახლა დაკავშირება"
Basic.Stats.Status.Inactive="არააქტიური"
+Basic.Stats.DroppedFrames="გამოტოვებული კადრები (ქსელი)"
+Basic.Stats.MegabytesSent="საერთო მოცულობა"
+Basic.Stats.Bitrate="ბიტური სიხშირე"
+Updater.Title="ხელმისაწვდომია განახლება"
+Updater.Text="ხელმისაწვდომია განახლება:"
Updater.UpdateNow="განაახლე ახლა"
-
-
+Updater.RemindMeLater="მოგვიანებით შეხსენება"
+Updater.Skip="ვერსიის გამოტოვება"
+Updater.Running.Title="პროგრამა ამჟამად გაშვებულია"
+Updater.Running.Text="გაშვებულია გამომავალი სიგნალები, გთხოვთ, ჯერ გამორთოთ ყველა მოქმედი გამომავალი სიგნალი, სანამ განახლებას შეეცდებით"
+Updater.NoUpdatesAvailable.Title="განახლებები არაა ხელმისაწვდომი"
+Updater.NoUpdatesAvailable.Text="ამჟამად, განახლებები არაა ხელმისაწვდომი"
+Updater.FailedToLaunch="განახლების გაშვება ვერ მოხერხდა"
+Updater.GameCaptureActive.Title="მიმდინარეობს თამაშის ჩაწერა"
+Updater.GameCaptureActive.Text="ამჟამად გაშვებულია თამაშის ჩამწერი ბიბლიოთეკა. გთხოვთ, შეწყვიტოთ ყველა თამაშის/პროგრამის ჩაწერა (ან თავიდან ჩართოთ windows) და სცადოთ ხელახლა."
+
+QuickTransitions.SwapScenes="გადასვლის შემდეგ, შესათვალიერებელი და გამომავალი სცენებისთვის ადგილის გაცვლა"
+QuickTransitions.SwapScenesTT="გადასვლის შემდეგ, შესათვალიერებელი და გამომავალი სცენებისთვის ადგილის გაცვლა (თუ ჯერ კიდევ არსებობს გამომავალი სცენის თავდაპირველი ასლი).\nამის შედეგად, გამომავალი სცენის თავდაპირველ ვარიანტზე გაკეთებული ცვლილებები, არ გაუქმდება."
+QuickTransitions.DuplicateScene="სცენის გაორკეცება"
+QuickTransitions.DuplicateSceneTT="ერთი და იმავე სცენის შესწორებისას, საშუალებას იძლევა წყარო გარდაიქმნას, გამომავალი შედეგის შეცვლის გარეშე.\nწყაროს პარამეტრების ჩასასწორებლად, გამომავალი შედეგის შეცვლის გარეშე, ჩართეთ 'წყაროს გაორკეცება'\nმოცემული მნიშვნელობის ცვლილება გამოიწვევს მიმდინარე გამომავალი სცენის საწყისზე დაბრუნებას (თუ ჯერ კიდევ არსებობს)."
+QuickTransitions.EditProperties="წყაროს გაორკეცება"
+QuickTransitions.EditPropertiesTT="ერთი და იმავე სცენის შესწორებისას, საშუალებას იძლევა წყაროს პარამეტრები ჩასწორდეს, გამომავალი შედეგის შეცვლის გარეშე.\nმისი გამოყენება შესაძლებელია, მხოლოდ 'სცენის გაორკეცების' შემთხვევაში\nცალკეული წყაროები (მათ შორის გადაღებული ან არსებული მედიაფაილები) არ იძლევა ამის საშუალებას და მათი განცალკევებით ჩასწორება შეუძლებელია.\nმოცემული მნიშვნელობის ცვლილება გამოიწვევს მიმდინარე გამომავალი სცენის საწყისზე დაბრუნებას (თუ ჯერ კიდევ არსებობს).\n\nგაფრთხილება: წყაროს გაორკეცების შედეგად, შესაძლოა სისტემის და ვიდეოდაფის დატვირთვა გაიზარდოს."
+QuickTransitions.HotkeyName="სწრაფი გადასვლა: %1"
+
+Basic.AddTransition="გასამართი გადასვლის დამატება"
+Basic.RemoveTransition="გასამართი გადასვლის ამოშლა"
+Basic.TransitionProperties="გადასვლის პარამეტრები"
+Basic.SceneTransitions="სცენებს შორის გადასვლები"
Basic.TransitionDuration="ხანგრძლივობა"
+Basic.TogglePreviewProgramMode="სტუდიური რეჟიმი"
+TransitionNameDlg.Text="გთხოვთ, მიუთითოთ გადასვლის სახელი"
+TransitionNameDlg.Title="გადასვლის სახელი"
+TitleBar.Profile="პროფილი"
+TitleBar.Scenes="სცენები"
+NameExists.Title="სახელი უკვე არსებობს"
+NameExists.Text="სახელი უკვე გამოყენებულია."
+NoNameEntered.Title="გთხოვთ, შეიყვანოთ მართებული სახელი"
+NoNameEntered.Text="ცარიელი სახელი დაუშვებელია."
+ConfirmStart.Title="გაეშვას ნაკადი?"
+ConfirmStart.Text="ნამდვილად გსურთ პირდაპირი ეთერის გაშვება?"
+ConfirmStop.Title="შეწყდეს ნაკადი?"
+ConfirmStop.Text="ნამდვილად გსურთ პირდაპირი ეთერის შეწყვეტა?"
ConfirmExit.Title="OBS-დან გასვლა?"
-
-
-
-
-
-
+ConfirmExit.Text="OBS ამჟამად მოქმედია. ყველა გაშვებული ნაკადი/ჩაწერა შეწყდება. ნამდვილად გსურთ გამოსვლა?"
+
+ConfirmRemove.Title="წაშლის დადასტურება"
+ConfirmRemove.Text="ნამდვილად გსურთ, წაიშალოს '$1'?"
+ConfirmRemove.TextMultiple="ნამდვილად გსურთ, წაიშალოს %1 მათგანი?"
+
+Output.StartStreamFailed="ნაკადის გაშვება ვერ მოხერხდა"
+Output.StartRecordingFailed="ჩაწერის დაწყება ვერ მოხერხდა"
+Output.StartReplayFailed="გადახვევის ჩართვა ვერ მოხერხდა"
+Output.StartFailedGeneric="სიგნალის გაშვება ვერ მოხერხდა. გთხოვთ, შეამოწმეთ აღრიცხვის ფაილი, დამატებითი ინფორმაციისთვის.\n\nშენიშვნა: თუ იყენებთ NVENC ან AMD დამშიფრავებს, დარწმუნდით რომ თქვენი ვიდეოდაფის პროგრამა განახლებულია."
+
+Output.ConnectFail.Title="დაკავშირება ვერ მოხერხდა"
+Output.ConnectFail.BadPath="არამართებული მისამართი ან დასაკავშირებელი URL ბმული. გთხოვთ, გადაამოწმოთ თქვენი პარამეტრების სისწორე."
+Output.ConnectFail.ConnectFailed="სერვერთან დაკავშირება ვერ მოხერხდა"
+Output.ConnectFail.InvalidStream="ვერ ხერხდება მითითებულ არხთან ან ნაკადის გასაღებთან დაკავშირება, გთხოვთ, გადაამოწმოთ თქვენი ნაკადის გასაღები. თუ სწორია, მაშინ შესაძლოა ხარვეზი იყოს სერვერთან დაკავშირებისას."
+Output.ConnectFail.Error="მოულოდნელი შეცდომა წარმოიქმნა სერვერთან დაკავშირებისას. დამატებითი ინფორმაციისთვის იხილეთ აღრიცხვის ფაილი."
+Output.ConnectFail.Disconnected="სერვერთან კავშირი გაწყვეტილია."
+
+Output.RecordFail.Title="ჩაწერის დაწყება ვერ მოხერხდა"
+Output.RecordFail.Unsupported="ამ სახის გამომავალი სიგნალი ან არაა მხარდაჭერილი, ან არ იძლევა ერთზე მეტი ხმოვანი ფაილის გამოყენების საშუალებას. გთხოვთ, გადაამოწმოთ თქვენი პარამეტრები და სცადოთ ხელახლა."
+Output.RecordNoSpace.Title="არასაკმარისი ადგილი დისკზე"
+Output.RecordNoSpace.Msg="დისკზე აღარაა საკმარისი ადგილი ჩაწერის გასაგრძელებლად."
+Output.RecordError.Title="შეცდომა ჩაწერისას"
+Output.RecordError.Msg="ჩაწერის დროს დაუდგენელი სახის შეცდომა წარმოიშვა."
+Output.ReplayBuffer.NoHotkey.Title="სწრაფი ღილაკი არაა მითითებული!"
+Output.ReplayBuffer.NoHotkey.Msg="სწრაფი ღილაკი არაა მითითებული გადახვევისთვის. გთხოვთ, მიუთითოთ „შენახვის“ ღილაკი, გადასახვევი მასალის შესანახად."
+
+Output.BadPath.Title="ფაილის არამართებული მისამართი"
+Output.BadPath.Text="ფაილის მითითებული მდებარეობა არასწორია. გთხოვთ, გადაამოწმოთ თქვენი პარამეტრების სისწორე."
+
+LogReturnDialog="ჩანაწერი წარმატებით აიტვირთა"
LogReturnDialog.CopyURL="ბმულის კოპირება"
+LogReturnDialog.ErrorUploadingLog="შეცდომა აღრიცხვის ფაილის ატვირთვისას"
+LicenseAgreement="სალიცენზიო შეთანხმება"
+LicenseAgreement.PleaseReview="გთხოვთ, გაეცნოთ ლიცენზიის დადგენილებებს OBS-ით სარგებლობამდე. ამ პროგრამის გამოყენებით თქვენ ადასტურებთ, რომ წაიკითხეთ და ეთანხმებით GNU General Public v2.0 ლიცენზიის პირობებს. გთხოვთ, გადაადგილოთ გვერდი ქვემოთ, ხელშეკრულების სრულად სანახავად."
+LicenseAgreement.ClickIAgreeToContinue="თუ თანახმა ხართ, მიიღოთ ხელშეკრულების პირობები, დააწკაპეთ ღილაკს „ვეთანხმები“. OBS-ით სარგებლობისთვის, აუცილებელია წინამდებარე პირობების მიღება."
+LicenseAgreement.IAgree="ვეთანხმები"
LicenseAgreement.Exit="გასვლა"
-
-
+Remux.SourceFile="OBS ჩაწერა"
+Remux.TargetFile="საბოლოო ფაილი"
+Remux.Remux="ხელახლა მულტიპლექსირება"
+Remux.OBSRecording="OBS ჩაწერა"
+Remux.FinishedTitle="გარდაქმნა დასრულებულია"
+Remux.Finished="ჩანაწერის გარდაქმნა დასრულდა"
+Remux.FinishedError="ჩანაწერის გარდაქმნა დასრულდა, თუმცა ფაილი, შესაძლოა არასრული იყოს"
+Remux.SelectRecording="ფაილის არჩევა OBS ჩანაწერისთვის…"
+Remux.SelectTarget="საბოლოო ფაილის არჩევა …"
+Remux.FileExistsTitle="საბოლოო ფაილი უკვე არჩეულია"
+Remux.FileExists="საბოლოო ფაილი უკვე არჩეულია, გსურთ მისი შეცვლა?"
+Remux.ExitUnfinishedTitle="მიმდინარეობს გარდაქმნა"
+Remux.ExitUnfinished="გარდაქმნა ჯერ არ დასრულებულა, ახლავე შეწყვეტის შედეგად, დასამუშავებელი საბოლოო ფაილი გამოუსადეგარი გახდება.\nნამდვილად გსურთ გარდაქმნის შეწყვეტა?"
+
+UpdateAvailable="განახლება ხელმისაწვდომია"
+UpdateAvailable.Text="ხელმისაწვდომია ვერსია %1.%2.%3. დააწკაპეთ ჩამოსატვირთად"
+
+Basic.DesktopDevice1="Desktop Audio"
+Basic.DesktopDevice2="Desktop Audio 2"
+Basic.AuxDevice1="Mic/Aux"
Basic.AuxDevice2="Mic/Aux 2"
Basic.AuxDevice3="Mic/Aux 3"
Basic.AuxDevice4="Mic/Aux 4"
+Basic.Scene="სცენა"
+Basic.DisplayCapture="ეკრანის გადაღება"
+Basic.Main.PreviewConextMenu.Enable="შეთვალიერების შესაძლებლობა"
+ScaleFiltering="მასშტაბირების ფილტრი"
+ScaleFiltering.Point="წერტილოვანი"
+ScaleFiltering.Bilinear="ორხაზოვანი"
+ScaleFiltering.Bicubic="ბიკუბური"
+ScaleFiltering.Lanczos="Lanczos"
+Deinterlacing="Deinterlacing"
+Deinterlacing.Discard="გაუქმება"
Deinterlacing.Retro="Retro"
Deinterlacing.Blend="Blend"
Deinterlacing.Blend2x="Blend 2x"
+Deinterlacing.Linear="Linear"
Deinterlacing.Linear2x="Linear 2x"
Deinterlacing.Yadif="Yadif"
Deinterlacing.Yadif2x="Yadif 2x"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+Deinterlacing.TopFieldFirst="ზედა ველიდან"
+Deinterlacing.BottomFieldFirst="ქვედა ველიდან"
+
+VolControl.SliderUnmuted="ხმის სამართავი '%1': %2"
+VolControl.SliderMuted="ხმის სამართავი '%1': %2 (ამჟამად დადუმებული)"
+VolControl.Mute="'%1' დადუმება"
+VolControl.Properties="'%1' პარამეტრები"
+
+Basic.Main.AddSceneDlg.Title="სცენის დამატება"
+Basic.Main.AddSceneDlg.Text="გთხოვთ, მიუთითოთ სცენის დასახელება"
+
+Basic.Main.DefaultSceneName.Text="სცენა %1"
+
+Basic.Main.AddSceneCollection.Title="სცენის კრებულის დამატება"
+Basic.Main.AddSceneCollection.Text="გთხოვთ, მიუთითოთ სცენის კრებულის დასახელება"
+
+Basic.Main.RenameSceneCollection.Title="სცენის კრებულის გადარქმევა"
+
+AddProfile.Title="პროფილის დამატება"
+AddProfile.Text="გთხოვთ, მიუთითოთ პროფილის დასახელება"
+
+RenameProfile.Title="პროფილის გადარქმევა"
+
+Basic.Main.MixerRename.Title="ხმის წყაროს გადარქმევა"
+Basic.Main.MixerRename.Text="გთხოვთ, მიუთითოთ ხმის წყაროს დასახელება"
+
+
+Basic.Main.PreviewDisabled="შეთვალიერება მიუწვდომელია"
+
+Basic.SourceSelect="წყაროს შექმნა/მითითება"
+Basic.SourceSelect.CreateNew="ახლის შექმნა"
+Basic.SourceSelect.AddExisting="არსებულის დამატება"
+Basic.SourceSelect.AddVisible="წყაროს გამოჩენა"
+
+Basic.PropertiesWindow="'%1' პარამეტრები"
+Basic.PropertiesWindow.AutoSelectFormat="%1 (თვითშერჩევა: %2)"
+Basic.PropertiesWindow.SelectColor="ფერის შერჩევა"
+Basic.PropertiesWindow.SelectFont="შრიფტის შერჩევა"
+Basic.PropertiesWindow.ConfirmTitle="პარამეტრები შეცვლილია"
+Basic.PropertiesWindow.Confirm="ცვლილებები არაა დამახსოვრებული. გსურთ მათი შენახვა?"
+Basic.PropertiesWindow.NoProperties="პარამეტრები მიუწვდომელია"
+Basic.PropertiesWindow.AddFiles="ფაილების დამატება"
+Basic.PropertiesWindow.AddDir="საქაღალდის დამატება"
+Basic.PropertiesWindow.AddURL="მისამართის/URL-ს დამატება"
+Basic.PropertiesWindow.AddEditableListDir="საქაღალდის დამატება '%1'-ში"
+Basic.PropertiesWindow.AddEditableListFiles="ფაილების დამატება '%1'"
+Basic.PropertiesWindow.AddEditableListEntry="ელემენტის დამატება '%1'-ში"
+Basic.PropertiesWindow.EditEditableListEntry="ელემენტის ჩასწორება '%1'-ში"
+
+Basic.PropertiesView.FPS.Simple="ჩვეულებრივი FPS-მნიშვნელობები"
+Basic.PropertiesView.FPS.Rational="რაციონალურ რიცხვიანი FPS-მნიშვნელობები"
+Basic.PropertiesView.FPS.ValidFPSRanges="დაშვებული FPS-შუალედები:"
+
+Basic.InteractionWindow="'%1'-თან ურთიერთქმედება"
+
+Basic.StatusBar.Reconnecting="კავშირი გაწყვეტილია. ხელახლა დაკავშირება %2 წამში (%1 მცდელობა)"
+Basic.StatusBar.AttemptingReconnect="ხელახლა დაკავშირება... (%1 მცდელობა)"
+Basic.StatusBar.ReconnectSuccessful="ხელახლა დაუკავშირდა წარმატებით"
+Basic.StatusBar.Delay="დაყოვნება (%1 წმ)"
+Basic.StatusBar.DelayStartingIn="დაყოვნება (დაიწყება %1 წამში)"
+Basic.StatusBar.DelayStoppingIn="დაყოვნება (შეწყდება %1 წამში)"
+Basic.StatusBar.DelayStartingStoppingIn="დაყოვნება (შეწყდება %1 წამში, დაიწყება %2 წამში)"
+
+Basic.Filters="ფილტრები"
+Basic.Filters.AsyncFilters="ხმოვანი/ვიდეო ფილტრები"
+Basic.Filters.AudioFilters="ხმოვანი ფილტრები"
+Basic.Filters.EffectFilters="დასამუშავებელი ფილტრები"
+Basic.Filters.Title="'%1' ფილტრები"
+Basic.Filters.AddFilter.Title="ფილტრის დასახელება"
+Basic.Filters.AddFilter.Text="გთხოვთ, მიუთითოთ ფილტრის დასახელება"
+
+Basic.TransformWindow="სცენის ელემენტის გარდაქმნა"
Basic.TransformWindow.Position="პოზიცია"
-
-
-
-
-
-
-
+Basic.TransformWindow.Rotation="მობრუნება"
+Basic.TransformWindow.Size="ზომა"
+Basic.TransformWindow.Alignment="განლაგების გასწორება"
+Basic.TransformWindow.BoundsType="შემომსაზღვრელი ჩარჩოს სახეები"
+Basic.TransformWindow.BoundsAlignment="განლაგების გასწორება შემომსაზღვრელ ჩარჩოში"
+Basic.TransformWindow.Bounds="შემომსაზღვრელი ჩარჩოს ზომა"
+Basic.TransformWindow.Crop="შემოჭრა"
+
+Basic.TransformWindow.Alignment.TopLeft="მარცხნივ ზემოთ"
+Basic.TransformWindow.Alignment.TopCenter="შუაში ზემოთ"
+Basic.TransformWindow.Alignment.TopRight="მარჯვნივ ზემოთ"
+Basic.TransformWindow.Alignment.CenterLeft="მარცხნივ შუაში"
+Basic.TransformWindow.Alignment.Center="შუაში"
+Basic.TransformWindow.Alignment.CenterRight="მარჯვნივ შუაში"
+Basic.TransformWindow.Alignment.BottomLeft="მარცხნივ ქვემოთ"
+Basic.TransformWindow.Alignment.BottomCenter="შუაში ქვემოთ"
+Basic.TransformWindow.Alignment.BottomRight="მარჯვნივ ქვემოთ"
+
+Basic.TransformWindow.BoundsType.None="საზღვრების გარეშე"
+Basic.TransformWindow.BoundsType.MaxOnly="მხოლოდ უმაღლესი ზომა"
+Basic.TransformWindow.BoundsType.ScaleInner="ზომის მიყვანა შიდა საზღვრებამდე"
+Basic.TransformWindow.BoundsType.ScaleOuter="ზომის მიყვანა გარე საზღვრებამდე"
+Basic.TransformWindow.BoundsType.ScaleToWidth="ზომის დაყვანა საზღვრების სიგანემდე"
+Basic.TransformWindow.BoundsType.ScaleToHeight="ზომის დაყვანა საზღვრების სიმაღლემდე"
+Basic.TransformWindow.BoundsType.Stretch="გაწელვა საზღვრებამდე"
+
+Basic.Main.AddSourceHelp.Title="წყარო ვერ დაემატება"
+Basic.Main.AddSourceHelp.Text="საჭიროა, სულ მცირე 1 სცენა წყაროს დასამატებლად."
+
+Basic.Main.Scenes="სცენები"
+Basic.Main.Sources="წყაროები"
+Basic.Main.Controls="სამართავი"
+Basic.Main.Connecting="უკავშირდება..."
+Basic.Main.StartRecording="ჩაწერის დაწყება"
+Basic.Main.StartReplayBuffer="გადახვევის ჩართვა"
+Basic.Main.StartStreaming="ნაკადის გაშვება"
+Basic.Main.StopRecording="ნაკადის შეწყვეტა"
+Basic.Main.StoppingRecording="ჩაწერის შეწყვეტა..."
+Basic.Main.StopReplayBuffer="გადახვევის გამორთვა"
+Basic.Main.StoppingReplayBuffer="გადახვევა გამოირთვება..."
+Basic.Main.StopStreaming="ნაკადის შეწყვეტა"
+Basic.Main.StoppingStreaming="ნაკადი წყდება..."
+Basic.Main.ForceStopStreaming="ნაკადი წყდება (დაყოვნება უქმდება)"
+Basic.Main.Group="ჯგუფი %1"
+Basic.Main.GroupItems="შერჩეულების დაჯგუფება"
+Basic.Main.Ungroup="განჯგუფება"
+
+Basic.MainMenu.File="&ფაილი"
+Basic.MainMenu.File.Export="&გატანა"
+Basic.MainMenu.File.Import="&შემოტანა"
+Basic.MainMenu.File.ShowRecordings="&ჩანაწერების ჩვენება"
+Basic.MainMenu.File.Remux="ჩანაწერების ხელახლა მულტი&პლექსირება"
+Basic.MainMenu.File.Settings="&პარამეტრები"
+Basic.MainMenu.File.ShowSettingsFolder="პარამეტრების საქაღალდის ჩვენება"
+Basic.MainMenu.File.ShowProfileFolder="პროფილის საქაღალდის ჩვენება"
+Basic.MainMenu.AlwaysOnTop="&ყოველთვის წინა პლანზე"
+Basic.MainMenu.File.Exit="&გამოსვლა"
+
+Basic.MainMenu.Edit="&ჩასწორება"
+Basic.MainMenu.Edit.Undo="&დაბრუნება"
+Basic.MainMenu.Edit.Redo="&კვლავ შესრულება"
+Basic.MainMenu.Edit.UndoAction="&დაბრუნება $1"
+Basic.MainMenu.Edit.RedoAction="&კვლავ შესრულება $1"
+Basic.MainMenu.Edit.LockPreview="შეთვალიერების &ჩაკეტვა"
+Basic.MainMenu.Edit.Scale="შეთვალიერების &ზომის შეცვლა"
+Basic.MainMenu.Edit.Scale.Window="ფანჯრის ზომამდე"
+Basic.MainMenu.Edit.Scale.Canvas="ფონის ზომამდე (%1x%2)"
+Basic.MainMenu.Edit.Scale.Output="გამომავალი ვიდეოს ზომამდე (%1x%2)"
+Basic.MainMenu.Edit.Transform="&გარდაქმნა"
+Basic.MainMenu.Edit.Transform.EditTransform="გარდაქმნის &ჩასწორება..."
+Basic.MainMenu.Edit.Transform.CopyTransform="გარდაქმნის დაკოპირება"
+Basic.MainMenu.Edit.Transform.PasteTransform="გარდაქმნის ჩასმა"
+Basic.MainMenu.Edit.Transform.ResetTransform="&გარდაქმნის გაუქმება"
+Basic.MainMenu.Edit.Transform.Rotate90CW="მობრუნება 90 გრადუსით საათის ისრის მიმართ."
+Basic.MainMenu.Edit.Transform.Rotate90CCW="მობრუნება 90 გრადუსით საათის ისრის საწ. მიმართ."
+Basic.MainMenu.Edit.Transform.Rotate180="მობრუნება 180 გრადუსით"
+Basic.MainMenu.Edit.Transform.FlipHorizontal="&თარაზულად შეტრიალება"
+Basic.MainMenu.Edit.Transform.FlipVertical="&შვეულად შეტრიალება"
+Basic.MainMenu.Edit.Transform.FitToScreen="ეკრანის ზომაზე &მორგება"
+Basic.MainMenu.Edit.Transform.StretchToScreen="ეკრანის ზომაზე &გაწელვა"
+Basic.MainMenu.Edit.Transform.CenterToScreen="ეკრანის &შუაში განთავსება"
+Basic.MainMenu.Edit.Order="&დალაგება"
+Basic.MainMenu.Edit.Order.MoveUp="&ზემოთ აწევა"
+Basic.MainMenu.Edit.Order.MoveDown="&ქვემოთ ჩამოწევა"
+Basic.MainMenu.Edit.Order.MoveToTop="&თავში გადატანა"
+Basic.MainMenu.Edit.Order.MoveToBottom="&ბოლოში გადატანა"
+Basic.MainMenu.Edit.AdvAudio="ხმის &გაფართოებული პარამეტრები"
+
+Basic.MainMenu.View="&ხედი"
+Basic.MainMenu.View.Toolbars="&ხელსაწყოები"
+Basic.MainMenu.View.Docks="იერსახის ნაწილები"
Basic.MainMenu.View.Docks.ResetUI="UI-ს გადატვირთვა"
-
-
-
-
-
+Basic.MainMenu.View.Docks.LockUI="UI-ს ჩაკეტვა"
+Basic.MainMenu.View.Toolbars.Listboxes="&სიები"
+Basic.MainMenu.View.SceneTransitions="ს&ცენებს შორის გადასვლები"
+Basic.MainMenu.View.StatusBar="&მდგომარეობის ზოლი"
+Basic.MainMenu.View.Fullscreen.Interface="სრულეკრანიანი"
+
+Basic.MainMenu.SceneCollection="&სცენის კრებული"
+Basic.MainMenu.Profile="&პროფილი"
+Basic.MainMenu.Profile.Import="პროფილის შემოტანა"
+Basic.MainMenu.Profile.Export="პროფილის შენახვა"
+Basic.MainMenu.SceneCollection.Import="სცენის კრებულის შემოტანა"
+Basic.MainMenu.SceneCollection.Export="სცენის კრებულის შენახვა"
+Basic.MainMenu.Profile.Exists="ასეთი პროფილი უკვე არსებობს"
+Basic.MainMenu.SceneCollection.Exists="ამ სცენის კრებული უკვე არსებობს"
+
+Basic.MainMenu.Tools="&ხელსაწყოები"
+
+Basic.MainMenu.Help="&დახმარება"
+Basic.MainMenu.Help.HelpPortal="დახმარების &გვერდი"
+Basic.MainMenu.Help.Website="ეწვიეთ &ვებსაიტს"
+Basic.MainMenu.Help.Discord="&Discord სერვერზე შესვლა"
+Basic.MainMenu.Help.Logs="&აღრიცხვის ფაილები"
+Basic.MainMenu.Help.Logs.ShowLogs="აღრიცხვის ფაილების &ჩვენება"
+Basic.MainMenu.Help.Logs.UploadCurrentLog="&მიმდინარე აღრიცხვის ფაილის ატვირთვა"
+Basic.MainMenu.Help.Logs.UploadLastLog="&ბოლო აღრიცხვის ფაილის ატვირთვა"
+Basic.MainMenu.Help.Logs.ViewCurrentLog="მიმდინარე აღრიცხვის ფაილის &ნახვა"
+Basic.MainMenu.Help.CheckForUpdates="განახლებებზე შემოწმება"
+Basic.MainMenu.Help.CrashLogs="ავარიული დახურვების &მოხსენებები"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="ავარიული დახურვების მოხსენებების &ჩვენება"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="&ბოლო მოხსენების ატვირთვა"
+
+Basic.Settings.ProgramRestart="ამ ცვლილებების ასახვისთვის, საჭიროა პროგრამის ხელახლა გაშვება."
+Basic.Settings.ConfirmTitle="ცვლილებების დადასტურება"
+Basic.Settings.Confirm="ცვლილებები არაა დამახსოვრებული. გსურთ მათი შენახვა?"
+
+Basic.Settings.General="მთავარი"
+Basic.Settings.General.Theme="თემა"
Basic.Settings.General.Language="ენა"
-
-
-
-
+Basic.Settings.General.EnableAutoUpdates="განახლებებზე შემოწმება ჩართვისას"
+Basic.Settings.General.OpenStatsOnStartup="სტატისტიკის ფანჯრის გახსნა ჩართვისას"
+Basic.Settings.General.WarnBeforeStartingStream="დადასტურების ფანჯრის ჩვენება ნაკადის გაშვებისას"
+Basic.Settings.General.WarnBeforeStoppingStream="დადასტურების ფანჯრის ჩვენება ნაკადის შეწყვეტისას"
+Basic.Settings.General.Projectors="ჩვენებები"
+Basic.Settings.General.HideProjectorCursor="მაჩვენებლის დამალვა ჩვენებებზე"
+Basic.Settings.General.ProjectorAlwaysOnTop="ჩვენებების სხვა ფანჯრების ზემოთ დატოვება"
+Basic.Settings.General.Snapping="წყაროს ჩარჩოს მიზიდვა განთავსებისას"
+Basic.Settings.General.ScreenSnapping="წყაროს ჩარჩოს მიზიდვა ეკრანის კიდესთან"
+Basic.Settings.General.CenterSnapping="წყაროს ჩარჩოს მიზიდვა შუაშია, თარაზულად და შვეულად"
+Basic.Settings.General.SourceSnapping="წყაროს ჩარჩოს სხვა წყაროს ჩარჩოზე მიზიდვა"
+Basic.Settings.General.SnapDistance="მიზიდვის ძალა"
+Basic.Settings.General.RecordWhenStreaming="პირდაპირი ეთერის ავტომატური ჩაწერა"
+Basic.Settings.General.KeepRecordingWhenStreamStops="ჩაწერის გაგრძელება ნაკადის შეწყვეტის შემდეგ"
+Basic.Settings.General.ReplayBufferWhileStreaming="გადახვევის ჩართვა ავტომატურად ნაკადის გაშვებისას"
+Basic.Settings.General.KeepReplayBufferStreamStops="გადახვევის შენარჩუნება, ნაკადის შეწყვეტისას"
+Basic.Settings.General.SysTray="სისტემის არე"
+Basic.Settings.General.SysTrayWhenStarted="სისტემის არეში ჩაკეცვა დაწყებისას"
+Basic.Settings.General.SystemTrayHideMinimize="ყოველთვის სისტემის არეში ჩაკეცვა, ამოცანათა ზოლის ნაცვლად"
+Basic.Settings.General.SaveProjectors="ჩვენებების დამახსოვრება გასვლისას"
+Basic.Settings.General.SwitchOnDoubleClick="სცენაზე გადასვლა ორჯერ დაწკაპებისას"
+Basic.Settings.General.StudioPortraitLayout="შვეული განლაგების ჩართვა"
+Basic.Settings.General.Multiview="მრავალხედიანი ჩვენება"
+Basic.Settings.General.Multiview.MouseSwitch="სცენებს შორის გადართვა დაწკაპებით"
+Basic.Settings.General.Multiview.DrawSourceNames="სცენის სახელების ჩვენება"
+Basic.Settings.General.Multiview.DrawSafeAreas="უსაფრთხო არეების გამოსახვა (EBU R 95)"
+Basic.Settings.General.MultiviewLayout="მრავალხედიანი განლაგება"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="თარაზულად, ზემოთ (8 სცენა)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="თარაზულად, ქვემოთ (8 სცენა)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="შვეულად, მარცხნივ (8 სცენა)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="შვეულად, მარჯვნივ (8 სცენა)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="თარაზულად, ზემოთ (24 სცენა)"
+
+Basic.Settings.Stream="ნაკადი"
+Basic.Settings.Stream.StreamType="ნაკადის სახეობა"
+
+Basic.Settings.Output="გამომავალი სიგნალი"
+Basic.Settings.Output.Format="ჩაწერის ფორმატი"
+Basic.Settings.Output.Encoder="დამშიფრავი"
+Basic.Settings.Output.SelectDirectory="საქაღალდის არჩევა ჩანაწერისთვის"
+Basic.Settings.Output.SelectFile="ფაილის არჩევა ჩანაწერისთვის"
+Basic.Settings.Output.EnforceBitrate="ნაკადის გაშვების მომსახურების ბიტური სიხშირის ზღვრების დადგენა"
+Basic.Settings.Output.Mode="გამომავალი სიგნალის რეჟიმი"
+Basic.Settings.Output.Mode.Simple="მარტივი"
+Basic.Settings.Output.Mode.Adv="გაფართოებული"
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg გამომავალი სიგნალი"
+Basic.Settings.Output.UseReplayBuffer="გადახვევის შესაძლებლობა"
+Basic.Settings.Output.ReplayBuffer.SecondsMax="გადახვევის დასაშვები დრო (წამი)"
+Basic.Settings.Output.ReplayBuffer.MegabytesMax="მეხსიერების დასაშვები მოცულობა (მეგაბაიტებში)"
+Basic.Settings.Output.ReplayBuffer.Estimate="მეხსიერების მიახლოებითი მოხმარება: %1 MB"
+Basic.Settings.Output.ReplayBuffer.EstimateUnknown="შეუძლებელია მეხსიერების მიახლოებითი მოხმარების დადგენა. გთხოვთ, მიუთითოთ მეხსიერების დასაშვები ზღვარი."
+Basic.Settings.Output.ReplayBuffer.HotkeyMessage="(შენიშვნა: დარწმუნდით, რომ გადახვევისთვის სწრაფი ღილაკები დაყენებულია შესაბამის განყოფილებაში)"
+Basic.Settings.Output.ReplayBuffer.Prefix="გადასახვევი მასალის შესანახი ფაილის თავსართი"
+Basic.Settings.Output.ReplayBuffer.Suffix="ბოლოსართი"
+Basic.Settings.Output.Simple.SavePath="ჩანაწერის მდებარეობა"
+Basic.Settings.Output.Simple.RecordingQuality="ჩაწერის ხარისხი"
+Basic.Settings.Output.Simple.RecordingQuality.Stream="გაშვებული ნაკადის შესაბამისი"
+Basic.Settings.Output.Simple.RecordingQuality.Small="მაღალი ხარისხი, საშუალო ზომის ფაილი"
+Basic.Settings.Output.Simple.RecordingQuality.HQ="განუსაზღვრელი ხარისხი, დიდი ზომის ფაილი"
+Basic.Settings.Output.Simple.RecordingQuality.Lossless="უდანაკარგო ხარისხი, მეტისმეტად დიდი ზომის ფაილი"
+Basic.Settings.Output.Simple.Warn.VideoBitrate="გაფრთხილება: ვიდეონაკადის ბიტურ სიხშირედ მიეთითება %1, რაც წარმოადგენს უმაღლეს დაშვებულ ზღვარს, ნაკადის გაშვების მოცემული მომსახურებისთვის. თუ ნამდვილად გსურთ %1 ბიტურ სიხშირეზე მეტის მიღება, ჩართეთ დაშიფვრის გაფართოებული პარამეტრები და მოხსენით მონიშვნა \"ნაკადის გაშვების მომსახურების ბიტური სიხშირის ზღვრების დადგენას\"."
+Basic.Settings.Output.Simple.Warn.AudioBitrate="გაფრთხილება: ხმოვანი ნაკადის ბიტურ სიხშირედ მიეთითება %1, რაც წარმოადგენს უმაღლეს დაშვებულ ზღვარს, ნაკადის გაშვების მოცემული მომსახურებისთვის. თუ ნამდვილად გსურთ %1 ბიტურ სიხშირეზე მეტის მიღება, ჩართეთ დაშიფვრის გაფართოებული პარამეტრები და მოხსენით მონიშვნა \"ნაკადის გაშვების მომსახურების ბიტური სიხშირის ზღვრების დადგენას\"."
+Basic.Settings.Output.Simple.Warn.Encoder="გაფრთხილება: გაშვებული ნაკადისგან განსხვავებულ ხარისხში ჩანაწერის დაშიფვრა, ზრდის პროცესორის დატვირთვას, როცა ნაკადის გაშვება და ჩაწერა, ერთდროულად მიმდინარეობს."
+Basic.Settings.Output.Simple.Warn.Lossless="გაფრთხილება: უდანაკარგო ხარისხის მითითების შემთხვევაში, შეიქმნება მეტისმეტად დიდი ზომის ფაილები! უდანაკარგო ხარისხის ვიდეოს თითოეული წუთის მოცულობამ დისკზე, შესაძლოა 7 გიგაბაიტს გადააჭარბოს, მაღალი გარჩევადობისა და კადრის სიხშირის პირობებში. ხანგრძლივი ჩანაწერებისთვის, უდანაკარგოს არჩევა არაა მიზანშეწონილი, თუ არ გაქვთ საკმარისად დიდი მოცულობის თავისუფალი ადგილი დისკზე."
+Basic.Settings.Output.Simple.Warn.Lossless.Msg="ნამდვილად გსურთ უდანაკარგო ხარისხის მითითება?"
+Basic.Settings.Output.Simple.Warn.Lossless.Title="გაფრთხილება, უდანაკარგო ხარისხის შესახებ!"
+Basic.Settings.Output.Simple.Warn.MultipleQSV="გაფრთხილება: ერთდროულად რამდენიმე სხვადასხვა QSV დამშიფრავის გამოყენება ნაკადის გაშვებისას და ჩაწერისას, შეუძლებელია. თუ გსურთ ნაკადის გაშვება და ჩაწერა ერთდროულად, გთხოვთ შეცვალოთ ან ჩაწერის დამშიფრავი, ან ნაკადის დამშიფრავი."
+Basic.Settings.Output.Simple.Encoder.Software="პროგრამული (x264)"
+Basic.Settings.Output.Simple.Encoder.Hardware.QSV="აპარატურული (QSV)"
+Basic.Settings.Output.Simple.Encoder.Hardware.AMD="აპარატურული (AMD)"
+Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="აპარატურული (NVENC)"
+Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="პროგრამული (x264 პროცესორის დაბალი მოხმარების მზა პარამეტრები, ზრდის ფაილის ზომას)"
+Basic.Settings.Output.VideoBitrate="ვიდეოს ბიტური სიხშირე"
+Basic.Settings.Output.AudioBitrate="ხმის ბიტური სიხშირე"
+Basic.Settings.Output.Reconnect="ხელახლა დაკავშირება ავტომატურად"
+Basic.Settings.Output.RetryDelay="გამეორების დაყოვნება (წამი)"
+Basic.Settings.Output.MaxRetries="გამეორების დასაშვები რაოდენობა"
+Basic.Settings.Output.Advanced="დამშიფრავის გაფართოებული პარამეტრების ჩართვა"
+Basic.Settings.Output.EncoderPreset="დაშიფვრის მზა პარამეტრები (მაღალი = ნაკლები CPU-დატვირთვა)"
+Basic.Settings.Output.CustomEncoderSettings="დამშიფრავის პარამეტრების მითითება"
+Basic.Settings.Output.CustomMuxerSettings="მულტიპლექსორის მითითებული პარამეტრები"
+Basic.Settings.Output.NoSpaceFileName="ფაილის სახელის შექმნა, გამოტოვებული ადგილების გარეშე"
+
+Basic.Settings.Output.Adv.Rescale="გამომავალი ვიდეოს ზომების შეცვლა"
+Basic.Settings.Output.Adv.AudioTrack="ხმოვანი ბილიკი"
+Basic.Settings.Output.Adv.Streaming="ნაკადი"
+Basic.Settings.Output.Adv.ApplyServiceSettings="ნაკადის გაშვების მომსახურების პარამეტრების გამოყენება"
+Basic.Settings.Output.Adv.Audio.Track1="ბილიკი 1"
+Basic.Settings.Output.Adv.Audio.Track2="ბილიკი 2"
+Basic.Settings.Output.Adv.Audio.Track3="ბილიკი 3"
+Basic.Settings.Output.Adv.Audio.Track4="ბილიკი 4"
+Basic.Settings.Output.Adv.Audio.Track5="ბილიკი 5"
+Basic.Settings.Output.Adv.Audio.Track6="ბილიკი 6"
+
+Basic.Settings.Output.Adv.Recording="ჩაწერა"
Basic.Settings.Output.Adv.Recording.Type="ტიპი"
Basic.Settings.Output.Adv.Recording.Type.Standard="სტანდარტული"
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="მითითებული გამომავალი სიგნალი (FFmpeg)"
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(გაშვებული ნაკადის დამშიფრავის გამოყენება)"
+Basic.Settings.Output.Adv.Recording.Filename="ფაილის დასახელების ფორმატი"
+Basic.Settings.Output.Adv.Recording.OverwriteIfExists="არსებულ ფაილზე გადაწერა"
+Basic.Settings.Output.Adv.FFmpeg.Type="FFmpeg გამომავალი სიგნალის სახე"
+Basic.Settings.Output.Adv.FFmpeg.Type.URL="მითითებულ URL ბულზე"
+Basic.Settings.Output.Adv.FFmpeg.Type.RecordToFile="ფაილში"
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="ჩაწერის ცნობილი ფორმატები"
Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="ყველა ფაილი"
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="ფაილის მისამართი ან URL"
+Basic.Settings.Output.Adv.FFmpeg.Format="სათავსის ფორმატი"
+Basic.Settings.Output.Adv.FFmpeg.FormatAudio="ხმა"
Basic.Settings.Output.Adv.FFmpeg.FormatVideo="ვიდეო"
-
-
-
+Basic.Settings.Output.Adv.FFmpeg.FormatDefault="ნაგულისხმევი ფორმატი"
+Basic.Settings.Output.Adv.FFmpeg.FormatDesc="სათავსის ფორმატის აღწერა"
+Basic.Settings.Output.Adv.FFmpeg.FormatDescDef="ხმის/ვიდეოს კოდეკის ამოცნობა მითითებული ფაილის მისამართიდან ან URL-დან"
+Basic.Settings.Output.Adv.FFmpeg.AVEncoderDefault="ნაგულისხმევი დამშიფრავი"
+Basic.Settings.Output.Adv.FFmpeg.AVEncoderDisable="დამშიფრავის გამორთვა"
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="ვიდეოს დამშიფრავი"
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="ვიდეოს დამშიფრავის პარამეტრები (თუ არის)"
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="ხმის დამშიფრავი"
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="ხმის დამშიფრავის პარამეტრები (თუ არის)"
+Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="მულტიპლექსორის პარამეტრები (თუ არის)"
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="საკვანძო კადრებს შორის შუალედი (კადრები)"
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="ყველა კოდეკის ჩვენება (მათ შორის არათავსებადებისაც)"
+
+FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
+
+FilenameFormatting.TT="%CCYY წელი, ოთხი ციფრი\n%YY წელი, ბოლო ორის ციფრი(00-99)\n%MM თვე, ათობითი რიცხვის სახით (01-12)\n%DD თვის რიცხვი, წინ ნულით (01-31)\n%hh საათი, 24-საათიანი ფორმატით (00-23)\n%mm წუთი(00-59)\n%ss წამი(00-61)\n%% A % ნიშანი\n%a კვირის დღე შემოკლებულად\n%A კვირის დღის სრული დასახელება\n%b თვე შემოკლებულად\n%B თვის სრული დასახელება\n%d თვის რიცხვი, წინ ნულით (01-31)\n%H საათი, 24-საათიანი ფორმატით (00-23)\n%I საათი, 12-საათიანი ფორმატით (01-12)\n%m თვე, ათობითი რიცხვის სახით (01-12)\n%M წუთი (00-59)\n%p AM ან PM აღნიშვნა\n%S წამი (00-61)\n%y წელი, ბოლო ორი ციფრი (00-99)\n%Y წელი\n%z ISO 8601 სხვაობა UTC დროსთან ან სასაათე სარტყელთან\n სრული ან შემოკლებული დასახელება\n%Z სასაათე სარტყელი ან მისი შემოკლებული დასახელება\n"
+
+Basic.Settings.Video="ვიდეო"
+Basic.Settings.Video.Adapter="ვიდეოდაფა"
+Basic.Settings.Video.BaseResolution="ეკრანის (ფონის) ძირითადი გაფართოება"
+Basic.Settings.Video.ScaledResolution="გამომავალი ვიდეოს (მასშტაბირებულის) გაფართოება"
+Basic.Settings.Video.DownscaleFilter="მასშტაბირების ფილტრი"
+Basic.Settings.Video.DisableAeroWindows="Aero გაფორმების გათიშვა (მხოლოდ Windows-ზე)"
Basic.Settings.Video.FPS="FPS"
+Basic.Settings.Video.FPSCommon="საერთო FPS-მნიშვნელობები"
+Basic.Settings.Video.FPSInteger="მთელრიცხვიანი FPS-მნიშვნელობები"
+Basic.Settings.Video.FPSFraction="წილადიანი FPS-მნიშვნელობები"
+Basic.Settings.Video.Numerator="მრიცხველი"
Basic.Settings.Video.Denominator="მნიშვნელი"
+Basic.Settings.Video.Renderer="დამმუშავებელი"
+Basic.Settings.Video.InvalidResolution="გაფართოების არასწორი მნიშვნელობა. უნდა იყოს [width]x[height] (მაგ. 1920x1080)"
+Basic.Settings.Video.CurrentlyActive="ვიდეო ამჟამად გაშვებულია. გთხოვთ, გამორთოთ ყველა გამომავალი სიგნალი, ვიდეოს პარამეტრების ჩასასწორებლად."
+Basic.Settings.Video.DisableAero="Aero გაფორმების გათიშვა"
+Basic.Settings.Video.DownscaleFilter.Bilinear="ორხაზოვანი (უსწრაფესი, მაგრამ ბუნდოვანი მასშტაბირება)"
+Basic.Settings.Video.DownscaleFilter.Bicubic="ბიკუბური (მკვეთრი მასშტაბირება, 16 შერჩევა)"
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (მკვეთრი მასშტაბირება, 32 შერჩევა)"
+Basic.Settings.Audio="ხმა"
+Basic.Settings.Audio.SampleRate="სიხშირე"
Basic.Settings.Audio.Channels="არხები"
-
-
+Basic.Settings.Audio.MeterDecayRate="ხმის ზოლის დაშვების სიჩქარე"
+Basic.Settings.Audio.MeterDecayRate.Fast="სწრაფი"
+Basic.Settings.Audio.MeterDecayRate.Medium="საშუალო (I სახის PPM)"
+Basic.Settings.Audio.MeterDecayRate.Slow="ნელი (II სახის PPM)"
+Basic.Settings.Audio.PeakMeterType="ხმის სიმაღლის მზომის სახეები"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="უბრალო"
+Basic.Settings.Audio.PeakMeterType.TruePeak="ზუსტი (პროცესორის მაღალი მოხმარებით)"
+Basic.Settings.Audio.MultiChannelWarning.Enabled="ყურადღება: ჩართულია მოცულობითი ხმა."
+Basic.Settings.Audio.MultichannelWarning="ნაკადის გაშვებისას, გადაამოწმეთ მომსახურების მომწოდებელთან, არის თუ არა მხარდაჭერილი ორივე, მოცულობითი ხმოვანი სიგნალის მიღებაც და მოსმენაც. მაგალითად Twitch, Facebook 360 Live, Mixer RTMP, Smashcast შემთხვევებში, მოცულობითი ხმოვანი სიგნალი, სრულადაა მხარდაჭერილი. მიუხედავად იმისა, რომ Facebook Live და YouTube Live, ორივე იღებს მოცულობით ხმოვან სიგნალს, Facebook Live გარდაქმნის მას სტერეო-სიგნალად, ხოლო YouTube Live უშვებს მხოლოდ ორი არხით.\n\nOBS-ის ხმოვანი ფილტრები თავსებადია მოცულობით ხმოვან სიგნალთან, მაგრამ VST მოდულის მხარდაჭერა, შესაძლოა არ იყოს უზრუნველყოფილი."
+Basic.Settings.Audio.MultichannelWarning.Title="ჩაირთოს მოცულობითი ხმოვანი სიგნალი?"
+Basic.Settings.Audio.MultichannelWarning.Confirm="ნამდვილად გსურთ, ჩართოთ მოცულობითი ხმოვანი სიგნალი?"
+Basic.Settings.Audio.DesktopDevice="ხმის მოწყობილობა"
+Basic.Settings.Audio.DesktopDevice2="ხმის მოწყობილობა 2"
+Basic.Settings.Audio.AuxDevice="მიკროფონი/ხმის დამატებითი მოწყობილობა"
+Basic.Settings.Audio.AuxDevice2="მიკროფონი/ხმის დამატებითი მოწყობილობა 2"
+Basic.Settings.Audio.AuxDevice3="მიკროფონი/ხმის დამატებითი მოწყობილობა 3"
+Basic.Settings.Audio.EnablePushToMute="დაჭერით დადუმების ჩართვა"
+Basic.Settings.Audio.PushToMuteDelay="დაჭერით დადუმების დაყოვნება"
+Basic.Settings.Audio.EnablePushToTalk="დაჭერით საუბრის ჩართვა"
+Basic.Settings.Audio.PushToTalkDelay="დაჭერით საუბრის დაყოვნება"
+Basic.Settings.Audio.UnknownAudioDevice="[მოწყობილობა არაა დაკავშირებული ან მიუწვდომელია]"
+
+Basic.Settings.Advanced="დამატებითი"
+Basic.Settings.Advanced.General.ProcessPriority="უპირატესობა დამუშავებისას"
+Basic.Settings.Advanced.General.ProcessPriority.High="მაღალი"
+Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="საშუალოზე მაღალი"
+Basic.Settings.Advanced.General.ProcessPriority.Normal="საშუალო"
+Basic.Settings.Advanced.General.ProcessPriority.BelowNormal="საშუალოზე დაბალი"
+Basic.Settings.Advanced.General.ProcessPriority.Idle="უმოქმედო"
+Basic.Settings.Advanced.FormatWarning="გაფრთხილება: ფერთა ფორმატები, გარდა NV12-ისა, ძირითადად განკუთვნილია ჩაწერისთვის და არა ნაკადის გაშვებისთვის. ნაკადის გაშვებისას, ფერთა ფორმატის გარდაქმნებმა შესაძლოა გამოიწვიოს პროცესორის მეტად დატვირთვა."
+Basic.Settings.Advanced.Audio.BufferingTime="ხმის ბუფერის დრო"
+Basic.Settings.Advanced.Video.ColorFormat="ფერთა ფორმატი"
+Basic.Settings.Advanced.Video.ColorSpace="YUV ფერთა სისტემა"
+Basic.Settings.Advanced.Video.ColorRange="YUV ფერთა გამა"
+Basic.Settings.Advanced.Video.ColorRange.Partial="ნაწილობრივი"
+Basic.Settings.Advanced.Video.ColorRange.Full="სრული"
+Basic.Settings.Advanced.Audio.MonitoringDevice="ხმის მოსასმენი მოწყობილობა"
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="ნაგულისხმევი"
+Basic.Settings.Advanced.Audio.DisableAudioDucking="Windows-ის მიერ ხმის დონის დადაბლების არიდება"
+Basic.Settings.Advanced.StreamDelay="ნაკადის დაყოვნება"
+Basic.Settings.Advanced.StreamDelay.Duration="ხანგრძლივობა (წამი)"
+Basic.Settings.Advanced.StreamDelay.Preserve="მოსაჭრელი წერტილის მომარაგება (დაყოვნების გაზრდა) ხელახლა დაკავშირებისას"
+Basic.Settings.Advanced.StreamDelay.MemoryUsage="მეხსიერების მიახლოებითი მოხმარება: %1 MB"
+Basic.Settings.Advanced.Network="ქსელი"
+Basic.Settings.Advanced.Network.BindToIP="დაკავშირება IP მისამართზე"
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="ახალი ქსელის კოდის ჩართვა"
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="დაყოვნების შემცირება"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="სწრაფი ღილაკების გათიშვა, მთავარ ფანჯარაზე გადასვლისას"
+
+Basic.AdvAudio="ხმის გაფართოებული პარამეტრები"
Basic.AdvAudio.Name="სახელი"
-
-
-
-
-
+Basic.AdvAudio.Volume="ხმის სიმაღლე (%)"
+Basic.AdvAudio.Mono="ერთ არხში გაერთიანება"
+Basic.AdvAudio.Panning="წონასწორობა"
+Basic.AdvAudio.SyncOffset="სინქრონიზაციის გასწორება (მწ)"
+Basic.AdvAudio.Monitoring="ხმის მოსმენა"
+Basic.AdvAudio.Monitoring.None="მოსმენის გარეშე"
+Basic.AdvAudio.Monitoring.MonitorOnly="მხოლოდ მოსმენა (უხმო გამომავალი სიგნალით)"
+Basic.AdvAudio.Monitoring.Both="მოსმენა და გამოტანა"
+Basic.AdvAudio.AudioTracks="ბილიკები"
+
+Basic.Settings.Hotkeys="სწრაფი ღილაკები"
+Basic.Settings.Hotkeys.Pair="'%1' - ღილაკების ერთობლიობა იმუშავებს გადამრთველის სახით"
+
+Basic.Hotkeys.SelectScene="სცენაზე გადასვლა"
+
+Basic.SystemTray.Show="ჩვენება"
+Basic.SystemTray.Hide="დამალვა"
+
+Basic.SystemTray.Message.Reconnecting="კავშირი გაწყდა. უკავშირდება ხელახლა..."
+
+Hotkeys.Insert="Insert"
+Hotkeys.Delete="Delete"
+Hotkeys.Home="Home"
+Hotkeys.End="End"
+Hotkeys.PageUp="Page Up"
+Hotkeys.PageDown="Page Down"
+Hotkeys.NumLock="Num Lock"
+Hotkeys.ScrollLock="Scroll Lock"
Hotkeys.CapsLock="Caps Lock"
Hotkeys.Backspace="Backspace"
+Hotkeys.Tab="Tab"
+Hotkeys.Print="Print"
Hotkeys.Pause="პაუზა"
+Hotkeys.Left="მარცხენა ისარი"
+Hotkeys.Right="მარჯვენა ისარი"
+Hotkeys.Up="ზედა ისარი"
+Hotkeys.Down="ქვედა ისარი"
+Hotkeys.Windows="Windows"
Hotkeys.Super="Super"
Hotkeys.Menu="მენიუ"
Hotkeys.Space="Space"
Hotkeys.NumpadNum="Numpad %1"
-
-
-
-
+Hotkeys.NumpadMultiply="გამრავლება ციფრების დაფაზე"
+Hotkeys.NumpadDivide="გაყოფა ციფრების დაფაზე"
+Hotkeys.NumpadAdd="მიმატება ციფრების დაფაზე"
+Hotkeys.NumpadSubtract="გამოკლება ციფრების დაფაზე"
+Hotkeys.NumpadDecimal="ათწილადის ნიშანი ციფრების დაფაზე"
+Hotkeys.AppleKeypadNum="%1 (კლავიატურაზე)"
+Hotkeys.AppleKeypadMultiply="* (კლავიატურაზე)"
+Hotkeys.AppleKeypadDivide="/ (კლავიატურაზე)"
+Hotkeys.AppleKeypadAdd="+ (კლავიატურაზე)"
+Hotkeys.AppleKeypadSubtract="- (კლავიატურაზე)"
+Hotkeys.AppleKeypadDecimal=". (კლავიატურაზე)"
+Hotkeys.AppleKeypadEqual="= (კლავიატურაზე)"
+Hotkeys.MouseButton="თაგვი %1"
+
+Mute="დადუმება"
+Unmute="ხმის ჩართვა"
+Push-to-mute="დაჭერისას დადუმება"
+Push-to-talk="დაჭერისას საუბარი"
+
+SceneItemShow="'%1'-ის გამოჩენა"
+SceneItemHide="'%1'-ის დამალვა"
+
+OutputWarnings.NoTracksSelected="უნდა მიუთითოთ ერთი ხმოვანი ბილიკი მაინც"
+OutputWarnings.MultiTrackRecording="გაფრთხილება: ცალკეული სახის ფაილებში (როგორიცაა FLV), არაა მხარდაჭერილი რამდენიმე ბილიკი, თითოეული ჩაწერისას"
+OutputWarnings.MP4Recording="გაფრთხილება: MP4 სახით შენახული ჩანაწერები ვეღარ აღდგება, მუშაობის შეწყვეტის შემთხვევაში (მაგ. ლურჯი ეკრანის ამოგდებისას, ძაბვის ვარდნისას და ა.შ.). თუ გსურთ რამდენიმე ხმოვანი ფაილის ჩაწერა, სასურველია ამისთვის გამოიყენოთ MKV და დასრულების შემდეგ გარდაქმნათ MP4-ად. (ფაილი->ჩანაწერების გარდაქმნა)"
+
+FinalScene.Title="სცენის წაშლა"
+FinalScene.Text="საჭიროებს, სულ მცირე ერთ სცენას."
+
+NoSources.Title="წყაროები არაა"
+NoSources.Text="როგორც ჩანს, თქვენ ჯერ არ დაგიმატებიათ ვიდეოს არცერთი წყარო, შედეგად მიიღებთ ცარიელ ეკრანს. ნამდვილად გსურთ, განაგრძოთ?"
+NoSources.Text.AddSource="წყაროს დამატება შეგიძლიათ ნებისმიერ დროს + ნიშანზე დაწკაპებით, მთავარი ფანჯრის წყაროების არეში."
+
+ChangeBG="ფერის დაყენება"
+CustomColor="ფერის მითითება"
+
+BrowserSource.EnableHardwareAcceleration="ბრაუზერის აპარატურული აჩქარების ჩართვა"
diff --git a/UI/data/locale/ko-KR.ini b/UI/data/locale/ko-KR.ini
index fb684d8a7..4abb6a2c1 100644
--- a/UI/data/locale/ko-KR.ini
+++ b/UI/data/locale/ko-KR.ini
@@ -78,6 +78,8 @@ None="없음"
StudioMode.Preview="미리보기"
StudioMode.Program="프로그램"
ShowInMultiview="다중화면으로 표시"
+VerticalLayout="수직으로 배치"
+Group="하나로 묶기"
AlreadyRunning.Title="OBS가 이미 실행 중입니다"
AlreadyRunning.Text="OBS가 이미 실행 중입니다! 의도한 것이 아니라면 새로운 OBS를 실행하기 전에 이미 동작 중인 프로그램을 종료하십시오. OBS가 시스템 트레이에 최소화되어 있는지도 확인하십시오."
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="리플레이 버퍼를 멈추고 있습니다..
Basic.Main.StopStreaming="방송 중단"
Basic.Main.StoppingStreaming="방송을 중지합니다..."
Basic.Main.ForceStopStreaming="방송 중지 (지연된 분량도 마무리없이 즉시 송출 중단)"
+Basic.Main.Group="묶음: %1"
+Basic.Main.GroupItems="선택한 항목 묶기"
+Basic.Main.Ungroup="묶음 해체"
Basic.MainMenu.File="파일(&F)"
Basic.MainMenu.File.Export="내보내기(&E)"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="도구(&T)"
Basic.MainMenu.Help="도움말(&H)"
Basic.MainMenu.Help.HelpPortal="도움말 및 포털"
Basic.MainMenu.Help.Website="웹사이트 방문(&W)"
+Basic.MainMenu.Help.Discord="공식 디스코드 참여(&D)"
Basic.MainMenu.Help.Logs="기록 파일(&L)"
Basic.MainMenu.Help.Logs.ShowLogs="기록 파일 표시(S)"
Basic.MainMenu.Help.Logs.UploadCurrentLog="현재 기록 파일 올리기(&C)"
Basic.MainMenu.Help.Logs.UploadLastLog="마지막 기록 파일 올리기(&L)"
Basic.MainMenu.Help.Logs.ViewCurrentLog="현재 기록 보기(&V)"
Basic.MainMenu.Help.CheckForUpdates="판올림 확인"
+Basic.MainMenu.Help.CrashLogs="오류 보고(&R)"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="오류 보고서 보기(&S)"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="마지막 오류 보고서 전송하기(&L)"
Basic.Settings.ProgramRestart="설정을 적용하려면 프로그램을 다시 시작해야 합니다."
Basic.Settings.ConfirmTitle="변경사항 확인"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="작업 표시줄 대신 시스템
Basic.Settings.General.SaveProjectors="종료 시 프로젝터 저장"
Basic.Settings.General.SwitchOnDoubleClick="더블클릭 시 장면으로 전환"
Basic.Settings.General.StudioPortraitLayout="프로젝터를 수직으로 배열"
+Basic.Settings.General.Multiview="다중화면"
+Basic.Settings.General.Multiview.MouseSwitch="클릭으로 장면 간 전환"
+Basic.Settings.General.Multiview.DrawSourceNames="장면 이름 표시"
+Basic.Settings.General.Multiview.DrawSafeAreas="안전 영역 표시 (EBU R 95)"
Basic.Settings.General.MultiviewLayout="다중화면 배치"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="수평, 위"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="수평, 아래"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="수직, 왼쪽"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="수직, 오른쪽"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="수평, 상단 (8 장면)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="수평, 하단 (8장면)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="수직, 좌측 (8장면)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="수직, 우측 (8장면)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="수평, 상단 (24 장면)"
Basic.Settings.Stream="방송"
Basic.Settings.Stream.StreamType="방송 형식"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="오디오 측정기 감퇴 속도"
Basic.Settings.Audio.MeterDecayRate.Fast="빠름"
Basic.Settings.Audio.MeterDecayRate.Medium="중간 (Type I PPM)"
Basic.Settings.Audio.MeterDecayRate.Slow="느림 (Type II PPM)"
+Basic.Settings.Audio.PeakMeterType="피크 미터 형식"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="샘플 피크"
+Basic.Settings.Audio.PeakMeterType.TruePeak="트루 피크 (더 높은 CPU 자원 요구)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="경고: 서라운드 음향이 켜져 있습니다."
Basic.Settings.Audio.MultichannelWarning="방송 중이라면 서비스에서 서라운드 음향에 대한 입력 및 재생을 지원하는지 확인하세요. 트위치, 페이스북 360 라이브, Mixer RTMP, Smashcast 는 해당 기능을 사용할 수 있습니다. 페이스북 Live와 유튜브 Live 서비스는 입력은 할 수 있지만 스테레오로 전환하며 유튜브 Live는 오로지 2채널로만 재생합니다.\n\nOBS 오디오 필터는 서라운드 음향을 지원하지만 VST 플러그인 지원은 보장하지 않습니다."
Basic.Settings.Audio.MultichannelWarning.Title="서라운드 음향을 활성화할까요?"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="네트워크"
Basic.Settings.Advanced.Network.BindToIP="IP에 고정"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="새로운 네트워크 코드 활성화"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="짧은 지연시간 방식 사용"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="주요 창을 초점으로 둘 때 단축키를 비활성화"
Basic.AdvAudio="오디오 고급 설정"
Basic.AdvAudio.Name="이름"
@@ -749,3 +767,12 @@ OutputWarnings.MP4Recording="경고: MP4로 녹화를 하면 파일이 마무리
FinalScene.Title="장면 삭제"
FinalScene.Text="적어도 하나의 장면은 존재해야 합니다."
+NoSources.Title="소스 없음"
+NoSources.Text="어떠한 영상 소스도 추가하지 않아서 빈 화면만 송출할 것입니다. 그래도 계속하시겠습니까?"
+NoSources.Text.AddSource="주 화면 소스 목록에 있는 + 아이콘을 누르면 소스를 추가할 수 있습니다."
+
+ChangeBG="색상 지정"
+CustomColor="사용자 색상"
+
+BrowserSource.EnableHardwareAcceleration="브라우저 소스에 하드웨어 가속 활성화"
+
diff --git a/UI/data/locale/lt-LT.ini b/UI/data/locale/lt-LT.ini
index 8e5937207..97e889ffd 100644
--- a/UI/data/locale/lt-LT.ini
+++ b/UI/data/locale/lt-LT.ini
@@ -326,3 +326,6 @@ Push-to-talk="Kalbėti paspaudus"
FinalScene.Title="Ištrinti sceną"
FinalScene.Text="Turi būti bent viena scena."
+
+
+
diff --git a/UI/data/locale/ms-MY.ini b/UI/data/locale/ms-MY.ini
index c0b73750f..1413cc024 100644
--- a/UI/data/locale/ms-MY.ini
+++ b/UI/data/locale/ms-MY.ini
@@ -52,11 +52,34 @@ Reset="Set semula"
Hours="Jam"
Minutes="Minit"
Seconds="Saat"
+Import="Import"
+Export="Eksport"
+Copy="Salin"
+Paste="Tampal"
+PasteReference="Tampal (rujukan)"
+PasteDuplicate="Tampal (dua salinan)"
+Next="Seterusnya"
+Back="Kembali"
+BandwidthTest.Region.EU="Eropah"
+BandwidthTest.Region.Asia="Asia"
+BandwidthTest.Region.Other="Lain-lain"
+Basic.AutoConfig.ApplySettings="Gunakan seting"
+Basic.AutoConfig.StartPage="Maklumat penggunaan"
+Basic.AutoConfig.VideoPage="Seting video"
+Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="Gunakan semasa (%1x%2)"
+Basic.AutoConfig.VideoPage.BaseResolution.Display="Paparan %1 (%2x%3)"
+Basic.AutoConfig.VideoPage.FPS.UseCurrent="Gunakan semasa (%1)"
+Basic.AutoConfig.StreamPage="Maklumat aliran"
+Basic.AutoConfig.StreamPage.SubTitle="Sila taip maklumat aliran anda"
+Basic.AutoConfig.StreamPage.Service="Perkhidmatan-perkhidmatan"
+Basic.AutoConfig.StreamPage.Service.ShowAll="Tunjuk semua..."
+Basic.AutoConfig.StreamPage.Server="Server"
+Basic.AutoConfig.StreamPage.StreamKey.LinkToSite="(Link)"
@@ -428,3 +451,6 @@ Push-to-talk="Tekan-untuk-cakap"
+
+
+
diff --git a/UI/data/locale/nb-NO.ini b/UI/data/locale/nb-NO.ini
index 744b7e566..35561a4f5 100644
--- a/UI/data/locale/nb-NO.ini
+++ b/UI/data/locale/nb-NO.ini
@@ -61,7 +61,7 @@ Hours="Timer"
Minutes="Minutter"
Seconds="Sekunder"
Deprecated="Foreldet"
-ReplayBuffer="Omspill Buffer"
+ReplayBuffer="Omspillingsbuffer"
Import="Importer"
Export="Eksporter"
Copy="Kopier"
@@ -78,6 +78,8 @@ None="Ingen"
StudioMode.Preview="Forhåndsvisning"
StudioMode.Program="Program"
ShowInMultiview="Vis i Multiview"
+VerticalLayout="Loddrett oppsett"
+Group="Gruppe"
AlreadyRunning.Title="OBS kjører allerede"
AlreadyRunning.Text="OBS kjører allerede! Med mindre du ikke mente dette, vennligst lukk alle eksisterende kjørende tilfeller av OBS før du kjører noen nye. Hvis du har satt OBS til å minimere til systemkurven, vennligst sjekk om den fortsatt kjører der."
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="Stopper omspillingsbufferen..."
Basic.Main.StopStreaming="Stopp Strømming"
Basic.Main.StoppingStreaming="Stanser strøm…"
Basic.Main.ForceStopStreaming="Stopp strømming (forkast forsinkelse)"
+Basic.Main.Group="Gruppe %1"
+Basic.Main.GroupItems="Gruppér merkede gjenstander"
+Basic.Main.Ungroup="Adskill"
Basic.MainMenu.File="&Fil"
Basic.MainMenu.File.Export="&Eksportér"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="&Verktøy"
Basic.MainMenu.Help="&Hjelp"
Basic.MainMenu.Help.HelpPortal="&Portal for hjelp"
Basic.MainMenu.Help.Website="Besøk &nettstedet"
+Basic.MainMenu.Help.Discord="Bli med i &Discord-serveren"
Basic.MainMenu.Help.Logs="&Loggfiler"
Basic.MainMenu.Help.Logs.ShowLogs="Vis &loggfiler"
Basic.MainMenu.Help.Logs.UploadCurrentLog="Last opp &nåværende loggfil"
Basic.MainMenu.Help.Logs.UploadLastLog="Last opp &siste loggfil"
Basic.MainMenu.Help.Logs.ViewCurrentLog="&Vis gjeldende logg"
Basic.MainMenu.Help.CheckForUpdates="Se etter oppdateringer"
+Basic.MainMenu.Help.CrashLogs="Krasjrapporter"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="Vi&s krasjrapporter"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="Last opp den &nyeste krasjrapporten"
Basic.Settings.ProgramRestart="Programmet må startes på nytt for at disse innstillingene skal tre i kraft."
Basic.Settings.ConfirmTitle="Bekreft endringer"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Alltid minimere til systemstatusf
Basic.Settings.General.SaveProjectors="Lagre projektorer ved avslutning"
Basic.Settings.General.SwitchOnDoubleClick="Dobbeltklikking vil gå til scenen"
Basic.Settings.General.StudioPortraitLayout="Aktiver portrett/loddrett vindu"
+Basic.Settings.General.Multiview="Flervisning"
+Basic.Settings.General.Multiview.MouseSwitch="Klikk for å bytte mellom scener"
+Basic.Settings.General.Multiview.DrawSourceNames="Vis scenenes navn"
+Basic.Settings.General.Multiview.DrawSafeAreas="Tegn trygge områder (EBU R 95)"
Basic.Settings.General.MultiviewLayout="Flervisningsplassering"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Vannrett, øverst"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Vannrett, nederst"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Loddrett, venstre"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Loddrett, høyre"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Vannrett, topp (8 scener)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Vannrett, bunn (8 scener)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Loddrett, venstre (8 scener)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Loddrett, høyre (8 scener)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Vannrett, topp (24 scener)"
Basic.Settings.Stream="Strøm"
Basic.Settings.Stream.StreamType="Strømmetype"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="Audiometerets forfallsfrekvens"
Basic.Settings.Audio.MeterDecayRate.Fast="Raskt"
Basic.Settings.Audio.MeterDecayRate.Medium="Middels (Type I PPM)"
Basic.Settings.Audio.MeterDecayRate.Slow="Tregt (Type II PPM)"
+Basic.Settings.Audio.PeakMeterType="Toppunktmålertype"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Samplingstoppunkt"
+Basic.Settings.Audio.PeakMeterType.TruePeak="Ekte toppunkt (Høyere CPU-bruk)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="Advarsel: Surroundlyd er aktivert."
Basic.Settings.Audio.MultichannelWarning="Hvis du strømmer, sjekk om strømmetjenesten din støtter både surround-lydinnføring og surround-lydavspilling. Twitch, Facebook 360 Live, Mixer RTMP, og Smashcast er eksempler hvor surroundlyd er full støttet. Selv om Facebook Live og YouTube Live begge støtter surround-innføring, nedmikser Facebook Live det ned til Stereo, og YouTube Live spiller bare av to kanaler.\n\nOBS-lydfiltre er kompatible med surroundlyd, selv om VST-tilleggsstøtte ikke er garantert."
Basic.Settings.Audio.MultichannelWarning.Title="Vil du aktivere surround-lyd?"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="Nettverk"
Basic.Settings.Advanced.Network.BindToIP="Bind til IP"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Aktiver den nye nettverkskoden"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Lavlatens-modus"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Deaktiver hurtigtaster når hovedvinduet er i fokus"
Basic.AdvAudio="Avanserte lydinnstillinger"
Basic.AdvAudio.Name="Navn"
@@ -749,3 +767,11 @@ OutputWarnings.MP4Recording="Advarsel: Opptak lagret i MP4 bil bli slettet hvis
FinalScene.Title="Slett scene"
FinalScene.Text="Det må være minst én scene."
+NoSources.Title="Ingen kilder"
+NoSources.Text="Det ser ut som du ikke har lagt til noen videokilder ennå, så du vil kun sende en blank skjerm. Er du sikker på at du vil gjøre dette?"
+NoSources.Text.AddSource="Du kan legge til kilder ved å klikke på +-ikonet under Kilder-boksen i hovedvinduet til enhver tid."
+
+ChangeBG="Velg farge"
+CustomColor="Egendefinert farge"
+
+
diff --git a/UI/data/locale/nl-NL.ini b/UI/data/locale/nl-NL.ini
index 07ede936f..34ceac9f1 100644
--- a/UI/data/locale/nl-NL.ini
+++ b/UI/data/locale/nl-NL.ini
@@ -42,7 +42,7 @@ Clear="Wissen"
Revert="Herstellen"
Show="Weergeven"
Hide="Verbergen"
-UnhideAll="Verberge alle"
+UnhideAll="Allemaal zichtbaar maken"
Untitled="Naamloos"
New="Nieuw"
Duplicate="Dupliceren"
@@ -78,6 +78,8 @@ None="Geen"
StudioMode.Preview="Preview"
StudioMode.Program="Programma"
ShowInMultiview="Weergeven in Multiview"
+VerticalLayout="Verticale Lay-out"
+Group="Groep"
AlreadyRunning.Title="OBS is al actief"
AlreadyRunning.Text="OBS is al actief! Tenzij je dit wilde doen, sluit a.u.b. alle reeds draaiende instanties van OBS voor je een nieuwe instantie opstart. Als je OBS hebt ingesteld om naar het systeemvak te minimaliseren, controleer dan of hij daar nog staat."
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="Replay Buffer aan het stoppen..."
Basic.Main.StopStreaming="Stream Stoppen"
Basic.Main.StoppingStreaming="Stream Stoppen..."
Basic.Main.ForceStopStreaming="Stop Stream (vertraging negeren)"
+Basic.Main.Group="Groep %1"
+Basic.Main.GroupItems="Groepeer geselecteerde items"
+Basic.Main.Ungroup="Degroeperen"
Basic.MainMenu.File="&Bestand"
Basic.MainMenu.File.Export="&Exporteren"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="&Tools"
Basic.MainMenu.Help="&Help"
Basic.MainMenu.Help.HelpPortal="Help-&portal"
Basic.MainMenu.Help.Website="&Website Bezoeken"
+Basic.MainMenu.Help.Discord="Wordt lid van &Discord server"
Basic.MainMenu.Help.Logs="&Logbestanden"
Basic.MainMenu.Help.Logs.ShowLogs="Logbe&standen Weergeven"
Basic.MainMenu.Help.Logs.UploadCurrentLog="Upload &Huidige Logbestand"
Basic.MainMenu.Help.Logs.UploadLastLog="Upload &Laatste Logbestand"
Basic.MainMenu.Help.Logs.ViewCurrentLog="Toon Huidige Logbestand (&V)"
Basic.MainMenu.Help.CheckForUpdates="Controleer Op Updates"
+Basic.MainMenu.Help.CrashLogs="Fouten&rapport"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="Toon crashrapporten (&S)"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="Upload &laatste crash rapport"
Basic.Settings.ProgramRestart="Het programma moet opnieuw worden opgestart om deze instellingen te activeren."
Basic.Settings.ConfirmTitle="Wijzigingen Bevestigen"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Altijd minimaliseren naar het sys
Basic.Settings.General.SaveProjectors="Projectors opslaan bij afsluiten"
Basic.Settings.General.SwitchOnDoubleClick="Ga over naar scène bij dubbelklik"
Basic.Settings.General.StudioPortraitLayout="Portret/verticale layout inschakelen"
+Basic.Settings.General.Multiview="Multiview"
+Basic.Settings.General.Multiview.MouseSwitch="Klik hier om tussen scènes te wisselen"
+Basic.Settings.General.Multiview.DrawSourceNames="Toon namen van scènes"
+Basic.Settings.General.Multiview.DrawSafeAreas="Veilige gebieden (EBU R 95) tekenen"
Basic.Settings.General.MultiviewLayout="Multiview-indeling"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontaal, Boven"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontaal, Onder"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Verticaal, Links"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Verticaal, Rechts"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontaal, boven (8 scènes)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontaal, onder (8 scènes)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Verticaal, links (8 scènes)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Verticaal, rechts (8 scènes)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Horizontaal, boven (24 scènes)"
Basic.Settings.Stream="Stream"
Basic.Settings.Stream.StreamType="Stream Type"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="Vervalsnelheid Volumemeter"
Basic.Settings.Audio.MeterDecayRate.Fast="Snel"
Basic.Settings.Audio.MeterDecayRate.Medium="Gemiddeld (Type I PPM)"
Basic.Settings.Audio.MeterDecayRate.Slow="Traag (Type II PPM)"
+Basic.Settings.Audio.PeakMeterType="Piek Meter Type"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Sample piek"
+Basic.Settings.Audio.PeakMeterType.TruePeak="True piek (hogere CPU-gebruik)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="Waarschuwing: Surround sound audio is ingeschakeld."
Basic.Settings.Audio.MultichannelWarning="Als je streamt, controleer dan of je streaming service zowel surround sound ingest als surround sound afspelen ondersteunt. Twitch, Facebook 360 Live, Mixer RTMP, Smashcast zijn voorbeelden waar surround sound volledig ondersteund is. Alhoewel Facebook Live en Youtube Live beide surround ingest ondersteunen, downmixt Facebook Live het naar stereo, terwijl Youtube Live slechts twee kanalen afspeelt.\n\nOBS audio filters kunnen overweg met surround sound, maar ondersteuning bij VST plugins is niet gegarandeerd."
Basic.Settings.Audio.MultichannelWarning.Title="Surround sound audio inschakelen?"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="Netwerk"
Basic.Settings.Advanced.Network.BindToIP="Bind aan IP"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Schakel nieuwe netwerkcode in"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Lage latency modus"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Hotkeys uitschakelen wanneer hoofdvenster in focus is"
Basic.AdvAudio="Geavanceerde Audioinstellingen"
Basic.AdvAudio.Name="Naam"
@@ -749,3 +767,12 @@ OutputWarnings.MP4Recording="Waarschuwing: Opnames opgeslagen als MP4 zijn niet
FinalScene.Title="Verwijder scène"
FinalScene.Text="Er moet tenminste één scène zijn."
+NoSources.Title="Geen bronnen"
+NoSources.Text="Er zijn nog geen video bronnen toegevoegd, er zal dus een leeg scherm weergegeven worden. Weet je zeker dat je dit wilt doen?"
+NoSources.Text.AddSource="Bronnen kunnen toegevoegd worden door op het + icoon onder het vak \"Bronnen\" in het hoofdvenster te klikken."
+
+ChangeBG="Kleur instellen"
+CustomColor="Aangepaste kleur"
+
+BrowserSource.EnableHardwareAcceleration="Browser bron hardwareversnelling inschakelen"
+
diff --git a/UI/data/locale/nn-NO.ini b/UI/data/locale/nn-NO.ini
index 8405b9108..582e19aef 100644
--- a/UI/data/locale/nn-NO.ini
+++ b/UI/data/locale/nn-NO.ini
@@ -7,6 +7,7 @@ Apply="Bruk"
Cancel="Avbryt"
Close="Lukk"
Save="Lagre"
+Discard="Bryt av"
Disable="Skrue av"
Yes="Ja"
No="Nei"
@@ -22,9 +23,13 @@ Settings="Innstillingar"
Display="Skjerm"
Name="Namn"
Exit="Avslutt"
+Mixer="Blandar"
Browse="Bla gjennom"
Mono="Mono"
Stereo="Stereo"
+DroppedFrames="Slopne bilete %1 (%2%)"
+StudioProgramProjector="Fullskjermframvisar (program)"
+PreviewProjector="Fullskjermframvisar (førehandsvising)"
MultiviewProjector="Fleirvising (Fullskjerm)"
MultiviewWindowed="Fleirvising (i vindauge)"
Clear="Tøm"
@@ -33,6 +38,22 @@ Hide="Skjul"
Untitled="Utan namn"
New="Ny"
Enable="Aktiver"
+Left="Venstre"
+Right="Høgre"
+Top="Topp"
+Bottom="Botn"
+Reset="Attendeset"
+Hours="Timar"
+Minutes="Minutt"
+Seconds="Sekund"
+Import="Innfør"
+Export="Utfør"
+Copy="Kopier"
+Paste="Lim inn"
+Next="Neste"
+Back="Attende"
+Defaults="Standardar"
+None="Ingen"
StudioMode.Preview="Førehandsvising"
StudioMode.Program="Program"
@@ -176,6 +197,9 @@ Basic.Settings.General.Language="Språk"
+
+
+
diff --git a/UI/data/locale/pl-PL.ini b/UI/data/locale/pl-PL.ini
index ace22ef71..3ed7ca605 100644
--- a/UI/data/locale/pl-PL.ini
+++ b/UI/data/locale/pl-PL.ini
@@ -78,6 +78,8 @@ None="Brak"
StudioMode.Preview="Podgląd"
StudioMode.Program="Program"
ShowInMultiview="Pokaż w Multiview"
+VerticalLayout="Układ pionowy"
+Group="Grupa"
AlreadyRunning.Title="OBS jest już uruchomiony"
AlreadyRunning.Text="OBS jest już uruchomiony! Sprawdź wszystkie uruchomione wystąpienia OBS zanim uruchomisz go jeszcze raz. Jeżeli OBS jest zminimalizowany do zasobnika systemowego, sprawdź czy nie jest uruchomiony także w tym miejscu."
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="Zatrzymywanie buforu replay..."
Basic.Main.StopStreaming="Zatrzymaj stream"
Basic.Main.StoppingStreaming="Zatrzymywanie streamowania..."
Basic.Main.ForceStopStreaming="Zatrzymaj stream (anuluj opóźnienie)"
+Basic.Main.Group="Grupa %1"
+Basic.Main.GroupItems="Grupuj wybrane elementy"
+Basic.Main.Ungroup="Rozgrupuj"
Basic.MainMenu.File="&Plik"
Basic.MainMenu.File.Export="&Eksport"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="&Narzędzia"
Basic.MainMenu.Help="P&omoc"
Basic.MainMenu.Help.HelpPortal="&Portal pomocy"
Basic.MainMenu.Help.Website="Od&wiedź naszą stronę"
+Basic.MainMenu.Help.Discord="Dołącz do serwera &Discord"
Basic.MainMenu.Help.Logs="P&liki dziennika"
Basic.MainMenu.Help.Logs.ShowLogs="Pokaż pliki dziennika (&s)"
Basic.MainMenu.Help.Logs.UploadCurrentLog="Wyślij &aktualny plik dziennika"
Basic.MainMenu.Help.Logs.UploadLastLog="Wyślij o&statni plik dziennika"
Basic.MainMenu.Help.Logs.ViewCurrentLog="Podgląd akty&wnego pliku dziennika"
Basic.MainMenu.Help.CheckForUpdates="Sprawdź dostępność aktualizacji"
+Basic.MainMenu.Help.CrashLogs="&Raporty o awariach"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="Pokaż raporty o awariach (&S)"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="Wyślij ostatni raport o awariach (&L)"
Basic.Settings.ProgramRestart="Aby te ustawienia zaczęły obowiązywać, należy ponownie uruchomić program."
Basic.Settings.ConfirmTitle="Potwierdź zmiany"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Zawsze minimalizuj do zasobnika s
Basic.Settings.General.SaveProjectors="Zapisz konfigurację podglądów na pełnym ekranie przy zamknięciu aplikacji"
Basic.Settings.General.SwitchOnDoubleClick="Przejdź do sceny po dwukrotnym kliknięciu"
Basic.Settings.General.StudioPortraitLayout="Włącz układ pionowy"
+Basic.Settings.General.Multiview="Multiview"
+Basic.Settings.General.Multiview.MouseSwitch="Kliknij, aby przełączać się między scenami"
+Basic.Settings.General.Multiview.DrawSourceNames="Pokaż nazwy scen"
+Basic.Settings.General.Multiview.DrawSafeAreas="Rysowanie bezpiecznych obszarów (EBU R 95)"
Basic.Settings.General.MultiviewLayout="Podgląd wielokrotny"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Poziomo, Góra"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Poziomo, Dół"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Pionowo, Lewo"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Pionowo, Prawo"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Poziomo, Góra (8 scen)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Poziomo, Dół (8 scen)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Pionowo, Lewo (8 scen)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Pionowo, Prawo (8 scen)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Poziomo, Góra (24 sceny)"
Basic.Settings.Stream="Stream"
Basic.Settings.Stream.StreamType="Typ streamu"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="Szybkość powrotu miernika audio"
Basic.Settings.Audio.MeterDecayRate.Fast="Szybko"
Basic.Settings.Audio.MeterDecayRate.Medium="Średnio (PPM typu I)"
Basic.Settings.Audio.MeterDecayRate.Slow="Wolno (PPM typu II)"
+Basic.Settings.Audio.PeakMeterType="Typ szczytowego poziomu paska audio"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Poziom szczytowy próbkowany"
+Basic.Settings.Audio.PeakMeterType.TruePeak="Rzeczywisty szczytowy poziom (większe użycie procesora)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="Uwaga: Dźwięk przestrzenny jest włączony."
Basic.Settings.Audio.MultichannelWarning="W przypadku streamowania sprawdź, czy docelowa usługa obsługuje wielokanałowe wejście oraz odtwarzanie dźwięku surround. Twitch, Facebook, 360 Live, Mixer RTMP, Smashcast to przykłady usług obsługujących dźwięk wielokanałowy. O ile Facebook Live i Youtube Live obsługują wejście dźwięku wielokanałowego, to w przypadku odtwarzania Facebook miksuje kanału do stereo a Youtube Live odtwarza tylko dwa kanały.\n\nFiltry dźwiękowe OBS są w pełni kompatybilne z dźwiękiem kanałowym, natomiast wsparcie pluginów VST nie jest gwarantowane."
Basic.Settings.Audio.MultichannelWarning.Title="Włączyć dźwięk przestrzenny?"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="Sieć"
Basic.Settings.Advanced.Network.BindToIP="Przypisane IP"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Aktywuj nowy kod sieciowy"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Tryb niskich opóźnień"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Wyłącz skróty klawiszowe, gdy główne okno programu jest aktywne na pierwszym planie"
Basic.AdvAudio="Zaawansowane ustawienia dźwięku"
Basic.AdvAudio.Name="Nazwa"
@@ -749,3 +767,12 @@ OutputWarnings.MP4Recording="Ostrzeżenie: Nagrania zapisanego w formacie mp4 ni
FinalScene.Title="Usuń scenę"
FinalScene.Text="Musi być co najmniej jedna scena."
+NoSources.Title="Brak źródeł"
+NoSources.Text="Wygląda na to, że nie dodano żadnych źródeł video. Na wyjściu otrzymasz tylko czarny ekran. Czy na pewno chcesz to zrobić?"
+NoSources.Text.AddSource="Źródła dodać można w każdym momencie klikając przycisk + w okienku Źródła głównego ekranu aplikacji."
+
+ChangeBG="Ustaw kolor"
+CustomColor="Kolor niestandardowy"
+
+BrowserSource.EnableHardwareAcceleration="Włącz akcelerację sprzętową w pluginie przeglądarki"
+
diff --git a/UI/data/locale/pt-BR.ini b/UI/data/locale/pt-BR.ini
index a0361013d..593869765 100644
--- a/UI/data/locale/pt-BR.ini
+++ b/UI/data/locale/pt-BR.ini
@@ -78,6 +78,8 @@ None="Nenhuma"
StudioMode.Preview="Prévia"
StudioMode.Program="Programa"
ShowInMultiview="Mostrar no Multiview"
+VerticalLayout="Layout Vertical"
+Group="Grupo"
AlreadyRunning.Title="OBS já está em execução"
AlreadyRunning.Text="OBS já está em execução! A menos que você tenha a intenção de fazer isso, por favor, feche todas as instâncias existentes do OBS antes de tentar executar uma nova. Se você tiver definido para minimizar o OBS na bandeja do sistema, verifique se ainda está lá em execução."
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="Parando Buffer do Replay..."
Basic.Main.StopStreaming="Parar Transmissão"
Basic.Main.StoppingStreaming="Parando Transmissão..."
Basic.Main.ForceStopStreaming="Pare de transmitir (descartar atraso)"
+Basic.Main.Group="Grupo %1"
+Basic.Main.GroupItems="Agrupar Itens Selecionados"
+Basic.Main.Ungroup="Desagrupar"
Basic.MainMenu.File="&Arquivo"
Basic.MainMenu.File.Export="&Exportar"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="Ferramentas (&T)"
Basic.MainMenu.Help="&Ajuda"
Basic.MainMenu.Help.HelpPortal="&Portal de Ajuda"
Basic.MainMenu.Help.Website="Visitar &website"
+Basic.MainMenu.Help.Discord="Juntar-se ao Servidor do &Discord"
Basic.MainMenu.Help.Logs="&Arquivos de Log"
Basic.MainMenu.Help.Logs.ShowLogs="&Mostrar Arquivos de Log"
Basic.MainMenu.Help.Logs.UploadCurrentLog="Enviar &Arquivo de Log Atual"
Basic.MainMenu.Help.Logs.UploadLastLog="Enviar &Ultimo Arquivo de Log"
Basic.MainMenu.Help.Logs.ViewCurrentLog="&Exibir Log atual"
Basic.MainMenu.Help.CheckForUpdates="Verificar se há atualizações"
+Basic.MainMenu.Help.CrashLogs="&Relatórios de erros"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="Exibir relatórios de erro&s"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="Enviar ú<imo relatório de erros"
Basic.Settings.ProgramRestart="O Programa precisar ser reiniciado para que estas configurações surtam efeito."
Basic.Settings.ConfirmTitle="Confirmar Alterações"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Sempre minimizar para a bandeja (
Basic.Settings.General.SaveProjectors="Salvar projetores ao sair"
Basic.Settings.General.SwitchOnDoubleClick="Mudar para a cena quando clicar duas vezes"
Basic.Settings.General.StudioPortraitLayout="Ativar o layout Paisagem/Retrato"
+Basic.Settings.General.Multiview="Multiview"
+Basic.Settings.General.Multiview.MouseSwitch="Clique para alternar entre cenas"
+Basic.Settings.General.Multiview.DrawSourceNames="Mostrar nome das cenas"
+Basic.Settings.General.Multiview.DrawSafeAreas="Mostrar áreas de segurança (EBU R 95)"
Basic.Settings.General.MultiviewLayout="Layout do Multiview"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontal, Acima"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontal, Abaixo"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertical, à Esquerda"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertical, à Direita"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontal, Acima (8 Cenas)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontal, Abaixo (8 Cenas)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertical, à Esquerda (8 Cenas)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertical, à Direita (8 Cenas)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Horizontal, Acima (24 Cenas)"
Basic.Settings.Stream="Stream"
Basic.Settings.Stream.StreamType="Tipo de Stream"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="Taxa de Decaimento do Medidor de Áudio"
Basic.Settings.Audio.MeterDecayRate.Fast="Rápida"
Basic.Settings.Audio.MeterDecayRate.Medium="Média (PPM Tipo I)"
Basic.Settings.Audio.MeterDecayRate.Slow="Devagar (PPM Tipo II)"
+Basic.Settings.Audio.PeakMeterType="Tipo do medidor de pico"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Exemplo de pico"
+Basic.Settings.Audio.PeakMeterType.TruePeak="True Peak (Uso elevado de CPU)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="AVISO: Áudio Surround está habilitado."
Basic.Settings.Audio.MultichannelWarning="Antes de transmitir, verifique se o seu serviço de transmissão suporta tanto receber como reproduzir som surround. Twitch, Facebook 360 Live, Mixer RTMP, Smashcast são exemplos onde o som surround é totalmente suportado. Embora o Facebook Live e o YouTube Live ambos aceitem receber som surround, o Facebook Live transformará para estéreo e o YouTube Live reproduz apenas dois canais.\n\nOs filtros de áudio do OBS são compatíveis com o som surround, embora o suporte do plugin VST não seja garantido."
Basic.Settings.Audio.MultichannelWarning.Title="Ativar o som surround?"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="Rede"
Basic.Settings.Advanced.Network.BindToIP="Transmitir pelo IP"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Habilitar o novo código de rede"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Modo de baixa latência"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Desativar teclas de atalho quando a janela principal estiver em foco"
Basic.AdvAudio="Propriedades de áudio avançadas"
Basic.AdvAudio.Name="Nome"
@@ -749,3 +767,12 @@ OutputWarnings.MP4Recording="Atenção: Gravações salvas em arquivos MP4 se to
FinalScene.Title="Excluir cena"
FinalScene.Text="É preciso haver pelo menos uma cena."
+NoSources.Title="Sem Fontes"
+NoSources.Text="Parece que você ainda não adicionou nenhuma fonte de vídeo, portanto, você só exibirá uma tela em branco. Você tem certeza de que quer fazer isso?"
+NoSources.Text.AddSource="Você pode adicionar fontes clicando no ícone + sob a caixa de Fontes na janela principal, a qualquer momento."
+
+ChangeBG="Definir Cor"
+CustomColor="Cor Personalizada"
+
+BrowserSource.EnableHardwareAcceleration="Habilitar a aceleração por Hardware do Navegador"
+
diff --git a/UI/data/locale/pt-PT.ini b/UI/data/locale/pt-PT.ini
index 25c82a734..5c6cd0ef9 100644
--- a/UI/data/locale/pt-PT.ini
+++ b/UI/data/locale/pt-PT.ini
@@ -478,10 +478,6 @@ Basic.Settings.General.RecordWhenStreaming="Gravar automaticamente quando estive
Basic.Settings.General.KeepRecordingWhenStreamStops="Continuar a gravar quando a transmissão parar"
Basic.Settings.General.SysTray="Bandeja do Sistema"
Basic.Settings.General.SysTrayWhenStarted="Minimizar para a área de notificações quando iniciado"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontal, Topo"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontal, Inferior"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertical, Esquerda"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertical, Direita"
Basic.Settings.Stream="Transmissão"
Basic.Settings.Stream.StreamType="Tipo de transmissão"
@@ -697,3 +693,6 @@ OutputWarnings.MultiTrackRecording="Aviso: Alguns formatos (como FLV) não supor
FinalScene.Title="Apagar Cena"
+
+
+
diff --git a/UI/data/locale/ro-RO.ini b/UI/data/locale/ro-RO.ini
index 0c3b094f3..43208f054 100644
--- a/UI/data/locale/ro-RO.ini
+++ b/UI/data/locale/ro-RO.ini
@@ -598,3 +598,6 @@ OutputWarnings.MultiTrackRecording="Atenție: Anumite formate (precum FLV) nu su
FinalScene.Text="Trebuie să existe cel puțin o scenă."
+
+
+
diff --git a/UI/data/locale/ru-RU.ini b/UI/data/locale/ru-RU.ini
index 7462e4878..cb2a1a7be 100644
--- a/UI/data/locale/ru-RU.ini
+++ b/UI/data/locale/ru-RU.ini
@@ -78,6 +78,8 @@ None="Нет"
StudioMode.Preview="Предпросмотр"
StudioMode.Program="Программа"
ShowInMultiview="Отображать в Мульти-обзоре"
+VerticalLayout="Вертикальное расположение"
+Group="Группа"
AlreadyRunning.Title="OBS уже запущен"
AlreadyRunning.Text="OBS уже запущен! Пожалуйста, закройте все запущенные экземпляры OBS перед попыткой запустить новые (только если вы не хотели именно этого). Если вы настроили OBS на сворачивание в системный трей, пожалуйста, проверьте, возможно он до сих пор запущен."
@@ -171,11 +173,11 @@ Updater.FailedToLaunch="Не удалось проверить обновлен
Updater.GameCaptureActive.Title="Производится захват игры"
Updater.GameCaptureActive.Text="Библиотека захвата игр уже используется. Закройте захватываемые игры/программы (или перезапустите Windows) и попробуйте ещё раз."
-QuickTransitions.SwapScenes="Замена Просмотра/Вывода Сцены После Перехода"
-QuickTransitions.SwapScenesTT="Замена просмотра и вывода сцены после перехода (если выходная оригинальная сцена до сих пор существует).\nЭто будет не отмена каких-либо изменений, что, возможно, было сделано в выходной оригинальной сцены."
-QuickTransitions.DuplicateScene="Повторяющиеся Сцены"
+QuickTransitions.SwapScenes="Менять местами сцены предпросмотра и вывода после перехода"
+QuickTransitions.SwapScenesTT="Меняет местами сцены предпросмотра и вывода после перехода (если оригинальная выходная сцена до сих пор существует).\nЭто не отменяет никаких изменений, которые возможно были сделаны в оригинальной выходной сцене."
+QuickTransitions.DuplicateScene="Дублировать сцену"
QuickTransitions.DuplicateSceneTT="При редактировании одной и той же сцены, функция позволяет трансформировать редактирования/видимости источников без изменения выхода.\nДля редактирования свойств источников без изменения выходного сигнала, включить \"дублировать источники'.\nИзменение этого параметра приведет к сбросу выходного сигнала в сцене (если оно еще существует)."
-QuickTransitions.EditProperties="Дублировать Источники"
+QuickTransitions.EditProperties="Дублировать источники"
QuickTransitions.EditPropertiesTT="При редактировании одной и той же сцены, функция позволяет редактировать свойства источников без изменения выхода.\nЭто может только использоваться, если \"Повторяющиеся Сцены\" включен.\nНекоторые источники (такие как захват или медиа-источники) не поддерживаются и не могут быть отредактированы отдельно.\nИзменение этого параметра приведет к сбросу выходного сигнала в сцене (если оно еще существует).\n\nПредупреждение: поскольку источники будут дублироваться, это может потребовать дополнительных системных ресурсов или видео."
QuickTransitions.HotkeyName="Быстрый переход: %1"
@@ -274,10 +276,10 @@ Basic.DisplayCapture="Захват экрана"
Basic.Main.PreviewConextMenu.Enable="Включить предпросмотр"
-ScaleFiltering="Фильтрация масштаба"
-ScaleFiltering.Point="Точечная"
-ScaleFiltering.Bilinear="Билинейная"
-ScaleFiltering.Bicubic="Бикубическая"
+ScaleFiltering="Фильтр масштабирования"
+ScaleFiltering.Point="Точечный"
+ScaleFiltering.Bilinear="Билинейный"
+ScaleFiltering.Bicubic="Бикубический"
ScaleFiltering.Lanczos="Метод Ланцоша"
Deinterlacing="Устранение чересстрочности"
@@ -399,12 +401,15 @@ Basic.Main.StartRecording="Начать запись"
Basic.Main.StartReplayBuffer="Запустить повтор"
Basic.Main.StartStreaming="Запустить трансляцию"
Basic.Main.StopRecording="Остановить запись"
-Basic.Main.StoppingRecording="Остановка Записи..."
+Basic.Main.StoppingRecording="Остановка записи..."
Basic.Main.StopReplayBuffer="Остановить повтор"
Basic.Main.StoppingReplayBuffer="Остановка повтора..."
Basic.Main.StopStreaming="Остановить трансляцию"
Basic.Main.StoppingStreaming="Остановка вещания..."
-Basic.Main.ForceStopStreaming="Остановить передачу (отменить задержку)"
+Basic.Main.ForceStopStreaming="Остановить трансляцию (сбросить задержку)"
+Basic.Main.Group="Группа %1"
+Basic.Main.GroupItems="Сгруппировать выбранные элементы"
+Basic.Main.Ungroup="Разгруппировать"
Basic.MainMenu.File="&Файл"
Basic.MainMenu.File.Export="&Экспорт"
@@ -413,7 +418,7 @@ Basic.MainMenu.File.ShowRecordings="Показать &записи"
Basic.MainMenu.File.Remux="Ре&мультиплексирование записей"
Basic.MainMenu.File.Settings="&Настройки"
Basic.MainMenu.File.ShowSettingsFolder="Показать папку с настройками"
-Basic.MainMenu.File.ShowProfileFolder="Показать папку профиля"
+Basic.MainMenu.File.ShowProfileFolder="Показать папку с профилями"
Basic.MainMenu.AlwaysOnTop="&Поверх других окон"
Basic.MainMenu.File.Exit="&Выход"
@@ -423,15 +428,15 @@ Basic.MainMenu.Edit.Redo="&Повторить"
Basic.MainMenu.Edit.UndoAction="&Отменить $1"
Basic.MainMenu.Edit.RedoAction="&Повторить $1"
Basic.MainMenu.Edit.LockPreview="&Заблокировать предпросмотр"
-Basic.MainMenu.Edit.Scale="Просмотр и масштабирование"
+Basic.MainMenu.Edit.Scale="&Масштабирование предпросмотра"
Basic.MainMenu.Edit.Scale.Window="Масштаб окна"
Basic.MainMenu.Edit.Scale.Canvas="Холст (%1x%2)"
Basic.MainMenu.Edit.Scale.Output="Вывод (%1x%2)"
-Basic.MainMenu.Edit.Transform="&Преобразовать"
-Basic.MainMenu.Edit.Transform.EditTransform="&Изменить преобразование..."
-Basic.MainMenu.Edit.Transform.CopyTransform="Копировать преобразование"
-Basic.MainMenu.Edit.Transform.PasteTransform="Вставить преобразование"
-Basic.MainMenu.Edit.Transform.ResetTransform="&Сбросить преобразование"
+Basic.MainMenu.Edit.Transform="&Трансформировать"
+Basic.MainMenu.Edit.Transform.EditTransform="&Изменить отображение..."
+Basic.MainMenu.Edit.Transform.CopyTransform="Скопировать трансформацию"
+Basic.MainMenu.Edit.Transform.PasteTransform="Вставить трансформацию"
+Basic.MainMenu.Edit.Transform.ResetTransform="&Сбросить трансформацию"
Basic.MainMenu.Edit.Transform.Rotate90CW="Повернуть на 90 градусов по часовой"
Basic.MainMenu.Edit.Transform.Rotate90CCW="Повернуть на 90 градусов против часовой"
Basic.MainMenu.Edit.Transform.Rotate180="Повернуть на 180 градусов"
@@ -441,7 +446,7 @@ Basic.MainMenu.Edit.Transform.FitToScreen="&Подогнать по размер
Basic.MainMenu.Edit.Transform.StretchToScreen="&Растянуть на весь экран"
Basic.MainMenu.Edit.Transform.CenterToScreen="&Разместить по центру экрана"
Basic.MainMenu.Edit.Order="&Порядок"
-Basic.MainMenu.Edit.Order.MoveUp="Переместить &Выше"
+Basic.MainMenu.Edit.Order.MoveUp="Переместить &выше"
Basic.MainMenu.Edit.Order.MoveDown="Переместить &Ниже"
Basic.MainMenu.Edit.Order.MoveToTop="Переместить &Наверх"
Basic.MainMenu.Edit.Order.MoveToBottom="Переместить &Вниз"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="&Инструменты"
Basic.MainMenu.Help="&Справка"
Basic.MainMenu.Help.HelpPortal="&Портал помощи"
Basic.MainMenu.Help.Website="Посетить &веб-сайт"
+Basic.MainMenu.Help.Discord="Зайти на сервер &Discord"
Basic.MainMenu.Help.Logs="&Log файлы"
Basic.MainMenu.Help.Logs.ShowLogs="&Показать лог-файлы"
Basic.MainMenu.Help.Logs.UploadCurrentLog="Загрузить &текущий Log файл"
Basic.MainMenu.Help.Logs.UploadLastLog="Загрузить &последний Log файл"
Basic.MainMenu.Help.Logs.ViewCurrentLog="&Просмотреть текущий журнал"
Basic.MainMenu.Help.CheckForUpdates="Проверить наличие обновлений"
+Basic.MainMenu.Help.CrashLogs="&Отчёты об ошибках"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="&Показать отчёты об ошибках"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="&Загрузить последний отчёт об ошибке"
Basic.Settings.ProgramRestart="Для изменения этих параметров требуется перезапустить программу."
Basic.Settings.ConfirmTitle="Подтверждить Изменения"
@@ -491,27 +500,32 @@ Basic.Settings.General.WarnBeforeStartingStream="Показывать окно
Basic.Settings.General.WarnBeforeStoppingStream="Показывать окно подтверждения при остановке трансляции"
Basic.Settings.General.Projectors="Проекторы"
Basic.Settings.General.HideProjectorCursor="Скрыть курсор за проекторы"
-Basic.Settings.General.ProjectorAlwaysOnTop="Показывать проекторы поверх всего остального"
+Basic.Settings.General.ProjectorAlwaysOnTop="Показывать проекторы поверх всех окон"
Basic.Settings.General.Snapping="Привязка расположения источника"
Basic.Settings.General.ScreenSnapping="Привязка к краю экрана"
Basic.Settings.General.CenterSnapping="Привязка к центру по горизонтали и вертикали"
Basic.Settings.General.SourceSnapping="Привязка к другим источникам"
Basic.Settings.General.SnapDistance="Чувствительность привязки"
-Basic.Settings.General.RecordWhenStreaming="Автоматическая запись при стриме"
-Basic.Settings.General.KeepRecordingWhenStreamStops="Продолжить запись, когда стрим остановится"
+Basic.Settings.General.RecordWhenStreaming="Автоматически включать запись во время трансляции"
+Basic.Settings.General.KeepRecordingWhenStreamStops="Продолжать запись после завершения трансляции"
Basic.Settings.General.ReplayBufferWhileStreaming="Автоматически запускать буфер повтора во время трансляции"
-Basic.Settings.General.KeepReplayBufferStreamStops="Сохранять буфер повтора активным когда останавливается трансляция"
+Basic.Settings.General.KeepReplayBufferStreamStops="Сохранять буфер повтора активным после завершения трансляции"
Basic.Settings.General.SysTray="Системный трей"
Basic.Settings.General.SysTrayWhenStarted="Скрывать окно в системный трей при запуске"
Basic.Settings.General.SystemTrayHideMinimize="Всегда сворачивать в трей вместо панели задач"
Basic.Settings.General.SaveProjectors="Сохранять проекторы при выходе"
Basic.Settings.General.SwitchOnDoubleClick="Переход к сцене при двойном щелчке"
Basic.Settings.General.StudioPortraitLayout="Включить портретное/вертикальное расположение"
+Basic.Settings.General.Multiview="Мульти-обзор"
+Basic.Settings.General.Multiview.MouseSwitch="Переключение сцен щелчком мыши"
+Basic.Settings.General.Multiview.DrawSourceNames="Показывать названия сцен"
+Basic.Settings.General.Multiview.DrawSafeAreas="Показывать зоны безопасности (EBU R 95)"
Basic.Settings.General.MultiviewLayout="Размещение мульти-обзора"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Горизонтально, вверху"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Горизонтально, внизу"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Вертикально, слева"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Вертикально, справа"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Горизонтально, верх (8 сцен)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Горизонтально, низ (8 сцен)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Вертикально, слева (8 сцен)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Вертикально, справа (8 сцен)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Горизонтально, верх (24 сцены)"
Basic.Settings.Stream="Вещание"
Basic.Settings.Stream.StreamType="Тип вещания"
@@ -534,7 +548,7 @@ Basic.Settings.Output.ReplayBuffer.EstimateUnknown="Невозможно оце
Basic.Settings.Output.ReplayBuffer.HotkeyMessage="(Примечание: Убедитесь, что установили горячую клавишу для воспроизведения буфера в разделе горячие клавиши)"
Basic.Settings.Output.ReplayBuffer.Prefix="Префикс имени файла повтора"
Basic.Settings.Output.ReplayBuffer.Suffix="Суффикс"
-Basic.Settings.Output.Simple.SavePath="Путь к записи"
+Basic.Settings.Output.Simple.SavePath="Путь записи"
Basic.Settings.Output.Simple.RecordingQuality="Качество записи"
Basic.Settings.Output.Simple.RecordingQuality.Stream="То же, что у трансляции"
Basic.Settings.Output.Simple.RecordingQuality.Small="Высокое качество, средний размер файла"
@@ -552,8 +566,8 @@ Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Аппаратный (QSV)"
Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Аппаратный (AМD)"
Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Аппаратный (NVENC)"
Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Программный (x264 с низкой нагрузкой на ЦП, увеличивает размер файла)"
-Basic.Settings.Output.VideoBitrate="Видео битрейт"
-Basic.Settings.Output.AudioBitrate="Аудио битрейт"
+Basic.Settings.Output.VideoBitrate="Битрейт видео"
+Basic.Settings.Output.AudioBitrate="Битрейт аудио"
Basic.Settings.Output.Reconnect="Автопереподключение"
Basic.Settings.Output.RetryDelay="Переподключиться через (секунд)"
Basic.Settings.Output.MaxRetries="Количество попыток подключиться"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="Скорость спада аудиоме
Basic.Settings.Audio.MeterDecayRate.Fast="Быстро"
Basic.Settings.Audio.MeterDecayRate.Medium="Средне (PPM типа I)"
Basic.Settings.Audio.MeterDecayRate.Slow="Медленно (PPM типа II)"
+Basic.Settings.Audio.PeakMeterType="Тип измерителя пиков"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Упрощенный"
+Basic.Settings.Audio.PeakMeterType.TruePeak="Точный (Повышенное использование ЦП)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="ВНИМАНИЕ: Объемный звук включен."
Basic.Settings.Audio.MultichannelWarning="При запуске стрима проверьте, поддерживает ли ваш сервис потокового вещания объемный звук (как запись, так и воспроизведение). Twitch, Facebook 360 Live, Mixer RTMP, Smashcast — примеры сервисов, полностью поддерживающих объемное звучание. Несмотря на то, что Facebook Live и Youtube Live принимают объёмный звук, Facebook Live микширует его в стерео, а Youtube Live воспроизводит только два канала.\n\nЗвуковые фильтры OBS совместимы с объемным звучанием, хотя поддержка плагинов VST не гарантируется."
Basic.Settings.Audio.MultichannelWarning.Title="Включить объемный звук?"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="Сеть"
Basic.Settings.Advanced.Network.BindToIP="Привязать к IP"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Включить новый сетевой код"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Режим низкой задержки"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Отключить горячие клавиши, если главное окно находится в фокусе"
Basic.AdvAudio="Расширенные свойства аудио"
Basic.AdvAudio.Name="Название"
@@ -749,3 +767,12 @@ OutputWarnings.MP4Recording="Внимание: Записи, сохраненн
FinalScene.Title="Удалить сцену"
FinalScene.Text="Здесь должна быть по крайней мере одна сцена."
+NoSources.Title="Нет источников"
+NoSources.Text="Похоже, вы еще не добавили ни одного источника. Вы будете выводить только пустой экран. Вы уверены, что хотите этого?"
+NoSources.Text.AddSource="Вы можете добавить источники, нажав иконку + под окном Источники в главном окне в любое время."
+
+ChangeBG="Установить цвет"
+CustomColor="Пользовательский цвет"
+
+BrowserSource.EnableHardwareAcceleration="Включить аппаратное ускорение Браузера"
+
diff --git a/UI/data/locale/sk-SK.ini b/UI/data/locale/sk-SK.ini
index fc9bb9915..fd45ee8a2 100644
--- a/UI/data/locale/sk-SK.ini
+++ b/UI/data/locale/sk-SK.ini
@@ -78,6 +78,8 @@ None="Nič"
StudioMode.Preview="Náhľad"
StudioMode.Program="Program"
ShowInMultiview="Zobraziť v Multiview"
+VerticalLayout="Vertikálne rozloženie"
+Group="Skupina"
AlreadyRunning.Title="OBS je už spustený"
AlreadyRunning.Text="OBS je už spustená! Prosím vypnite všetky existujúce inštancie OBS pred pokusom o spustenie novej inštancie. Ak máte OBS minimalizovaný do systémovej lišty, prosím skontrolujte či tam stále beží."
@@ -112,28 +114,41 @@ Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="60 alebo 30, ale radšej 60, ak je
Basic.AutoConfig.VideoPage.FPS.PreferHighRes="60 alebo 30, ale radšej vysoké rozlíšenie"
Basic.AutoConfig.VideoPage.CanvasExplanation="Poznámka: rozlíšenie (základné) plátna nie je nevyhnutne rovnaké ako rozlíšenie v ktorom budete streamovať alebo nahrávať. Skutočné streamovacie/nahrávacie rozlíšenie môže byť zmenšené preto aby sa znížilo používanie dát alebo zdrojov."
Basic.AutoConfig.StreamPage="Informácie o streame"
+Basic.AutoConfig.StreamPage.SubTitle="Prosím, zadajte svoje údaje o vysielaní"
Basic.AutoConfig.StreamPage.Service="Služba"
Basic.AutoConfig.StreamPage.Service.ShowAll="Zobraziť všetky..."
Basic.AutoConfig.StreamPage.Server="Server"
Basic.AutoConfig.StreamPage.StreamKey="Streamovací kľúč"
Basic.AutoConfig.StreamPage.StreamKey.LinkToSite="(Odkaz)"
+Basic.AutoConfig.StreamPage.PerformBandwidthTest="Odhadnúť bitrate pomocou testu rýchlosti pripojenia (môže to trvať pár minút)"
Basic.AutoConfig.StreamPage.PreferHardwareEncoding="Preferovať hardvérové enkódovanie"
+Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="Hardwarové enkódovanie eliminuje väčšinu využitia CPU, ale na dosiahnutie rovnakej kvality videa môže vyžadovať väčší bitrate."
Basic.AutoConfig.StreamPage.StreamWarning.Title="Upozornenie o streame"
+Basic.AutoConfig.StreamPage.StreamWarning.Text="Test rýchlosti pripojenia vysiela obraz bez zvuku s náhodnými dátami. Odporúčame dočasne zakázať záznam vysielaní a nastaviť živý prenos ako súkromný, kým sa celý test nedokončí. Pokračovať?"
Basic.AutoConfig.TestPage="Konečné výsledky"
+Basic.AutoConfig.TestPage.SubTitle.Testing="Program práve vykonáva sériu testov pre odhad optimálneho nastavenia"
Basic.AutoConfig.TestPage.SubTitle.Complete="Testovanie dokončené"
+Basic.AutoConfig.TestPage.TestingBandwidth="Prebieha testovanie rýchlosti pripojenia. Toto môže chvíľku trvať..."
Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="Pripájanie k: %1..."
+Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="Nepodarilo sa pripojiť k žiadnemu serveru. Skontrolujte vaše internetové pripojenie a skúste to znovu."
+Basic.AutoConfig.TestPage.TestingBandwidth.Server="Testovanie rýchlosti pripojenia pre: %1"
Basic.AutoConfig.TestPage.TestingStreamEncoder="Testovanie streamovacieho enkodéra, toto môže trvať minútu..."
Basic.AutoConfig.TestPage.TestingRecordingEncoder="Testovanie nahrávacieho enkodéra, toto môže trvať minútu..."
Basic.AutoConfig.TestPage.TestingRes="Testovanie rozlíšení, toto môže trvať niekoľko minút..."
Basic.AutoConfig.TestPage.TestingRes.Fail="Nepodarilo sa spustiť enkodér"
Basic.AutoConfig.TestPage.TestingRes.Resolution="Testovanie %1x%2 %3 FPS..."
-Basic.AutoConfig.TestPage.Result.StreamingEncoder="Streamovací Enkodér"
-Basic.AutoConfig.TestPage.Result.RecordingEncoder="Nahrávací Enkodér"
+Basic.AutoConfig.TestPage.Result.StreamingEncoder="Kodér vysielania"
+Basic.AutoConfig.TestPage.Result.RecordingEncoder="Kodér nahrávania"
+Basic.AutoConfig.TestPage.Result.Header="Program zistil, že nasledujúce nastavenia by mohli byť pre vás najvhodnejšie:"
+Basic.AutoConfig.TestPage.Result.Footer="Pre použitie týchto nastavení kliknite na Použiť. Pre úpravu nastavení sprievodcu kliknite na Späť. Ak si želáte nastaviť program manuálne, kliknite na Zrušiť a následne na tlačidlo Nastavenia."
Basic.Stats="Štatistiky"
Basic.Stats.CPUUsage="Využitie CPU"
Basic.Stats.HDDSpaceAvailable="Dostupné miesto na HDD"
Basic.Stats.MemoryUsage="Využitie pamäte"
+Basic.Stats.AverageTimeToRender="Priemerný čas vykreslenia snímku"
+Basic.Stats.SkippedFrames="Preskočené snímky kvôli chybe kódovania"
+Basic.Stats.MissedFrames="Nevyužité snímky kvôli chybe vykresľovania"
Basic.Stats.Output.Stream="Stream"
Basic.Stats.Output.Recording="Nahrávanie"
Basic.Stats.Status="Stav"
@@ -151,15 +166,23 @@ Updater.UpdateNow="Aktualizovať teraz"
Updater.RemindMeLater="Pripomenúť neskôr"
Updater.Skip="Preskočiť verziu"
Updater.Running.Title="Program momentálne aktívny"
+Updater.Running.Text="Niektoré výstupy sú stále aktívne. Zastavte ich pred ďalším pokusom o aktualizáciu"
Updater.NoUpdatesAvailable.Title="Neboli nájdené žiadne aktualizácie"
Updater.NoUpdatesAvailable.Text="Nie sú momentálne k dispozícii žiadne aktualizácie"
Updater.FailedToLaunch="Nepodarilo sa spustiť aktualizátor"
Updater.GameCaptureActive.Title="Zachytenie hry aktívne"
+Updater.GameCaptureActive.Text="Knižnica pre záznam hier je stále aktívna. Ukončite, prosím, všetky snímané hry/programy (alebo reštartujte Windows) a skúste to znovu."
+QuickTransitions.SwapScenes="Prehodiť scény po prechode"
+QuickTransitions.SwapScenesTT="Prehodí scény pre náhľad a výstup po prechode (ak pôvodná scéna výstupu stále existuje).\nToto nevráti žiadne zmeny vykonané v pôvodnej scéne pre výstup."
QuickTransitions.DuplicateScene="Duplikovať scénu"
+QuickTransitions.DuplicateSceneTT="Pri úprave rovnakej scény umožňuje úpravu pozície/viditeľnosti zdrojov bez úpravy výstupu.\nPre úpravu vlastností zdrojov bez úpravy výstupu povoľte možnosť \"Duplikovať zdroje\".\nZmena tejto hodnoty spôsobí vyresetovanie súčasnej scény výstupu (ak stále existuje)."
QuickTransitions.EditProperties="Duplikovať zdroje"
+QuickTransitions.EditPropertiesTT="Pri úprave rovnakej scény umožňuje nastavenie zdrojov bez úpravy výstupu.\nTáto funkcia môže byť použitá, len ak je zapnutá možnosť \"Duplikovať scénu\".\nNiektoré zdroje (napr. zdroje záznamu či mediálne zdroje) túto funkciu nepodporujú a nemôžu byť upravované samostatne.\nPo zmene tejto hodnoty bude súčasná scéna výstupu vyresetovaná (ak stále existuje).\n\nVarovanie: Z dôvodu duplikácie zdrojov môže táto funkcia vyžadovať viac systémových prostriedkov."
QuickTransitions.HotkeyName="Rýchly prechod: %1"
+Basic.AddTransition="Pridať nastaviteľný prechod"
+Basic.RemoveTransition="Odstrániť nastaviteľný prechod"
Basic.TransitionProperties="Vlastnosti prechodu"
Basic.SceneTransitions="Prechody medzi scénami"
Basic.TransitionDuration="Trvanie"
@@ -193,56 +216,85 @@ ConfirmRemove.TextMultiple="Naozaj si prajete odstrániť %1 položiek?"
Output.StartStreamFailed="Nepodarilo sa spustiť streamovanie"
Output.StartRecordingFailed="Nepodarilo sa spustiť nahrávanie"
Output.StartReplayFailed="Nepodarilo sa spustiť medzipamäť znovunahrávania"
+Output.StartFailedGeneric="Nastala chyba pri spúšťaní nahrávania. Podrobnosti nájdete v textovom logu.\n\nPoznámka: Ak používate NVENC alebo AMD enkodér, uistite sa, že používate najnovšiu verziu grafického ovládača."
Output.ConnectFail.Title="Spojenie sa nepodarilo"
Output.ConnectFail.BadPath="Neplatná cesta alebo URL. Prosím, skontrolujte, či sú vaše nastavenia správne."
Output.ConnectFail.ConnectFailed="Spojenie so serverom sa nepodarilo"
+Output.ConnectFail.InvalidStream="K nastavenému kanálu alebo kľúču sa nedá pristupovať. Skontrolujte, prosím, či je váš vysielací kľúč správny. Ak áno, mohol nastať problém s pripojením k serveru."
+Output.ConnectFail.Error="Pri pokuse o pripojenie k serveru nastala neočakávaná chyba. Ďalšie informácie nájdete v textovom logu."
Output.ConnectFail.Disconnected="Odpojený od servera."
Output.RecordFail.Title="Nepodarilo sa spustiť nahrávanie"
+Output.RecordFail.Unsupported="Výstupný formát nie je podporovaný alebo nepodporuje viac ako jednu zvukovú stopu. Skontrolujte nastavenia a skúste to znovu."
Output.RecordNoSpace.Title="Nedostatok miesta na disku"
+Output.RecordNoSpace.Msg="Pre pokračovanie nahrávania nie je dostatok miesta na disku."
Output.RecordError.Title="Chyba nahrávania"
+Output.RecordError.Msg="Pri nahrávaní došlo k nešpecifikovanej chybe."
Output.ReplayBuffer.NoHotkey.Title="Nepriradená žiadna klávesová skratka!"
+Output.ReplayBuffer.NoHotkey.Msg="Nie je nastavená žiadna klávesová skratka pre uloženie záznamu. Nastavte ju, prosím, aby ste mohli ukladať záznam."
Output.BadPath.Title="Nesprávna cesta k súboru"
+Output.BadPath.Text="Nastavená cesta k výstupnému súboru je chybná. Prosím, skontrolujte správnosť nastavenej cesty."
LogReturnDialog="Nahranie logu bolo úspešné"
LogReturnDialog.CopyURL="Kopírovať URL"
LogReturnDialog.ErrorUploadingLog="Chyba pri nahrávaní súboru denníka chýb"
LicenseAgreement="Licenčná zmluva"
+LicenseAgreement.PleaseReview="Pred použitím OBS si, prosím, prečítajte licenčné podmienky. Používaním tohto programu potvrdzujete, že ste si prečítali a súhlasíte s podmienkami GNU General Public License v2.0. Pre zobrazenie zvyšku licencie prejdite nižšie."
+LicenseAgreement.ClickIAgreeToContinue="Ak súhlasíte s podmienkami licencie, kliknite na Súhlasím. Pred začatím používania OBS musíte súhlasiť s ujednaním."
LicenseAgreement.IAgree="Súhlasím"
LicenseAgreement.Exit="Ukončiť"
Remux.SourceFile="OBS nahrávka"
Remux.TargetFile="Cieľový súbor"
+Remux.Remux="Previesť"
Remux.OBSRecording="OBS nahrávanie"
+Remux.FinishedTitle="Prevod dokončený"
+Remux.Finished="Nahrávka prevedená"
+Remux.FinishedError="Nahrávka prevedená, ale súbor nemusí byť kompletný"
Remux.SelectRecording="Vybrať OBS nahrávku …"
Remux.SelectTarget="Vyberte cieľový súbor …"
Remux.FileExistsTitle="Cieľový súbor existuje"
Remux.FileExists="Cieľový súbor už existuje, chcete ho nahradiť?"
+Remux.ExitUnfinishedTitle="Prebieha prevod"
+Remux.ExitUnfinished="Prevod nie je dokončený. Zastavenie môže spôsobiť poškodenie výstupného súboru.\nNaozaj chcete prevod prerušiť?"
UpdateAvailable="Je dostupná aktualizácia"
UpdateAvailable.Text="Verzia %1.%2.%3 je dostupná. Kliknite sem na jej stiahnutie"
+Basic.DesktopDevice1="Zvuk plochy"
+Basic.DesktopDevice2="Zvuk plochy 2"
Basic.AuxDevice1="Mik/Aux"
Basic.AuxDevice2="Mik/Aux 2"
+Basic.AuxDevice3="Mikrofon / AUX 3"
+Basic.AuxDevice4="Mikrofon / AUX 4"
Basic.Scene="Scéna"
Basic.DisplayCapture="Zachytávanie monitora"
Basic.Main.PreviewConextMenu.Enable="Zapnúť náhľad"
+ScaleFiltering="Filter škálovania"
ScaleFiltering.Point="Bodové"
ScaleFiltering.Bilinear="Bilineárne"
ScaleFiltering.Bicubic="Bikubické"
ScaleFiltering.Lanczos="Lanczos"
Deinterlacing="Odstránenie prekladania"
+Deinterlacing.Discard="Zahodenie"
Deinterlacing.Retro="Retro"
+Deinterlacing.Blend="Prechod"
+Deinterlacing.Blend2x="Prechod 2x"
+Deinterlacing.Linear="Lineárny"
+Deinterlacing.Linear2x="Lineárny 2x"
Deinterlacing.Yadif="Yadif"
Deinterlacing.Yadif2x="Yadif 2x"
+Deinterlacing.TopFieldFirst="Najprv vrchný riadok"
+Deinterlacing.BottomFieldFirst="Najprv spodný riadok"
+VolControl.SliderUnmuted="Posuvník hlasitosti pre '%1': %2"
VolControl.SliderMuted="Ovládanie hlasitosti pre '%1': %2 (momentálne umlčané)"
VolControl.Mute="Umlčať '%1'"
VolControl.Properties="Vlastnosti pre '%1'"
@@ -252,12 +304,18 @@ Basic.Main.AddSceneDlg.Text="Prosím, zadajte názov scény"
Basic.Main.DefaultSceneName.Text="Scéna %1"
+Basic.Main.AddSceneCollection.Title="Pridať sadu scén"
+Basic.Main.AddSceneCollection.Text="Prosím, zadajte názov sady scén"
+Basic.Main.RenameSceneCollection.Title="Premenovať sadu scén"
AddProfile.Title="Pridanie profilu"
+AddProfile.Text="Prosím, zadajte názov profilu"
RenameProfile.Title="Premenovať profil"
+Basic.Main.MixerRename.Title="Premenovať zdroj zvuku"
+Basic.Main.MixerRename.Text="Prosím, zadajte názov zdroja zvuku"
Basic.Main.PreviewDisabled="Náhľad je momentálne vypnutý"
@@ -265,6 +323,7 @@ Basic.Main.PreviewDisabled="Náhľad je momentálne vypnutý"
Basic.SourceSelect="Vytvoriť/Vybrať zdroj"
Basic.SourceSelect.CreateNew="Vytvoriť nový"
Basic.SourceSelect.AddExisting="Pridať existujúci"
+Basic.SourceSelect.AddVisible="Zviditeľniť zdroj"
Basic.PropertiesWindow="Vlastnosti pre '%1'"
Basic.PropertiesWindow.AutoSelectFormat="%1 (Automatický výber: %2)"
@@ -279,8 +338,11 @@ Basic.PropertiesWindow.AddURL="Pridať cestu/URL"
Basic.PropertiesWindow.AddEditableListDir="Pridať adresár do '%1'"
Basic.PropertiesWindow.AddEditableListFiles="Pridať súbory do '%1'"
Basic.PropertiesWindow.AddEditableListEntry="Pridať položku do '%1'"
+Basic.PropertiesWindow.EditEditableListEntry="Upraviť položku z '%1'"
Basic.PropertiesView.FPS.Simple="Jednoduché hodnoty FPS"
+Basic.PropertiesView.FPS.Rational="Rozumné hodnoty FPS"
+Basic.PropertiesView.FPS.ValidFPSRanges="Platné rozsahy FPS:"
Basic.InteractionWindow="V interakcii s '%1'"
@@ -295,6 +357,7 @@ Basic.StatusBar.DelayStartingStoppingIn="Oneskorenie (zastavenie za %1 s, začí
Basic.Filters="Filtre"
Basic.Filters.AsyncFilters="Audio/Video filtre"
Basic.Filters.AudioFilters="Audio filtre"
+Basic.Filters.EffectFilters="Filtre efektov"
Basic.Filters.Title="Filtre pre '%1'"
Basic.Filters.AddFilter.Title="Názov filtra"
Basic.Filters.AddFilter.Text="Prosím, zadajte názov filtra"
@@ -335,16 +398,24 @@ Basic.Main.Sources="Zdroje"
Basic.Main.Controls="Ovládacie prvky"
Basic.Main.Connecting="Pripájanie..."
Basic.Main.StartRecording="Spustiť nahrávanie"
+Basic.Main.StartReplayBuffer="Spustiť Replay Buffer"
Basic.Main.StartStreaming="Spustiť stream"
Basic.Main.StopRecording="Ukončiť nahrávanie"
Basic.Main.StoppingRecording="Zastavenie nahrávania..."
+Basic.Main.StopReplayBuffer="Zastaviť Replay Buffer"
+Basic.Main.StoppingReplayBuffer="Zastavujem Replay Buffer..."
Basic.Main.StopStreaming="Ukončiť stream"
Basic.Main.StoppingStreaming="Zastavenie streamu..."
+Basic.Main.ForceStopStreaming="Zastaviť vysielanie (bez oneskorenia)"
+Basic.Main.Group="Skupina %1"
+Basic.Main.GroupItems="Zoskupiť vybrané položky"
+Basic.Main.Ungroup="Rozdeliť skupinu"
Basic.MainMenu.File="Súbor (&F)"
Basic.MainMenu.File.Export="&Exportovať"
Basic.MainMenu.File.Import="&Importovať"
Basic.MainMenu.File.ShowRecordings="Zobraziť nah&rávky"
+Basic.MainMenu.File.Remux="Previesť &nahrávky"
Basic.MainMenu.File.Settings="Na&stavenia"
Basic.MainMenu.File.ShowSettingsFolder="Zobraziť priečinok nastavení"
Basic.MainMenu.File.ShowProfileFolder="Zobraziť priečinok profilu"
@@ -357,6 +428,8 @@ Basic.MainMenu.Edit.Redo="Opakovať v&rátené"
Basic.MainMenu.Edit.UndoAction="Vrátiť $1 (&U)"
Basic.MainMenu.Edit.RedoAction="Opakovať $1 (&R)"
Basic.MainMenu.Edit.LockPreview="&Zámknúť náhľad"
+Basic.MainMenu.Edit.Scale="%Rozmer náhľadu"
+Basic.MainMenu.Edit.Scale.Window="Vtesnať do okna"
Basic.MainMenu.Edit.Scale.Canvas="Plátno (%1x%2)"
Basic.MainMenu.Edit.Scale.Output="Výstup (%1x%2)"
Basic.MainMenu.Edit.Transform="&Transformácia"
@@ -377,24 +450,42 @@ Basic.MainMenu.Edit.Order.MoveUp="Pos&unúť vyššie"
Basic.MainMenu.Edit.Order.MoveDown="Posunúť nižšie (&D)"
Basic.MainMenu.Edit.Order.MoveToTop="Premies&tniť navrch"
Basic.MainMenu.Edit.Order.MoveToBottom="Premiestniť naspodok (&B)"
+Basic.MainMenu.Edit.AdvAudio="Rozšírené vl&astnosti zvuku"
+Basic.MainMenu.View="Zobraziť (&V)"
Basic.MainMenu.View.Toolbars="&Panely s nástrojmi"
Basic.MainMenu.View.Docks="Doky"
Basic.MainMenu.View.Docks.ResetUI="Resetovať UI"
Basic.MainMenu.View.Docks.LockUI="Zamknúť UI"
+Basic.MainMenu.View.Toolbars.Listboxes="Zoznamy (&L)"
+Basic.MainMenu.View.SceneTransitions="Pre&chody scén"
+Basic.MainMenu.View.StatusBar="&Stavový riadok"
+Basic.MainMenu.View.Fullscreen.Interface="Na celú obrazovku"
+Basic.MainMenu.SceneCollection="&Sada scén"
Basic.MainMenu.Profile="&Profil"
Basic.MainMenu.Profile.Import="Importovať profil"
Basic.MainMenu.Profile.Export="Exportovať profil"
+Basic.MainMenu.SceneCollection.Import="Importovať sadu scén"
+Basic.MainMenu.SceneCollection.Export="Exportovať sadu scén"
Basic.MainMenu.Profile.Exists="Tento profil už existuje"
+Basic.MainMenu.SceneCollection.Exists="Táto sada scén už existuje"
Basic.MainMenu.Tools="Nás&troje"
Basic.MainMenu.Help="Pomoc (&H)"
+Basic.MainMenu.Help.HelpPortal="&Portál pomoci"
Basic.MainMenu.Help.Website="Navštíviť &webové stránky"
+Basic.MainMenu.Help.Discord="Pripojiť sa na &Discord server"
Basic.MainMenu.Help.Logs="&Log súbory"
Basic.MainMenu.Help.Logs.ShowLogs="Zobraziť log &súbory"
+Basic.MainMenu.Help.Logs.UploadCurrentLog="Nahrať súčasný súbor záznamu (&C)"
+Basic.MainMenu.Help.Logs.UploadLastLog="Nahrať posledný súbor záznamu (&L)"
+Basic.MainMenu.Help.Logs.ViewCurrentLog="Zobraziť aktuálny záznam (&V)"
Basic.MainMenu.Help.CheckForUpdates="Skontrolovať aktualizácie"
+Basic.MainMenu.Help.CrashLogs="&Hlásenia o zlyhaní"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="&Zobraziť správy o zlyhaniach"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="&Nahrať poslednú správu"
Basic.Settings.ProgramRestart="Tieto nastavenia sa prejavia až po reštarte programu."
Basic.Settings.ConfirmTitle="Potvrdenie zmien"
@@ -403,11 +494,23 @@ Basic.Settings.Confirm="Máte neuložené zmeny. Chcete uložiť zmeny?"
Basic.Settings.General="Všeobecné"
Basic.Settings.General.Theme="Vzhľad"
Basic.Settings.General.Language="Jazyk"
+Basic.Settings.General.EnableAutoUpdates="Automaticky kontrolovať aktualizácie pri štarte"
Basic.Settings.General.Projectors="Projektory"
+Basic.Settings.General.HideProjectorCursor="Skryť kurzor pred náhľadmi"
+Basic.Settings.General.ProjectorAlwaysOnTop="Náhľady vždy navrchu"
+Basic.Settings.General.Snapping="Prichytávanie zdrojov"
+Basic.Settings.General.ScreenSnapping="Prichytávať zdroje k okraju obrazovky"
+Basic.Settings.General.CenterSnapping="Prichytávať zdroje ku stredu vodorovnej a zvislej osi"
+Basic.Settings.General.SourceSnapping="Prichytávať zdroje k iným zdrojom"
+Basic.Settings.General.SnapDistance="Prichytávať citlivosť"
+Basic.Settings.General.RecordWhenStreaming="Automaticky nahrávať pri vysielaní"
+Basic.Settings.General.KeepRecordingWhenStreamStops="Nahrávať aj po ukončení vysielania"
Basic.Settings.General.SysTray="Systémová lišta"
Basic.Settings.General.SysTrayWhenStarted="Minimalizovať do systémovej lišty pri spustení"
Basic.Settings.General.SystemTrayHideMinimize="Vždy minimalizovať do systémovej lišty namiesto panela úloh"
Basic.Settings.General.SaveProjectors="Uložiť projektory pri skončení"
+Basic.Settings.General.Multiview.DrawSourceNames="Zobraziť názvy scén"
+Basic.Settings.General.Multiview.DrawSafeAreas="Vykresliť bezpečné zóny (EBU R 95)"
Basic.Settings.Stream="Stream"
Basic.Settings.Stream.StreamType="Typ streamu"
@@ -422,32 +525,48 @@ Basic.Settings.Output.Mode="Režim výstupu"
Basic.Settings.Output.Mode.Simple="Jednoduchý"
Basic.Settings.Output.Mode.Adv="Rozšírené"
Basic.Settings.Output.Mode.FFmpeg="Výstup FFmpeg"
+Basic.Settings.Output.ReplayBuffer.Estimate="Odhadované využitie pamäte: %1 MB"
Basic.Settings.Output.ReplayBuffer.Suffix="Prípona"
+Basic.Settings.Output.Simple.SavePath="Nahrávacia cesta"
Basic.Settings.Output.Simple.RecordingQuality="Kvalita nahrávania"
Basic.Settings.Output.Simple.RecordingQuality.Stream="Rovnaká ako pre stream"
Basic.Settings.Output.Simple.RecordingQuality.Small="Vysoká kvalita, stredná veľkosť súboru"
Basic.Settings.Output.Simple.RecordingQuality.Lossless="Bezstratová kvalita, ohromne veľké súbory"
-Basic.Settings.Output.Simple.Encoder.Software="Softvér (x264)"
-Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Hardvér (QSV)"
-Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Hardvér (AMD)"
+Basic.Settings.Output.Simple.Warn.VideoBitrate="Upozornenie: Dátový tok vysielaného obrazu bude nastavený na %1, čo je horná hranica pre súčasnú vysielaciu službu. Ak ste si istý, že chcete vysielať nad %1, v rozšírených nastaveniach enkodéra zakážte \"Vynútiť limit dátového toku vysielacou službou\"."
+Basic.Settings.Output.Simple.Warn.AudioBitrate="Upozornenie: Dátový tok vysielaného zvuku bude nastavený na %1, čo je horná hranica pre súčasnú vysielaciu službu. Ak ste si istý, že chcete vysielať nad %1, v rozšírených nastaveniach enkodéra zakážte \"Vynútiť limit dátového toku vysielacou službou\"."
+Basic.Settings.Output.Simple.Warn.Encoder="Upozornenie: Nahrávanie softvérovým enkodérom s rozdielnou kvalitou než vysielanie spôsobí zvýšenú záťaž CPU pri nahrávaní a vysielaní zároveň."
+Basic.Settings.Output.Simple.Warn.MultipleQSV="Upozornenie: Nemôžete použiť viacero QSV kodérov pri vysielaní a nahrávaní zároveň. Ak chcete vysielať a nahrávať zároveň, zmeňte, prosím, kodér vysielania alebo kodér nahrávania."
+Basic.Settings.Output.Simple.Encoder.Software="Softvérový (x264)"
+Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Hardvérový (QSV)"
+Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Hardvérový (AMD)"
Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Hardvér (NVENC)"
-Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Softvér (x264 prednastavené nízke zaťaženie CPU, zvyšuje veľkosť súboru)"
+Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Softvérový (x264, nízke zaťaženie CPU, zvyšuje veľkosť súboru)"
Basic.Settings.Output.VideoBitrate="Bitrate videa"
Basic.Settings.Output.AudioBitrate="Bitrate zvuku"
Basic.Settings.Output.Reconnect="Automaticky znovupripájať"
Basic.Settings.Output.RetryDelay="Čas medzi pokusmi (sekundy)"
Basic.Settings.Output.MaxRetries="Maximálny počet pokusov"
Basic.Settings.Output.Advanced="Povoliť pokročilé nastavenia enkodéra"
+Basic.Settings.Output.EncoderPreset="Predvoľba enkodéra (vyššie = menej CPU)"
+Basic.Settings.Output.CustomEncoderSettings="Vlastné nastavenie enkodéra"
+Basic.Settings.Output.Adv.Rescale="Škálovať výstup"
+Basic.Settings.Output.Adv.AudioTrack="Zvuková stopa"
+Basic.Settings.Output.Adv.Streaming="Vysielanie"
+Basic.Settings.Output.Adv.ApplyServiceSettings="Vynútiť nastavenia kodéra vysielacou službou"
Basic.Settings.Output.Adv.Audio.Track1="Stopa 1"
Basic.Settings.Output.Adv.Audio.Track2="Stopa 2"
Basic.Settings.Output.Adv.Audio.Track3="Stopa 3"
Basic.Settings.Output.Adv.Audio.Track4="Stopa 4"
+Basic.Settings.Output.Adv.Audio.Track5="Stopa 5"
+Basic.Settings.Output.Adv.Audio.Track6="Stopa 6"
Basic.Settings.Output.Adv.Recording="Nahrávanie"
Basic.Settings.Output.Adv.Recording.Type="Typ"
Basic.Settings.Output.Adv.Recording.Type.Standard="Štandardný"
Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Vlastný výstup (FFmpeg)"
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Použiť kóder vysielania)"
+Basic.Settings.Output.Adv.Recording.Filename="Formát názvu súboru"
Basic.Settings.Output.Adv.Recording.OverwriteIfExists="Prepísať, ak súbor existuje"
Basic.Settings.Output.Adv.FFmpeg.Type="Typ výstupu FFmpeg"
Basic.Settings.Output.Adv.FFmpeg.Type.URL="Výstup na URL"
@@ -455,18 +574,30 @@ Basic.Settings.Output.Adv.FFmpeg.Type.RecordToFile="Výstup do súboru"
Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Bežné formáty nahrávania"
Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Všetky súbory"
Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Cesta k súboru alebo URL"
+Basic.Settings.Output.Adv.FFmpeg.Format="Formát kontajneru"
Basic.Settings.Output.Adv.FFmpeg.FormatAudio="Zvuk"
Basic.Settings.Output.Adv.FFmpeg.FormatVideo="Video"
Basic.Settings.Output.Adv.FFmpeg.FormatDefault="Predvolený formát"
+Basic.Settings.Output.Adv.FFmpeg.FormatDesc="Popis formátu"
+Basic.Settings.Output.Adv.FFmpeg.FormatDescDef="Kodér zvuku/obrazu uhádnutý z cesty súboru alebo URL adresy"
Basic.Settings.Output.Adv.FFmpeg.AVEncoderDefault="Predvolený enkodér"
Basic.Settings.Output.Adv.FFmpeg.AVEncoderDisable="Vypnúť enkodér"
-Basic.Settings.Output.Adv.FFmpeg.VEncoder="Video Enkodér"
-Basic.Settings.Output.Adv.FFmpeg.AEncoder="Audio Enkodér"
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Kodér obrazu"
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Nastavenie kodéra obrazu (ak existuje)"
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Kodér zvuku"
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Nastavenie kodéra zvuku (ak existuje)"
+Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Nastavenie zmiešavača (ak existuje)"
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="Interval kľúčových snímkov (snímky)"
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Zobraziť všetky kodeky (aj potenciálne nekompatibilné)"
+FilenameFormatting.TT="%CCYY Rok, 4 číslice\n%YY Rok, posledné dve cifry (00-99)\n%MM Mesiac, číslo (01-12)\n%DD Deň v mesiaci, s úvodnou nulou (01-31)\n%hh Hodina vo 24-hod. formáte (00-23)\n%mm Minúta (00-59)\n%ss Sekunda (00-61)\n%% Znak %\n%a Skrátený názov dňa v týždni\n%A Celý názov dňa v týždni\n%b Skrátený názov mesiaca\n%B Celý názov mesiaca\n%d Deň v mesiaci, s úvodnou nulou (01-31)\n%H Hodina v 24-hod. formáte (00-23)\n%I Hodina v 12-hod. formáte (01-12)\n%m Mesiac ako desiatkové číslo (01-12)\n%M Minúta (00-59)\n%p Časť dňa (AM/PM)\n%S Sekunda (00-61)\n%y Rok, posledné dve cifry (00-99)\n%Y Rok\n%z ISO 8601 časový posun od UTC\n%Z Názov alebo skratka časového pásma\n"
Basic.Settings.Video="Video"
Basic.Settings.Video.Adapter="Video adaptér"
+Basic.Settings.Video.BaseResolution="Základné rozlíšenie (plátno)"
+Basic.Settings.Video.ScaledResolution="Výstupné (škálované) rozlíšenie"
+Basic.Settings.Video.DownscaleFilter="Zmenšovací filter"
Basic.Settings.Video.DisableAeroWindows="Vypnúť Aero (len Windows)"
Basic.Settings.Video.FPS="FPS"
Basic.Settings.Video.FPSCommon="Bežné hodnoty FPS"
@@ -478,31 +609,60 @@ Basic.Settings.Video.InvalidResolution="Neplatné rozlíšenie. Správne je [š
Basic.Settings.Video.CurrentlyActive="Výstup videa je práve aktívny. Prosím, vypnite všetky výstupy na zmenu nastavení videa."
Basic.Settings.Video.DisableAero="Vypnúť Aero"
+Basic.Settings.Video.DownscaleFilter.Bilinear="Bilineárne (Najrýchlejšie, ale rozmazané pri škálovaní)"
+Basic.Settings.Video.DownscaleFilter.Bicubic="Bikubické (ostrejšie pri škálovaní, 16 vzoriek)"
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczosov (ostrejšie pri škálovaní, 32 vzoriek)"
Basic.Settings.Audio="Zvuk"
Basic.Settings.Audio.SampleRate="Vzorkovacia frekvencia"
Basic.Settings.Audio.Channels="Kanály"
-
+Basic.Settings.Audio.MeterDecayRate.Fast="Rýchlo"
+Basic.Settings.Audio.MeterDecayRate.Medium="Stredne (typ I PPM)"
+Basic.Settings.Audio.MeterDecayRate.Slow="Pomaly (typ II PPM)"
+Basic.Settings.Audio.PeakMeterType="Typ merača špičiek"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Špička vzorky"
+Basic.Settings.Audio.MultichannelWarning.Title="Povoliť priestorový zvuk?"
+Basic.Settings.Audio.MultichannelWarning.Confirm="Naozaj si želáte povoliť priestorový zvuk?"
+Basic.Settings.Audio.EnablePushToMute="Povoliť push-to-mute"
+Basic.Settings.Audio.PushToMuteDelay="Oneskorenie push-to-mute"
+Basic.Settings.Audio.EnablePushToTalk="Povoliť push-to-talk"
+Basic.Settings.Audio.PushToTalkDelay="Oneskorenie push-to-talk"
+Basic.Settings.Audio.UnknownAudioDevice="[Zariadenie nie je pripojené alebo dostupné]"
+
+Basic.Settings.Advanced="Pokročilé"
+Basic.Settings.Advanced.General.ProcessPriority="Priorita procesu"
Basic.Settings.Advanced.General.ProcessPriority.High="Vysoká"
Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="Zvýšená"
Basic.Settings.Advanced.General.ProcessPriority.Normal="Normálna"
Basic.Settings.Advanced.General.ProcessPriority.BelowNormal="Znížená"
Basic.Settings.Advanced.General.ProcessPriority.Idle="Nízka"
+Basic.Settings.Advanced.FormatWarning="Upozornenie: Formáty farieb iné ako NV12 sú primárne určené na nahrávanie a nie sú odporúčane pre vysielanie. Použitie iných formátov môže spôsobiť zvýšené využitie CPU pri vysielaní kvôli prevodu medzi formátmi."
+Basic.Settings.Advanced.Audio.BufferingTime="Čas medzipamäte zvuku"
+Basic.Settings.Advanced.Video.ColorFormat="Formát farieb"
Basic.Settings.Advanced.Video.ColorSpace="Farebný priestor YUV"
Basic.Settings.Advanced.Video.ColorRange="Rozsah farieb YUV"
Basic.Settings.Advanced.Video.ColorRange.Partial="Čiastočný"
Basic.Settings.Advanced.Video.ColorRange.Full="Úplný"
Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Predvolené"
+Basic.Settings.Advanced.StreamDelay="Oneskorenie vysielania"
+Basic.Settings.Advanced.StreamDelay.Duration="Trvanie (sekundy)"
+Basic.Settings.Advanced.StreamDelay.MemoryUsage="Odhadované využitie pamäte: %1 MB"
+Basic.Settings.Advanced.Network="Sieť"
Basic.Settings.Advanced.Network.BindToIP="Zviazať s IP adresou"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Použiť nový sieťový kód"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Režim nízkej odozvy"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Zakázať klávesové skratky, keď je hlavné okno aktívne"
+Basic.AdvAudio="Pokročilé nastavenia zvuku"
Basic.AdvAudio.Name="Názov"
Basic.AdvAudio.Volume="Hlasitosť (%)"
Basic.AdvAudio.Mono="Previesť na Mono"
+Basic.AdvAudio.AudioTracks="Stopy"
Basic.Settings.Hotkeys="Klávesové skratky"
+Basic.Settings.Hotkeys.Pair="Klávesové skratky pre \"%1\" slúžia ako prepínače"
+Basic.Hotkeys.SelectScene="Prepnúť na scénu"
Basic.SystemTray.Show="Ukázať"
Basic.SystemTray.Hide="Skryť"
@@ -531,9 +691,28 @@ Hotkeys.Super="Super"
Hotkeys.Menu="Menu"
Hotkeys.Space="Medzerník"
Hotkeys.NumpadNum="Numerická klávesa %1"
+Hotkeys.AppleKeypadNum="%1 (num. klávesnica)"
+Hotkeys.AppleKeypadMultiply="* (num. klávesnica)"
+Hotkeys.AppleKeypadDivide="/ (num. klávesnica)"
+Hotkeys.AppleKeypadAdd="+ (num. klávesnica)"
+Hotkeys.AppleKeypadSubtract="- (num. klávesnica)"
+Hotkeys.AppleKeypadDecimal=". (num. klávesnica)"
+Hotkeys.AppleKeypadEqual="= (num. klávesnica)"
+Hotkeys.MouseButton="Tlačidlo myši %1"
+Mute="Stlmiť"
+Unmute="Zrušiť stlmenie"
FinalScene.Title="Odstrániť scénu"
+FinalScene.Text="Musí existovať aspoň jedna scéna."
+
+NoSources.Title="Žiadne zdroje"
+NoSources.Text="Nepridali ste žiadne zdroje obrazu, takže výstup bude prázdny. Naozaj chcete pokračovať?"
+NoSources.Text.AddSource="Zdroje môžete kedykoľvek pridať kliknutím na ikonu + v zozname zdrojov v hlavnom okne."
+
+ChangeBG="Nastaviť farbu"
+CustomColor="Vlastná farba"
+
diff --git a/UI/data/locale/sl-SI.ini b/UI/data/locale/sl-SI.ini
index ea3a3bdd9..d749b2c02 100644
--- a/UI/data/locale/sl-SI.ini
+++ b/UI/data/locale/sl-SI.ini
@@ -329,3 +329,6 @@ Basic.Settings.Advanced.Video.ColorRange.Full="Celotno"
+
+
+
diff --git a/UI/data/locale/sq-AL.ini b/UI/data/locale/sq-AL.ini
new file mode 100644
index 000000000..7a888404e
--- /dev/null
+++ b/UI/data/locale/sq-AL.ini
@@ -0,0 +1,173 @@
+
+Language="Gjuha Angleze"
+Region="Shtetet e Bashkuara"
+
+OK="OK"
+Apply="Aplikoni"
+Cancel="Anuloni"
+Close="Mbylle"
+Save="Ruaj"
+Discard="Mos e ruaj"
+Disable="Çaktivizo"
+Yes="Po"
+No="Jo"
+Add="Shto"
+Remove="Largoje"
+Rename="Riemërto"
+Interact="Bashkëveprim"
+Filters="Filterar"
+Properties="Vetitë"
+MoveUp="Lëvize lart"
+MoveDown="Lëvize poshtë"
+Settings="Cilësimet"
+Display="Ekrani"
+Name="Emri"
+Exit="Dil"
+Mixer="Mikser"
+Browse="Shfleto"
+Mono="Mono"
+Stereo="Stereo"
+DroppedFrames="Kornizat e rëna %1 (%2%)"
+StudioProgramProjector="Projektor me ekran të plotë (Program)"
+PreviewProjector="Projektorë me ekran të plotë (Parashikim)"
+SceneProjector="Ekran me ekran të plotë (Skena)"
+SourceProjector="Projektorë me ekran të plotë (Burimi)"
+StudioProgramWindow="Projektor Windowed (Program)"
+PreviewWindow="Projektor Windowed (Parashikim)"
+SceneWindow="Projektor Windowed (Skena)"
+SourceWindow="Projektor Windowed (Burimi)"
+MultiviewProjector="Shumë pamje (Ekran i plotë)"
+MultiviewWindowed="Shumë pamje (Windowed)"
+Clear="Pastro"
+Revert="Rikthe"
+Show="Shfaq"
+Hide="Fsheh"
+UnhideAll="Zbuloni të gjitha"
+Untitled="I patitulluar"
+New="I ri"
+Duplicate="Dublikatë"
+Enable="Aktivizo"
+DisableOSXVSync="Çaktivizo OSX V-Sync"
+ResetOSXVSyncOnExit="Rivendos OSX V-Sync në Mbyllje"
+HighResourceUsage="Kodimi i mbingarkuar! Merrni parasysh uljen e cilësimeve të videos ose duke përdorur një parazgjedhje më të shpejtë të kodimit."
+Transition="Tranzicion"
+QuickTransitions="Tranzicione të shpejta"
+Left="Majtas"
+Right="Djathtas"
+Top="Kreu"
+Bottom="Fundi"
+Reset="Rivë"
+Hours="Orë"
+Minutes="Minuta"
+Seconds="Sekonda"
+Deprecated="I pazëvëndësueshëm"
+ReplayBuffer="Rifillimi Lustrues"
+Import="Importo"
+Export="Eksporto"
+Copy="Kopjo"
+Paste="Ngjit"
+PasteReference="Ngjit (Referim)"
+PasteDuplicate="Ngjit (Duplikatë)"
+RemuxRecordings="Regjistrimet e Remux"
+Next="Tjeter"
+Back="Prapa"
+Defaults="Parazgjedhura"
+HideMixer="Fshiheni në Mixer"
+TransitionOverride="Zhvendosja e tranzicionit"
+None="Asnje"
+StudioMode.Preview="Inspektim"
+StudioMode.Program="Program"
+ShowInMultiview="Shfaqe në Shumë Pamje"
+
+AlreadyRunning.Title="OBS tashmë po funksion"
+AlreadyRunning.Text="OBS tashmë po kandidon! Nëse nuk keni ndërmend ta bëni këtë, mbyllni çdo rast ekzistues të OBS para se të provoni të shkoni në një instancë të re. Nëse keni OBS vendosur për të minimizuar në tabaka e sistemit, ju lutemi kontrolloni për të parë nëse vazhdon të ekzekutohet atje."
+AlreadyRunning.LaunchAnyway="Filloje ne nje menyre"
+
+Copy.Filters="Kopjo Filterat"
+Paste.Filters="Ngjit Filterat"
+
+BandwidthTest.Region="Regjioni"
+BandwidthTest.Region.US="Shtetet e Bashkuara"
+BandwidthTest.Region.EU="Evropë"
+BandwidthTest.Region.Asia="Azi"
+BandwidthTest.Region.Other="Të tjera"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UI/data/locale/sr-CS.ini b/UI/data/locale/sr-CS.ini
index d7fecd47e..44ea89e66 100644
--- a/UI/data/locale/sr-CS.ini
+++ b/UI/data/locale/sr-CS.ini
@@ -562,3 +562,6 @@ OutputWarnings.NoTracksSelected="Morate odabrati makar jednu traku"
OutputWarnings.MultiTrackRecording="Upozorenje: Određeni formati (kao što je FLV) ne podržavaju više traka po snimku"
+
+
+
diff --git a/UI/data/locale/sr-SP.ini b/UI/data/locale/sr-SP.ini
index 45c724202..49b2f82c1 100644
--- a/UI/data/locale/sr-SP.ini
+++ b/UI/data/locale/sr-SP.ini
@@ -562,3 +562,6 @@ OutputWarnings.NoTracksSelected="Морате одабрати макар јед
OutputWarnings.MultiTrackRecording="Упозорење: Одређени формати (као што је FLV) не подржавају више трака по снимку"
+
+
+
diff --git a/UI/data/locale/sv-SE.ini b/UI/data/locale/sv-SE.ini
index bd704aaf5..b1b065be4 100644
--- a/UI/data/locale/sv-SE.ini
+++ b/UI/data/locale/sv-SE.ini
@@ -36,8 +36,8 @@ StudioProgramWindow="Fönsterprojektor (program)"
PreviewWindow="Fönsterprojektor (förhandsvisning)"
SceneWindow="Fönsterprojektor (scen)"
SourceWindow="Fönsterprojektor (källa)"
-MultiviewProjector="Flervy (helskärm)"
-MultiviewWindowed="Flervy (fönster)"
+MultiviewProjector="Multivy (helskärm)"
+MultiviewWindowed="Multivy (fönster)"
Clear="Rensa"
Revert="Återgå"
Show="Visa"
@@ -77,7 +77,9 @@ TransitionOverride="Övergångsåsidosättande"
None="Ingen"
StudioMode.Preview="Förhandsvisning"
StudioMode.Program="Program"
-ShowInMultiview="Visa i flervy"
+ShowInMultiview="Visa i multivy"
+VerticalLayout="Vertikal layout"
+Group="Grupp"
AlreadyRunning.Title="OBS körs redan"
AlreadyRunning.Text="OBS körs redan! Såvida du gjorde detta med flit, stäng ned alla befintliga instanser av OBS innan du försöker köra en ny instans. Om du har minimerat OBS till systemfältet, kontroller om det fortfarande körs där."
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="Stoppar reprisbuffert..."
Basic.Main.StopStreaming="Sluta strömma"
Basic.Main.StoppingStreaming="Stoppar ström..."
Basic.Main.ForceStopStreaming="Sluta strömma (ignorera fördröjning)"
+Basic.Main.Group="Grupp %1"
+Basic.Main.GroupItems="Gruppmarkerade föremål"
+Basic.Main.Ungroup="Avgruppera"
Basic.MainMenu.File="&Arkiv"
Basic.MainMenu.File.Export="&Exportera"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="&Verktyg"
Basic.MainMenu.Help="&Hjälp"
Basic.MainMenu.Help.HelpPortal="Hjälp&portal"
Basic.MainMenu.Help.Website="Besök &webbplats"
+Basic.MainMenu.Help.Discord="Anslut till &Discord-servern"
Basic.MainMenu.Help.Logs="&Loggfiler"
Basic.MainMenu.Help.Logs.ShowLogs="&Visa loggfiler"
Basic.MainMenu.Help.Logs.UploadCurrentLog="Ladda upp &aktuell loggfil"
Basic.MainMenu.Help.Logs.UploadLastLog="Ladda upp &senaste loggfil"
Basic.MainMenu.Help.Logs.ViewCurrentLog="&Visa Aktuell Logg"
Basic.MainMenu.Help.CheckForUpdates="Sök efter uppdateringar"
+Basic.MainMenu.Help.CrashLogs="Krasch&rapporter"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="&Visa kraschrapporter"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="Ladda upp &senaste kraschrapport"
Basic.Settings.ProgramRestart="Du måste starta om programmet för att ändringarna ska träda i kraft."
Basic.Settings.ConfirmTitle="Bekräfta ändringar"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Minimera alltid till meddelandef
Basic.Settings.General.SaveProjectors="Spara projektorer vid avslut"
Basic.Settings.General.SwitchOnDoubleClick="Övergång till scen vid dubbelklick"
Basic.Settings.General.StudioPortraitLayout="Aktivera porträtt-/vertikalt utseende"
-Basic.Settings.General.MultiviewLayout="Multivisningslayout"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horisontal, överkant"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horisontal, nederkant"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertikal, vänster"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertikal, höger"
+Basic.Settings.General.Multiview="Multivy"
+Basic.Settings.General.Multiview.MouseSwitch="Klicka för att byta mellan scener"
+Basic.Settings.General.Multiview.DrawSourceNames="Visa scennamn"
+Basic.Settings.General.Multiview.DrawSafeAreas="Rita ut säkra områden (EBU R 95)"
+Basic.Settings.General.MultiviewLayout="Utseende för multivy"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horisontal, överkant (8 scener)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horisontal, nederkant (8 scener)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertikal, vänsterkant (8 scener)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertikal, högerkant (8 scener)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Horisontal, överkant (24 scener)"
Basic.Settings.Stream="Ström"
Basic.Settings.Stream.StreamType="Strömtyp"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="Ljudmätarens förfallfrekvens"
Basic.Settings.Audio.MeterDecayRate.Fast="Snabb"
Basic.Settings.Audio.MeterDecayRate.Medium="Medium (Type I PPM)"
Basic.Settings.Audio.MeterDecayRate.Slow="Långsam (Type II PPM)"
+Basic.Settings.Audio.PeakMeterType="Typ av maxpunktsmätare"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Samplingsmaxpunkt"
+Basic.Settings.Audio.PeakMeterType.TruePeak="Sann maxpunkt (högre CPU-användning)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="VARNING: Surroundljud är aktiverat."
Basic.Settings.Audio.MultichannelWarning="Om du strömmar, se till att kolla om din strömtjänst stöder både inmatning och uppspelning av surroundljud. Twitch, Facebook 360 Live, Mixer RTMP, Smashcast är några exempel på tjänster som har fullt stöd. Fastän Facebook Live och YouTube Live stöder inmatning för surroundljud mixar Facebook Live ned till stereo och YouTube Live spelar upp i bara två kanaler.\n\nLjudfiltren i OBS är kompatibla med surroundljud, fast stöd för VST-insticksmodulen garanteras inte."
Basic.Settings.Audio.MultichannelWarning.Title="Aktivera surroundljud?"
@@ -661,7 +678,7 @@ Basic.Settings.Advanced.FormatWarning="Varning: Andra färgformat än NV12 är a
Basic.Settings.Advanced.Audio.BufferingTime="Ljudbuffringstid"
Basic.Settings.Advanced.Video.ColorFormat="Färgformat"
Basic.Settings.Advanced.Video.ColorSpace="YUV-färgrymd"
-Basic.Settings.Advanced.Video.ColorRange="YUV färgområde"
+Basic.Settings.Advanced.Video.ColorRange="YUV-färgområde"
Basic.Settings.Advanced.Video.ColorRange.Partial="Partiell"
Basic.Settings.Advanced.Video.ColorRange.Full="Full"
Basic.Settings.Advanced.Audio.MonitoringDevice="Ljuduppspelningsenhet"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="Nätverk"
Basic.Settings.Advanced.Network.BindToIP="Bind till IP"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Aktivera ny nätverkskod"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Låg latens-läge"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Inaktivera kortkommandon när fokus ligger i huvudfönstret"
Basic.AdvAudio="Avancerade ljudinställningar"
Basic.AdvAudio.Name="Namn"
@@ -749,3 +767,12 @@ OutputWarnings.MP4Recording="Varning: Inspelningar som sparas som MP4 kommer int
FinalScene.Title="Radera scen"
FinalScene.Text="Det måste finnas minst en scen."
+NoSources.Title="Inga källor"
+NoSources.Text="Det verkar som om du inte har lagt till några videokällor än, så du kommer endast att visa en tom skärm. Är du säker på att du vill göra detta?"
+NoSources.Text.AddSource="Du kan lägga till källor genom att klicka på plusikonen under rutan \"källor\" i huvudfönstret när som helst."
+
+ChangeBG="Ändra färg"
+CustomColor="Anpassad färg"
+
+BrowserSource.EnableHardwareAcceleration="Aktiverar webbläsarkällans hårdvaruaccelerering"
+
diff --git a/UI/data/locale/ta-IN.ini b/UI/data/locale/ta-IN.ini
index a93f85a67..b41973821 100644
--- a/UI/data/locale/ta-IN.ini
+++ b/UI/data/locale/ta-IN.ini
@@ -100,6 +100,9 @@ New="புதிய"
+
+
+
diff --git a/UI/data/locale/th-TH.ini b/UI/data/locale/th-TH.ini
index cbbb8e657..7ab922ad6 100644
--- a/UI/data/locale/th-TH.ini
+++ b/UI/data/locale/th-TH.ini
@@ -148,3 +148,6 @@ Basic.Settings.Audio="เสียง"
+
+
+
diff --git a/UI/data/locale/tl-PH.ini b/UI/data/locale/tl-PH.ini
new file mode 100644
index 000000000..c4d56281d
--- /dev/null
+++ b/UI/data/locale/tl-PH.ini
@@ -0,0 +1,750 @@
+
+Language="Ingles"
+Region="Estados Unidos"
+
+OK="OK"
+Apply="Gamitin"
+Cancel="Kanselahin"
+Close="Isara"
+Save="I-save"
+Discard="Alisin"
+Disable="I-disable"
+Yes="Oo"
+No="Hindi"
+Add="Idagdag"
+Remove="Tanggalin"
+Rename="Palitan ang pangalan"
+Interact="Interact"
+Filters="Pansala"
+Properties="Mga Katangian"
+MoveUp="I-taas"
+MoveDown="I-baba"
+Settings="Mga Setting"
+Display="Ipakita"
+Name="Pangalan"
+Exit="Lumabas"
+Mixer="Mixer"
+Browse="Browse"
+Mono="Mono"
+Stereo="Stereo"
+DroppedFrames="Mga imaheng hindi sinali %1 (%2%)"
+StudioProgramProjector="Fullscreen Projector (Programa)"
+PreviewProjector="Fullscreen Projector (Preview)"
+SceneProjector="Fullscreen Projector (Eksena)"
+SourceProjector="Fullscreen Projector (Pinagmulan)"
+StudioProgramWindow="Windowed Projector (Programa)"
+PreviewWindow="Windowed Projector (Preview)"
+SceneWindow="Windowed Projector (Eksena)"
+SourceWindow="Windowed Projector (Pinagmulan)"
+MultiviewProjector="Multiview (Fullscreen)"
+MultiviewWindowed="Multiview (Windowed)"
+Clear="Linisin"
+Revert="Ibalik"
+Show="Ipakita"
+Hide="Itago"
+UnhideAll="Ipakita Lahat"
+Untitled="Walang pamagat"
+New="Bago"
+Duplicate="Kahalintulad"
+Enable="I-enable"
+DisableOSXVSync="I-disable ang OSX V-Sync"
+ResetOSXVSyncOnExit="I-set muli ang OSX V-Sync sa Exit"
+HighResourceUsage="Labis na ang karga sa pag-eencode! Pagisipan ang pagpapababa ng mga video setting o ang pag-gamit ng mas mabilis na encoding preset."
+Transition="Transisyon"
+QuickTransitions="Mabilis na mga Transisyon"
+Left="Kaliwa"
+Right="Kanan"
+Top="Tuktok"
+Bottom="Pinakababa"
+Reset="I-set muli"
+Hours="Mga oras"
+Minutes="Mga minuto"
+Seconds="Mga segundo"
+Deprecated="Hindi na ginagamit"
+ReplayBuffer="Replay Buffer"
+Import="I-angkat"
+Export="I-export"
+Copy="Kopyahin"
+Paste="I-paste"
+PasteReference="I-paste (Reperensya)"
+PasteDuplicate="I-paste (Kopya)"
+RemuxRecordings="Remux Recordings"
+Next="Sunod"
+Back="Bumalik"
+Defaults="Mga Default"
+HideMixer="Itago sa Mixer"
+TransitionOverride="Pagpapawalang-bisa ng Transisyon"
+None="Wala"
+StudioMode.Preview="Preview"
+StudioMode.Program="Programa"
+ShowInMultiview="Ipakita sa Multiview"
+
+AlreadyRunning.Title="Ang OBS ay tumatakbo na"
+AlreadyRunning.Text="Ang OBS ay tumatakbo na! Kung hindi mo ito sinasadya, mangyari lamang patayin ang mga umiiral na OBS bago subukang magpatakbo ng bago. Kung ikaw ay may OBS set na kailangan i-minimize sa system tray, mangyari lamang tingnan kung ito ay tumatakbo pa doon."
+AlreadyRunning.LaunchAnyway="Ilunsad pa rin"
+
+Copy.Filters="Kopyahin ang mga Panala"
+Paste.Filters="I-paste ang mga Panala"
+
+BandwidthTest.Region="Rehiyon"
+BandwidthTest.Region.US="Estados Unidos"
+BandwidthTest.Region.EU="Europa"
+BandwidthTest.Region.Asia="Asya"
+BandwidthTest.Region.Other="Iba pa"
+
+Basic.FirstStartup.RunWizard="Nais mo bang patakbuhin ang auto-configuration wizard? Maaari mo ring i-configure ang iyong mga setting ng mano-mano sa pamamagitan ng pagpindot ng Settings na button sa pangunahing window."
+Basic.FirstStartup.RunWizard.BetaWarning="(Tandaan: Ang auto-configuration wizard ay kasukuyang nasa beta)"
+Basic.FirstStartup.RunWizard.NoClicked="Kung magbabago ang iyong isip, maaari mong patakbuhin ang auto-configuration wizard sa anumang oras mula muli sa Tools na menu."
+
+Basic.AutoConfig="Auto-Configuration Wizard"
+Basic.AutoConfig.Beta="Auto-Configuration Wizard (Beta)"
+Basic.AutoConfig.ApplySettings="Gamitin ang mga Setting"
+Basic.AutoConfig.StartPage="Impormasyon ukol sa Paggamit"
+Basic.AutoConfig.StartPage.SubTitle="Tukuyin kung para saan mo gustong gamitin ang programa"
+Basic.AutoConfig.StartPage.PrioritizeStreaming="I-optimize para sa pag-stream, pangalawa lamang pag-rerekord"
+Basic.AutoConfig.StartPage.PrioritizeRecording="I-optimize para lamang sa pag-rerekord, Hindi ako mag-iistream"
+Basic.AutoConfig.VideoPage="Mga Setting sa Video"
+Basic.AutoConfig.VideoPage.SubTitle="Tukuyin ang mga setting ng video na gusto mong gamitin"
+Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="Gamitin ang Pangkasalukuyang (%1x%2)"
+Basic.AutoConfig.VideoPage.BaseResolution.Display="Ipakita ang %1 (%2x%3)"
+Basic.AutoConfig.VideoPage.FPS.UseCurrent="Gamitin ang Pangkasalukuyang (%1)"
+Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="60 o 30, pero mas piliin ang 60 kung maaari"
+Basic.AutoConfig.VideoPage.FPS.PreferHighRes="60 o 30, pero mas piliin ang mataas na resolution"
+Basic.AutoConfig.VideoPage.CanvasExplanation="Tandaan: Ang kanbas (base) na resolution ay hindi kinakailangang katulad sa resolution na gagamitin mo sa pag-stream o pagrekord. Ang actual na resolution ng iyong stream/rekord ay maaaring pababain upang mabawasan ang gamit sa mga resource o mga kakailanganing bitrate."
+Basic.AutoConfig.StreamPage="Mag-stream ng Impormasyon"
+Basic.AutoConfig.StreamPage.SubTitle="Mangyari lamang ilagay ang impormasyon ng iyong pagstream"
+Basic.AutoConfig.StreamPage.Service="Serbisyo"
+Basic.AutoConfig.StreamPage.Service.ShowAll="Ipakita Lahat..."
+Basic.AutoConfig.StreamPage.Server="Serber"
+Basic.AutoConfig.StreamPage.StreamKey="Stream Key"
+Basic.AutoConfig.StreamPage.StreamKey.LinkToSite="(Link)"
+Basic.AutoConfig.StreamPage.PerformBandwidthTest="Estimahin ang bitrate gamit ang bandwith test (maaaring tumagal ng ilang minuto)"
+Basic.AutoConfig.StreamPage.PreferHardwareEncoding="Mas piliin ang hardware encoding"
+Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="Ang Hardware Encoding ay nagtatanggal ng karamihan sa paggamit ng CPU, ngunit maaaring nangangailangan ito ng mas maraming bitrate upang magkaroon ng katulad na lebel ng kalidad."
+Basic.AutoConfig.StreamPage.StreamWarning.Title="Babala sa stream"
+Basic.AutoConfig.StreamPage.StreamWarning.Text="Ang bandwith test ay mag-iistream ng datos ng video nang walang audio sa iyong channel. Kung kaya mo, minumungkahi namin na pansamantala mong i-off ang pag-save ng mga video ng mga stream at gawing pribado ang stream hanggang sa matapos ang test. Magpatuloy?"
+Basic.AutoConfig.TestPage="Mga Huling Resulta"
+Basic.AutoConfig.TestPage.SubTitle.Testing="Ang programang ito ay nagapapatupad ngayon ng mga pagsusuri upang matantiya ang pinakamainam na mga setting"
+Basic.AutoConfig.TestPage.SubTitle.Complete="Natapos na ang pagsusuri"
+Basic.AutoConfig.TestPage.TestingBandwidth="Nagsasagaw ng bandwidth test, maaaring itong magtagal ng ilang minuto..."
+Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="Kumukonekta sa: %1..."
+Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="Bigong maka-konekta sa kahit anong mga serber, mangyari lamang suriin ang iyong koneksyon sa internet at subukan muli."
+Basic.AutoConfig.TestPage.TestingBandwidth.Server="Sinusuri ang bandwidth para sa: %1"
+Basic.AutoConfig.TestPage.TestingStreamEncoder="Sinusuri ang encoder ng stream, maaari itong magtagal ng isang minuto..."
+Basic.AutoConfig.TestPage.TestingRecordingEncoder="Sinusuri ang encoder para sa pagrekord, maaari itong magtagal ng isang minuto..."
+Basic.AutoConfig.TestPage.TestingRes="Sinusuri ang mga resolusyon, maaari itong magtagal ng ilang minuto..."
+Basic.AutoConfig.TestPage.TestingRes.Fail="Bigong mapatakbo ang encoder"
+Basic.AutoConfig.TestPage.TestingRes.Resolution="Sinusuri ang %1x%2 %3 FPS..."
+Basic.AutoConfig.TestPage.Result.StreamingEncoder="Encoder para sa Pag-stream"
+Basic.AutoConfig.TestPage.Result.RecordingEncoder="Encoder para sa Pagrekord"
+Basic.AutoConfig.TestPage.Result.Header="Napagtanto ng programa na ang mga setting na ito ang pinakamainam para sa iyo:"
+Basic.AutoConfig.TestPage.Result.Footer="Upang magamit ang mga setting, pindutin ang Apply Settings. Upang ma-configure muli ang wizard at subukang muli, pindutin ang Back. Upang ma-configure mo mismo nang mano-mano ang mga setting, pindutin ang Cancel at buksan ang mga Setting."
+
+Basic.Stats="Mga Statistika"
+Basic.Stats.CPUUsage="Paggamit ng CPU"
+Basic.Stats.HDDSpaceAvailable="Puwang sa HDD na magagamit pa"
+Basic.Stats.MemoryUsage="Paggamit ng Memorya"
+Basic.Stats.AverageTimeToRender="Karaniwang bilis upang ma-render ang frame"
+Basic.Stats.SkippedFrames="Mga nalaktawang imahe dahil sa antala sa pag-encode"
+Basic.Stats.MissedFrames="Mga imaheng di nakuha dahil sa antala sa pag-render"
+Basic.Stats.Output.Stream="Stream"
+Basic.Stats.Output.Recording="Pag-rerekord"
+Basic.Stats.Status="Estado"
+Basic.Stats.Status.Recording="Pagrerekord"
+Basic.Stats.Status.Live="LIVE"
+Basic.Stats.Status.Reconnecting="Muling kumukunekta"
+Basic.Stats.Status.Inactive="Hindi aktibo"
+Basic.Stats.DroppedFrames="Mga Imaheng hindi sinali (Network)"
+Basic.Stats.MegabytesSent="Kabuuan ng Output ng mga Datos"
+Basic.Stats.Bitrate="Bitrate"
+
+Updater.Title="Mga bagong update na magagamit"
+Updater.Text="Mayroong bagong update na magagamit:"
+Updater.UpdateNow="Iupdate na Ngayon"
+Updater.RemindMeLater="Paalalahanan ako Maya-maya"
+Updater.Skip="Laktawan ang Bersyon"
+Updater.Running.Title="Ang programa ay kasalukuyang aktibo"
+Updater.Running.Text="Ang mga output ay kasalukuyang aktibo, mangyari lamang i-shut down ang anumang mga output na aktibo bago subukang mag-update"
+Updater.NoUpdatesAvailable.Title="Walang mga update na magagamit"
+Updater.NoUpdatesAvailable.Text="Walang mga update ang kasalukuyang magagamit"
+Updater.FailedToLaunch="Bigong malunsad ang updater"
+Updater.GameCaptureActive.Title="Ang Game capture ay aktibo"
+Updater.GameCaptureActive.Text="Ang hook library ng game capture ay kasalukuyang ginagamit. Mangyari lamang isara ang anumang mga laro/programang nahuli (o i-start muli ang windows) at subukan muli."
+
+QuickTransitions.SwapScenes="Pagpalitin ang Preview/Output ng mga Eksena Matapos ang Pag-transisyon"
+QuickTransitions.SwapScenesTT="Pinagpapalit ang preview at output ng mga eksena matapos ang pagtransisyon (kung ang orihinal na eksena ng output ay nariyan pa).\nHindi nito mapapawalang-bisa ang mga pagbabagong napatupad sa orihinal na eksena ng output."
+QuickTransitions.DuplicateScene="Gayahin ang Eksena"
+QuickTransitions.DuplicateSceneTT="Kapag nag-eedit ng kaparehong eksena, pinapahintulutan ang pag-edit ng transform/visibility ng mga pinanggalingan nang hindi binabago ang output.\nUpang ma-edit ang mga katangian ng mga pinagmulan nang hindi binabago ang output, paganahin ang 'Duplicate Sources'.\nAng pag-bago ng value na ito ang magseset muli ng pangkasalukuyang output na eksena (kung ito ay nariyan pa)."
+QuickTransitions.EditProperties="Gayahin ang mga Source"
+QuickTransitions.EditPropertiesTT="Kapag nag-eedit ng kaparehong eksena, pinapahintulutan ang pag-edit ng mga pinagmulan nang hindi binabago ang output.\nMaaari lamang itong gamitin kung ang 'Duplicate Scene' ay gumagana.\nMayroong mga source (tulad ng capture o mga media source) na hindi hindi ito sinusuportahan at hindi maaaring i-edit nang nakahiwalay.\nAng pagbabago ng value na ito ang magseset muli ng kasalukuyang output na eksena (kung nariyan pa ito).\n\nBabala: Dahil kokopyahin ang mga source, maaari itong mangailangan ng dagdag na system o mga video source."
+QuickTransitions.HotkeyName="Mabilis na Transisyon: %1"
+
+Basic.AddTransition="Idagdag ang Configurable na Transisyon"
+Basic.RemoveTransition="Alisin ang Configurable na Transisyon"
+Basic.TransitionProperties="Mga Katangian ng Transisyon"
+Basic.SceneTransitions="Mga Transisyon ng Eksena"
+Basic.TransitionDuration="Tagal"
+Basic.TogglePreviewProgramMode="Studio Mode"
+
+TransitionNameDlg.Text="Mangyari lamang ilagay ang pangalan ng transisyon"
+TransitionNameDlg.Title="Pangalan ng Transition"
+
+TitleBar.Profile="Profile"
+TitleBar.Scenes="Mga Eksena"
+
+NameExists.Title="Ang pangalan ay umiiral na"
+NameExists.Text="Ang pangalan na ito ay ginagamit na."
+
+NoNameEntered.Title="Mangyari lamang magbigay ng balidong pangalan"
+NoNameEntered.Text="Hindi maaaring walang pangalan."
+
+ConfirmStart.Title="Umpisahan na ang pag-stream?"
+ConfirmStart.Text="Sigurado ka bang gusto mo nang simulan ang pag-stream?"
+
+ConfirmStop.Title="Itigil ang pag-stream?"
+ConfirmStop.Text="Sigurado ka bang gusto mong itigil ang pag-stream?"
+
+ConfirmExit.Title="Lumabas sa OBS?"
+ConfirmExit.Text="Ang OBS ang kasalukuyang aktibo. Ang lahat ng pag-stream/pagrerekord ay magsasara. Sigurado ka bang gusto mong lumabas?"
+
+ConfirmRemove.Title="Kumpirmahin ang pagtanggal"
+ConfirmRemove.Text="Sigurado ka bang gusto mong tanggalin ang '$1\"?"
+ConfirmRemove.TextMultiple="Sigurado ka bang gusto mong tanggalin ang %1 na mga item?"
+
+Output.StartStreamFailed="Bigong masimulan ang pag-stream"
+Output.StartRecordingFailed="Bigong masimulan ang pag-rerekord"
+Output.StartReplayFailed="Bigong masimulan ang replay buffer"
+Output.StartFailedGeneric="Bigong masimulan ang output. Mangyari lamang tingnan ang log para sa mga detalye. \n\nTandaan: Kung ikaw ay gumagamit ng NVENC o AMD na mga encoder, siguraduhing ang iyong mga video driver ay naka-update."
+
+Output.ConnectFail.Title="Bigong kumonekta"
+Output.ConnectFail.BadPath="Hindi wasto ang Path o Connection URL. Mangyari lamang tingnan ang iyong mga setting upang makumpirma na sila ay balido."
+Output.ConnectFail.ConnectFailed="Bigong kumonekta sa serber"
+Output.ConnectFail.InvalidStream="Hindi madaanan ang tinutukoy na channel o stream key, mangyari lamang tingnan muli ang iyong stream key. Kung ito ay wasto, maaaring mayroong problema sa pagkonekta sa serber."
+Output.ConnectFail.Error="Isang di-inaasahang error ang naganap habang sinusubukang kumonekta sa serber. Karagdagang impormasyon ay nasa log file."
+Output.ConnectFail.Disconnected="Nadiskonek mula sa serber."
+
+Output.RecordFail.Title="Bigong masimulan ang pa-rerekord"
+Output.RecordFail.Unsupported="Ang output format ay maaaring hindi suportado o di kaya'y hindi nagsusuporta ng higit sa isang audio track. Mangyari lamang tingnan ang iyong mga setting at subukan muli."
+Output.RecordNoSpace.Title="Hindi sapat ang espasyo sa disk"
+Output.RecordNoSpace.Msg="Hindi sapat ang espasyo sa disk upang magpatuloy sa pag-rerekord."
+Output.RecordError.Title="Error sa Pag-rerekord"
+Output.RecordError.Msg="Isang hindi matukoy na error ang naganap habang nag-rerekord."
+Output.ReplayBuffer.NoHotkey.Title="Walang set ng hotkey!"
+Output.ReplayBuffer.NoHotkey.Msg="Walang naka-save na hotkey set para sa replay buffer. Mangyari lamang magtalaga ng \"Save\" hotkey na gagamitin para sa pag-save ng mga replay recording."
+
+Output.BadPath.Title="Maling File Path"
+Output.BadPath.Text="Ang na-configure na output path ay hindi wasto. Mangyari lamang tingnan ang iyong mga setting upang makumpirma na isang balidong file path ay nakatalaga."
+
+LogReturnDialog="Matagumpay na na-upload ang log"
+LogReturnDialog.CopyURL="Kopyahin ang URL"
+LogReturnDialog.ErrorUploadingLog="Error sa pag-uupload ng log file"
+
+LicenseAgreement="Kasunduan sa Lisensya"
+LicenseAgreement.PleaseReview="Mangyari lamang basahin ang mga termino sa lisensya bago gamitin ang OBS. Sa paggamit ng programang ito, iyong kinikilala na binasa at sumasang-ayon ka sa mga termino ng GNU General Public License v2.0. Paki-scroll down upang makita ang iba pang bahagi ng kasunduan."
+LicenseAgreement.ClickIAgreeToContinue="Kung iyong tinatanggap ang mga termino ng kasunduan, pindutin ang I Agree upang makapagpatulay. Kailangan mong sumang-ayon sa kasunduan upang magamit ang OBS."
+LicenseAgreement.IAgree="Sumasang-ayon Ako"
+LicenseAgreement.Exit="Lumabas"
+
+Remux.SourceFile="OBS Recording"
+Remux.TargetFile="Target File"
+Remux.Remux="Remux"
+Remux.OBSRecording="OBS Recording"
+Remux.FinishedTitle="Tapos na ang pag-remux"
+Remux.Finished="Na-remux na ang recording"
+Remux.FinishedError="Na-remux na ang recording, ngunit ay file ay maaaring hindi kumpleto"
+Remux.SelectRecording="Pumili ng OBS Recording …"
+Remux.SelectTarget="Pumili ng target file …"
+Remux.FileExistsTitle="Ang target file ay umiiral na"
+Remux.FileExists="Ang target file na ito ay umiiral na, gusto ma ba itong palitan?"
+Remux.ExitUnfinishedTitle="Ang pagremux ay tinutuloy pa"
+Remux.ExitUnfinished="Hindi pa tapos ang pag-remux. Kung ihihinto ito ngayon, maaaring hindi na magagamit ang target file.\nSigurado ka bang gusto mong ihinto ang pagremux?"
+
+UpdateAvailable="May Bagong Update na Magagamit"
+UpdateAvailable.Text="Ang bersyon %1.%2.%3 ay maaari nang gamiting ngayon. Pindutin ito upang ma-download"
+
+Basic.DesktopDevice1="Desktop Audio"
+Basic.DesktopDevice2="Desktop Audio 2"
+Basic.AuxDevice1="Mic/Aux"
+Basic.AuxDevice2="Mic/Aux 2"
+Basic.AuxDevice3="Mic/Aux 3"
+Basic.AuxDevice4="Mic/Aux 4"
+
+Basic.Scene="Eksena"
+Basic.DisplayCapture="Ipakita ang Kuha"
+
+Basic.Main.PreviewConextMenu.Enable="Paganahin ang Preview"
+
+ScaleFiltering="I-scale ang pag-fifilter"
+ScaleFiltering.Point="Punto"
+ScaleFiltering.Bilinear="Bilinear"
+ScaleFiltering.Bicubic="Bicubic"
+ScaleFiltering.Lanczos="Lanczos"
+
+Deinterlacing="Deinterlacing"
+Deinterlacing.Discard="Discard"
+Deinterlacing.Retro="Retro"
+Deinterlacing.Blend="Blend"
+Deinterlacing.Blend2x="Blend 2x"
+Deinterlacing.Linear="Linear"
+Deinterlacing.Linear2x="Linear 2x"
+Deinterlacing.Yadif="Yadif"
+Deinterlacing.Yadif2x="Yadif 2x"
+Deinterlacing.TopFieldFirst="Itaas ang Patlang Una"
+Deinterlacing.BottomFieldFirst="Ibaba ang Patlang Una"
+
+VolControl.SliderUnmuted="Dami ng islayder para sa '%1':%2"
+VolControl.SliderMuted="Dami ng islayder para sa '%1':%2 (na kasalukuyang mahina)"
+VolControl.Mute="Mahina '%1'"
+VolControl.Properties="Ari-arian na para sa '%1'"
+
+Basic.Main.AddSceneDlg.Title="Idagdag sa Eksena"
+Basic.Main.AddSceneDlg.Text="Pakiusap idagdag ang pangalan ng mga eksena"
+
+Basic.Main.DefaultSceneName.Text="Eksena %1"
+
+Basic.Main.AddSceneCollection.Title="Idagdag ang Eksena sa Koleksyon"
+Basic.Main.AddSceneCollection.Text="Mangyari lamang ilagay ang pangalan ng koleksyon ng mga eksena"
+
+Basic.Main.RenameSceneCollection.Title="Palitan ang pangalan ng Koleksyon ng mga Eksena"
+
+AddProfile.Title="Idagdag ang Profile"
+AddProfile.Text="Mangyari lamang ilagay ang pangalan ng profile"
+
+RenameProfile.Title="Palitan ang pangalan ng Profile"
+
+Basic.Main.MixerRename.Title="Palitan ang pangalan ng Audio Source"
+Basic.Main.MixerRename.Text="Mangyari lamang ilagay ang pangalan ng audio source"
+
+
+Basic.Main.PreviewDisabled="Ang preview ay kasalukuyang hindi gumagana"
+
+Basic.SourceSelect="Lumikha/Pumili ng Source"
+Basic.SourceSelect.CreateNew="Lumikha ng bago"
+Basic.SourceSelect.AddExisting="Idagdag ang Umiiral na"
+Basic.SourceSelect.AddVisible="Palitawin ang source"
+
+Basic.PropertiesWindow="Mga Katangian para sa '%1'"
+Basic.PropertiesWindow.AutoSelectFormat="%1 (autoselect: %2)"
+Basic.PropertiesWindow.SelectColor="Pumili ng Kulay"
+Basic.PropertiesWindow.SelectFont="Pumili ng font"
+Basic.PropertiesWindow.ConfirmTitle="Binago ang mga Setting"
+Basic.PropertiesWindow.Confirm="Mayroong mga pagbabagong hindi na-save. Nais mo bang panatilihin ang mga ito?"
+Basic.PropertiesWindow.NoProperties="Walang mga katangiang magagamit"
+Basic.PropertiesWindow.AddFiles="Idagdag ang mga File"
+Basic.PropertiesWindow.AddDir="Idagdag ang Direktory"
+Basic.PropertiesWindow.AddURL="Idagdag ang Path/URL"
+Basic.PropertiesWindow.AddEditableListDir="Idagdag ang directory sa '%1'"
+Basic.PropertiesWindow.AddEditableListFiles="Idagdag ang mga file sa '%1'"
+Basic.PropertiesWindow.AddEditableListEntry="Magdagdag ng entry sa '%1'"
+Basic.PropertiesWindow.EditEditableListEntry="Baguhin ang entry mula sa '%1'"
+
+Basic.PropertiesView.FPS.Simple="Simpleng mga FPS Value"
+Basic.PropertiesView.FPS.Rational="Rasyonal na mga FPS Value"
+Basic.PropertiesView.FPS.ValidFPSRanges="Balidong mga FPS Range:"
+
+Basic.InteractionWindow="Nakikipag-interact sa '%1'"
+
+Basic.StatusBar.Reconnecting="Na-diskonek, muling magku-kunek sa loob ng %2 segundo(mga) (pagtangka%1)"
+Basic.StatusBar.AttemptingReconnect="Sinusubukang uling maka-konek... (tangka %1)"
+Basic.StatusBar.ReconnectSuccessful="Matagumpay na muling naka-konek"
+Basic.StatusBar.Delay="Antala (%1 segundo)"
+Basic.StatusBar.DelayStartingIn="Antala (magsisimula sa loob ng %1 segundo)"
+Basic.StatusBar.DelayStoppingIn="Antala (hihinto sa loob ng %1 segundo)"
+Basic.StatusBar.DelayStartingStoppingIn="Antala (hihinto sa loob ng %1 segundo, magsisimula sa loob ng %2 segundo)"
+
+Basic.Filters="Mga Filter"
+Basic.Filters.AsyncFilters="Audio/Video na mga Filter"
+Basic.Filters.AudioFilters="Audio na mga Filter"
+Basic.Filters.EffectFilters="Efeect na mga Filter"
+Basic.Filters.Title="Mga Filter para sa '%1'"
+Basic.Filters.AddFilter.Title="Pangalan ng Filter"
+Basic.Filters.AddFilter.Text="Mangyari lamang tukuyin ang pangalan ng filter"
+
+Basic.TransformWindow="Pagbabago ng mga Bagay sa Eksena"
+Basic.TransformWindow.Position="Posisyon"
+Basic.TransformWindow.Rotation="Pag-ikot"
+Basic.TransformWindow.Size="Sukat"
+Basic.TransformWindow.Alignment="Pagkahanay-hanay ng mga posisyon"
+Basic.TransformWindow.BoundsType="Tipo ng Nakagagapos na Kahon"
+Basic.TransformWindow.BoundsAlignment="Pagkakahanay sa Bounding Kahon"
+Basic.TransformWindow.Bounds="Kahon Sukat ng Bounding"
+Basic.TransformWindow.Crop="I-krop"
+
+Basic.TransformWindow.Alignment.TopLeft="Itaas sa kaliwa"
+Basic.TransformWindow.Alignment.TopCenter="Itaas sa Gitna"
+Basic.TransformWindow.Alignment.TopRight="Itaas sa Kanan"
+Basic.TransformWindow.Alignment.CenterLeft="Gitna sa Kaliwa"
+Basic.TransformWindow.Alignment.Center="Gitna"
+Basic.TransformWindow.Alignment.CenterRight="Gitna sa Kanan"
+Basic.TransformWindow.Alignment.BottomLeft="Baba sa Kaliwa"
+Basic.TransformWindow.Alignment.BottomCenter="Baba sa Gitna"
+Basic.TransformWindow.Alignment.BottomRight="Baba sa Kanan"
+
+Basic.TransformWindow.BoundsType.None="Walang Hangganan"
+Basic.TransformWindow.BoundsType.MaxOnly="Pinakamataas na sukat lamang"
+Basic.TransformWindow.BoundsType.ScaleInner="Panloob na hangganan ng scale"
+Basic.TransformWindow.BoundsType.ScaleOuter="Panlabas na hangganan ng scale"
+Basic.TransformWindow.BoundsType.ScaleToWidth="Lapad ng hangganan ng scale"
+Basic.TransformWindow.BoundsType.ScaleToHeight="Taas ng hangganan ng scale"
+Basic.TransformWindow.BoundsType.Stretch="Kahabaan sa hangganan"
+
+Basic.Main.AddSourceHelp.Title="Hindi pwede idagdag sa Pinagmulan"
+Basic.Main.AddSourceHelp.Text="Kailangan mo na magkaroon ng hindi bababa sa isang eksena na idadagdag sa pinagmulan."
+
+Basic.Main.Scenes="Eksena"
+Basic.Main.Sources="Pinagmulan"
+Basic.Main.Controls="Mga kontrol"
+Basic.Main.Connecting="Pagkonekta..."
+Basic.Main.StartRecording="Magsimula sa Pagtatala"
+Basic.Main.StartReplayBuffer="Magsimula Mag replay Buffer"
+Basic.Main.StartStreaming="Magsimula na mag Streaming"
+Basic.Main.StopRecording="Huminto sa Pagtatala"
+Basic.Main.StoppingRecording="Pagtigil sa Pagtatala..."
+Basic.Main.StopReplayBuffer="Huminto Mag-replay Buffer"
+Basic.Main.StoppingReplayBuffer="Pagtigil Mag-replay Buffer..."
+Basic.Main.StopStreaming="Ihinto Mag-streaming"
+Basic.Main.StoppingStreaming="Pagtigil ng Daloy..."
+Basic.Main.ForceStopStreaming="Itigil ang pag-stream (tanggalin ang antala)"
+
+Basic.MainMenu.File="&File"
+Basic.MainMenu.File.Export="&I-export"
+Basic.MainMenu.File.Import="&I-angkat"
+Basic.MainMenu.File.ShowRecordings="Ipakita ang mga &Recording"
+Basic.MainMenu.File.Remux="Re&mux na mga Recording"
+Basic.MainMenu.File.Settings="&Mga Setting"
+Basic.MainMenu.File.ShowSettingsFolder="Ipakita ang Folder ng mga Setting"
+Basic.MainMenu.File.ShowProfileFolder="Ipakita ang Profile Folder"
+Basic.MainMenu.AlwaysOnTop="&Palaging Nasa Tuktok"
+Basic.MainMenu.File.Exit="E&xit"
+
+Basic.MainMenu.Edit="I&edit"
+Basic.MainMenu.Edit.Undo="Ipawalang-bisa (&U)"
+Basic.MainMenu.Edit.Redo="Gawin Muli (&R)"
+Basic.MainMenu.Edit.UndoAction="Ipawalang-bisa $1 (&U)"
+Basic.MainMenu.Edit.RedoAction="Gawing Muli $1 (&R)"
+Basic.MainMenu.Edit.LockPreview="&Naka-lock na Preview"
+Basic.MainMenu.Edit.Scale="Preview &Scaling"
+Basic.MainMenu.Edit.Scale.Window="Gawing Kasing-Laki ng Window"
+Basic.MainMenu.Edit.Scale.Canvas="Kanbas (%1x%2)"
+Basic.MainMenu.Edit.Scale.Output="Output (%1x%2)"
+Basic.MainMenu.Edit.Transform="&Transform"
+Basic.MainMenu.Edit.Transform.EditTransform="&Baguhin ang Transform..."
+Basic.MainMenu.Edit.Transform.CopyTransform="Kopyahin ang Transform"
+Basic.MainMenu.Edit.Transform.PasteTransform="I-paste ang Transform"
+Basic.MainMenu.Edit.Transform.ResetTransform="&I-set muli ang Transform"
+Basic.MainMenu.Edit.Transform.Rotate90CW="Iikot ng 90 degrees CW"
+Basic.MainMenu.Edit.Transform.Rotate90CCW="Iikot ng 90 degrees CCW"
+Basic.MainMenu.Edit.Transform.Rotate180="Iikot ng 180 degrees"
+Basic.MainMenu.Edit.Transform.FlipHorizontal="Baliktarin ng &pahalang"
+Basic.MainMenu.Edit.Transform.FlipVertical="Baliktarin ng &patayo"
+Basic.MainMenu.Edit.Transform.FitToScreen="&Pagkasyahin sa Screen"
+Basic.MainMenu.Edit.Transform.StretchToScreen="&I-stretch sa screen"
+Basic.MainMenu.Edit.Transform.CenterToScreen="&I-sentro sa screen"
+Basic.MainMenu.Edit.Order="&Pagkakasunod-sunod"
+Basic.MainMenu.Edit.Order.MoveUp="Ilipat &Pataas"
+Basic.MainMenu.Edit.Order.MoveDown="Ilipat &Pababa"
+Basic.MainMenu.Edit.Order.MoveToTop="Ilipat sa &Pinaka taas"
+Basic.MainMenu.Edit.Order.MoveToBottom="Ilipat sa &Pinaka baba"
+Basic.MainMenu.Edit.AdvAudio="&Advanced na mga Katangian ng Audio"
+
+Basic.MainMenu.View="&View"
+Basic.MainMenu.View.Toolbars="&Mga Toolbar"
+Basic.MainMenu.View.Docks="Mga Dock"
+Basic.MainMenu.View.Docks.ResetUI="I-set muli ang UI"
+Basic.MainMenu.View.Docks.LockUI="I-lock UI"
+Basic.MainMenu.View.Toolbars.Listboxes="&Mga Listbox"
+Basic.MainMenu.View.SceneTransitions="Mga Transisyon ng S&cene"
+Basic.MainMenu.View.StatusBar="&Status Bar"
+Basic.MainMenu.View.Fullscreen.Interface="Interface gamit ang buong screen"
+
+Basic.MainMenu.SceneCollection="&Kolekysyon ng mga Scene"
+Basic.MainMenu.Profile="&Profile"
+Basic.MainMenu.Profile.Import="I-import ang Profile"
+Basic.MainMenu.Profile.Export="I-export ang Profile"
+Basic.MainMenu.SceneCollection.Import="I-import ang Koleksyon ng mga Eksena"
+Basic.MainMenu.SceneCollection.Export="I-export ang Koleksyon ng mga Eksena"
+Basic.MainMenu.Profile.Exists="May ganito ng Profile"
+Basic.MainMenu.SceneCollection.Exists="Mayroon ng ganitong koleksyon ng mga eksena"
+
+Basic.MainMenu.Tools="&Mga Kasangkapan"
+
+Basic.MainMenu.Help="&Tulong"
+Basic.MainMenu.Help.HelpPortal="Portal Para sa &Tulong"
+Basic.MainMenu.Help.Website="Bisitahin ang &Website"
+Basic.MainMenu.Help.Logs="&Mga Log File"
+Basic.MainMenu.Help.Logs.ShowLogs="&Ipakita ang mga Log File"
+Basic.MainMenu.Help.Logs.UploadCurrentLog="I-upload ang &Pangkasalukuyang Log File"
+Basic.MainMenu.Help.Logs.UploadLastLog="I-upload ang Huling Log File"
+Basic.MainMenu.Help.Logs.ViewCurrentLog="&Tingnan ang Pangkasalukuyang Log"
+Basic.MainMenu.Help.CheckForUpdates="Maghanap ng mga Update"
+
+Basic.Settings.ProgramRestart="Ang programa ay kailangan i-start muli para gumana ang mga setting na ito."
+Basic.Settings.ConfirmTitle="Kumpirmahin ang mga Pagbabago"
+Basic.Settings.Confirm="Mayroon kang mga binago na hindi pa na-save. I-save ang mga pagbabago?"
+
+Basic.Settings.General="Pangkalahatan"
+Basic.Settings.General.Theme="Tema"
+Basic.Settings.General.Language="Lenggwahe"
+Basic.Settings.General.EnableAutoUpdates="Awtomatikong maghanap ng mga update sa pag-start up"
+Basic.Settings.General.OpenStatsOnStartup="Buksan ang dialogong panstatistiko sa pag-startup"
+Basic.Settings.General.WarnBeforeStartingStream="Ipakita ang kumpirmasyon ng dialogo kapag nagumpisang mag-stream"
+Basic.Settings.General.WarnBeforeStoppingStream="Ipakita ang kumpirmasyon ng dialogo kapag naghihinto ng pag-stream"
+Basic.Settings.General.Projectors="Mga Projector"
+Basic.Settings.General.HideProjectorCursor="Itago ang cursor sa ibabaw ng mga projector"
+Basic.Settings.General.ProjectorAlwaysOnTop="Ilagay palagi sa tuktok ang mga projector"
+Basic.Settings.General.Snapping="Pag-snap ng pagkakahanay ng source"
+Basic.Settings.General.ScreenSnapping="I-snap ang mga source sa gilid ng screen"
+Basic.Settings.General.CenterSnapping="I-snap ang mga source sa pahalang at patayong sentro"
+Basic.Settings.General.SourceSnapping="I-snap ang mga Source sa iba pang mga source"
+Basic.Settings.General.SnapDistance="I-snap ang pagka-sensitibo"
+Basic.Settings.General.RecordWhenStreaming="Awtomatikong mag-rekord kapag nag-stream"
+Basic.Settings.General.KeepRecordingWhenStreamStops="Patuloy na mag-rekord kapag tumigil ang pag-stream"
+Basic.Settings.General.ReplayBufferWhileStreaming="Awtomatikong simulang ang replay buffer kapag nag-stream"
+Basic.Settings.General.KeepReplayBufferStreamStops="Panatilihing aktibo ang replay buffer kapag huminto ang pagstream"
+Basic.Settings.General.SysTray="System Tray"
+Basic.Settings.General.SysTrayWhenStarted="Paliitin sa system tray kapag inumpisahan"
+Basic.Settings.General.SystemTrayHideMinimize="Palaging paliitin sa system tray sa halip na task bar"
+Basic.Settings.General.SaveProjectors="I-save ang mga projector sa paglabas"
+Basic.Settings.General.SwitchOnDoubleClick="Lumipat sa eksena kapag dalawang beses pinindot"
+Basic.Settings.General.StudioPortraitLayout="Paganahin ang portrait/patayong layout"
+Basic.Settings.General.MultiviewLayout="Multiview Layout"
+
+Basic.Settings.Stream="Mag-stream"
+Basic.Settings.Stream.StreamType="Uri ng Pag-stream"
+
+Basic.Settings.Output="Output"
+Basic.Settings.Output.Format="Format ng Recording"
+Basic.Settings.Output.Encoder="Encoder"
+Basic.Settings.Output.SelectDirectory="Pumili ng Recording Directory"
+Basic.Settings.Output.SelectFile="Pumili ng Recording File"
+Basic.Settings.Output.EnforceBitrate="Ipatupad ang mga limitasyon sa serbisyo ng bitrate sa pag-stream"
+Basic.Settings.Output.Mode="Paraan ng Output"
+Basic.Settings.Output.Mode.Simple="Payak"
+Basic.Settings.Output.Mode.Adv="Mas Mahusay"
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg Output"
+Basic.Settings.Output.UseReplayBuffer="Paganahin ang Replay Buffer"
+Basic.Settings.Output.ReplayBuffer.SecondsMax="Pinakamataas na Oras ng Replay (Segundo)"
+Basic.Settings.Output.ReplayBuffer.MegabytesMax="Pinakamataas na Memorya (Megabytes)"
+Basic.Settings.Output.ReplayBuffer.Estimate="Tantiyang gamit sa memorya: %1 MB"
+Basic.Settings.Output.ReplayBuffer.EstimateUnknown="Hindi matantiya ang gamit sa memorya. Mangyari lamang mag-takda ng pinakamataas na limitasyon sa memorya."
+Basic.Settings.Output.ReplayBuffer.HotkeyMessage="(Tandaan: Siguruhing nakapagtakda ka ng hotkey para sa replay buffer sa hotkeys section)"
+Basic.Settings.Output.ReplayBuffer.Prefix="Panlapi para Filename ng Replay Buffer"
+Basic.Settings.Output.ReplayBuffer.Suffix="Hulapi"
+Basic.Settings.Output.Simple.SavePath="Landas ng Recording"
+Basic.Settings.Output.Simple.RecordingQuality="Kalidad ng Recording"
+Basic.Settings.Output.Simple.RecordingQuality.Stream="Katulad ng pag-stream"
+Basic.Settings.Output.Simple.RecordingQuality.Small="Mataas na Kalidad, Katamtamang Laki ng File"
+Basic.Settings.Output.Simple.RecordingQuality.HQ="Hindi Matukoy na Kalidad, Malaking File"
+Basic.Settings.Output.Simple.RecordingQuality.Lossless="Walang nabago sa Kalidad, Lubhang napakalaking File"
+Basic.Settings.Output.Simple.Warn.VideoBitrate="Babala: Ang video bitrate ng pag-stream ay itatakda sa %1, na siyang mataas na limitasyon para sa pangkasalukuyang serbisyo ng pagstream. Kung sigurado kang nais mong lumagpas sa %1, paganahin ang advanced encoder options at tanggalin ang check sa \"Enforce streaming bitrate limits\"."
+Basic.Settings.Output.Simple.Warn.AudioBitrate="Babala: Ang audio bitrate ng pag-stream ay itatakda sa %1, na siyang mataas na limitasyon para sa pangkasalukuyang serbisyo ng pag-strean. Kung sigurado kang nais mong lumagpas sa %1, paganahin ang advanced encoder options at tanggalin ang check sa \"Enforce streaming service bitrate limits\"."
+Basic.Settings.Output.Simple.Warn.Encoder="Babal: Ang pag-rekord gamit ang isang software encoder na iba ang kalidad sa pag-stream ay mangangailangan ng dagdag na pag-gamit sa CPU kung ikaw ay mag-stream at mag-rekord nang sabay."
+Basic.Settings.Output.Simple.Warn.Lossless="Babala: Ang kalidad na lossless ay nagbibigay ng lubhang malalaking file. Ang kalidad na lossless ay maaaring gumamit ng 7 gigabytes ng espasyo ng disk kada minuto o higit pa sa matataas na mga resolusyon o mga framerate. Ang lossless ay hindi minumungkahi para sa mga mahahabang recording maliban na lamang kung mayroon kang napakalaking espasyo sa disk na magagamit."
+Basic.Settings.Output.Simple.Warn.Lossless.Msg="Sigurado ka bang gusto mong gamitin ang lossless na kalidad?"
+Basic.Settings.Output.Simple.Warn.Lossless.Title="Lossless na kalidad babala!"
+Basic.Settings.Output.Simple.Warn.MultipleQSV="Babala: Hindi ka maaaring gumamit ng maraming magkahiwalay na QSV na mga encoder kapag say na nag-stream at nag-rerekord. Kung nais pagsabayin ang pag-stream at pag-rekord, mangyari lamang ibahin ang encoder para sa pag-rekord o ang encoder para sa pag-stream."
+Basic.Settings.Output.Simple.Encoder.Software="Software (x264)"
+Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Hardware (QSV)"
+Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Hardware (AMD)"
+Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Hardware (NVENC)"
+Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Software (x264 mababa ang nakatakdang paggamit ng CPU, dagdagan ang laki ng file)"
+Basic.Settings.Output.VideoBitrate="Video Bitrate"
+Basic.Settings.Output.AudioBitrate="Audio Bitrate"
+Basic.Settings.Output.Reconnect="Pakusa Makipagkonek muli"
+Basic.Settings.Output.RetryDelay="Subukan muling Maantala (Mga segundo)"
+Basic.Settings.Output.MaxRetries="Pinakamaraming Retries"
+Basic.Settings.Output.Advanced="Paganahin Pauna ang Enkoder Settings"
+Basic.Settings.Output.EncoderPreset="Pangkasalukuyan enkoder (Nakatataas = Mas mababa CPU)"
+Basic.Settings.Output.CustomEncoderSettings="Pasadyang enkoder Mga setting"
+Basic.Settings.Output.CustomMuxerSettings="Pasadyang mga Setting ng Muxer"
+Basic.Settings.Output.NoSpaceFileName="Gumawa ng Pangalan ng File nang walang Pagitan"
+
+Basic.Settings.Output.Adv.Rescale="I-re-iskala ang Output"
+Basic.Settings.Output.Adv.AudioTrack="Pangsubaybay ng Audio"
+Basic.Settings.Output.Adv.Streaming="Anod"
+Basic.Settings.Output.Adv.ApplyServiceSettings="I-enpors ang anod ng serbisyo ng mga enkoder seting"
+Basic.Settings.Output.Adv.Audio.Track1="Subaybayan 1"
+Basic.Settings.Output.Adv.Audio.Track2="Subaybayan 2"
+Basic.Settings.Output.Adv.Audio.Track3="Subaybayan 3"
+Basic.Settings.Output.Adv.Audio.Track4="Subaybayan 4"
+Basic.Settings.Output.Adv.Audio.Track5="Subaybayan 5"
+Basic.Settings.Output.Adv.Audio.Track6="Subaybayan 6"
+
+Basic.Settings.Output.Adv.Recording="Pagtatala"
+Basic.Settings.Output.Adv.Recording.Type="Uri"
+Basic.Settings.Output.Adv.Recording.Type.Standard="Pamantayan"
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Pasadyang Palabas (FFmpeg)"
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Gamitin ang stream encoder)"
+Basic.Settings.Output.Adv.Recording.Filename="Pangalan ng File ng Pag-format"
+Basic.Settings.Output.Adv.Recording.OverwriteIfExists="Higit na pasulat kung ang file ay umiiral"
+Basic.Settings.Output.Adv.FFmpeg.Type="Ang Palabas na Uri ng FFmpeg"
+Basic.Settings.Output.Adv.FFmpeg.Type.URL="Output sa URL"
+Basic.Settings.Output.Adv.FFmpeg.Type.RecordToFile="Output sa File"
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Mga Karaniwang format sa pagrekord"
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Lahat ng mga File"
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Landas ng file o URL"
+Basic.Settings.Output.Adv.FFmpeg.Format="Format ng Container"
+Basic.Settings.Output.Adv.FFmpeg.FormatAudio="Audio"
+Basic.Settings.Output.Adv.FFmpeg.FormatVideo="Video"
+Basic.Settings.Output.Adv.FFmpeg.FormatDefault="Default na Format"
+Basic.Settings.Output.Adv.FFmpeg.FormatDesc="Paglalarawan ng Container Format"
+Basic.Settings.Output.Adv.FFmpeg.FormatDescDef="Audio/Video Codec na hinulaan mula sa landas ng File o URL"
+Basic.Settings.Output.Adv.FFmpeg.AVEncoderDefault="Default Encoder"
+Basic.Settings.Output.Adv.FFmpeg.AVEncoderDisable="Huwag paganahin ang Encoder"
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Video Encoder"
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Mga Setting para sa Video Encoder (kung mayroon)"
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Audio Encoder"
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Mga Setting ng Audio Encoder(kung mayroon)"
+Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Mga Setting ng Muxer (kung mayroon)"
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="Agwat ng Keyframe (mga imahe)"
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Ipakita ang lahat ng mga code (kahit na maaaring hindi akma)"
+
+FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
+
+FilenameFormatting.TT="%CCYY Taon, apat na tambilang\n%YY Taon, huling dalawang tambilang (00-99)\n%MM Buwan bilang isang decimal na numero (01-12)\n%DD Araw ng buwan, zero-padded (01-31)\n%hh Oras sa 24h na format (00-23)\n%mm Minuto(00-59)\n%ss Segundo (00-61)\n%% A % sign\n%a Pina-ikling ngalan ng araw\n%A Buong ngalan ng araw\n%b Pinaikling ngalan ng buwan\n%B Buong ngalan ng buwan\n%d Araw ng Buwan, zero-padded (01-31)\n%H Oras sa 24h na format (00-23)\n%I Oras sa 12h na format (01-12)\n%m Buwang bilang isang decimal na numero (01-12)\n%M Minuto (00-59)\n%p AM o PM na paghirang\n%S Segundo (00-61)\n%y Taon, huling dalawang tambilang (00-99)\n%Y Taon\n%z ISO 8601 kanselahin mula sa UTC o timezone\n pangalan ng pinaikli \n%Z Ngalan ng Timezone o abbreviation\n"
+
+Basic.Settings.Video="Video"
+Basic.Settings.Video.Adapter="Video Adapter"
+Basic.Settings.Video.BaseResolution="Resolusyon ng Base (Kanbas)"
+Basic.Settings.Video.ScaledResolution="Resolution ng Output (Na-scale)"
+Basic.Settings.Video.DownscaleFilter="Pababaan ang Filter"
+Basic.Settings.Video.DisableAeroWindows="Huwag paganahin ang Aero (Windows lamang)"
+Basic.Settings.Video.FPS="FPS"
+Basic.Settings.Video.FPSCommon="Karaniwang mga FPS Value"
+Basic.Settings.Video.FPSInteger="Integer ng FPS Value"
+Basic.Settings.Video.FPSFraction="Praksyonal na FPS Value"
+Basic.Settings.Video.Numerator="Numerador"
+Basic.Settings.Video.Denominator="Denominador"
+Basic.Settings.Video.Renderer="Renderer"
+Basic.Settings.Video.InvalidResolution="Walang bisa ang value ng resolusyon. Kailangang [width]x[height] (hal. 1920x1080)"
+Basic.Settings.Video.CurrentlyActive="Kasalukuyang aktibo ang video output. Mangyari lamang patayin ang anumang mga output upang mabago ang mga video setting."
+Basic.Settings.Video.DisableAero="Huwag paganahin ang Aero"
+
+Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (Pinakamabilis, ngunit hindi malinaw pag nag-scale)"
+Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubic (Matalas na pag-scale, 16 na mga halimbawa)"
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Pinatalas na pag-scale, 32 na mga halimbawa)"
+
+Basic.Settings.Audio="Audio"
+Basic.Settings.Audio.SampleRate="Sample Rate"
+Basic.Settings.Audio.Channels="Mga Channel"
+Basic.Settings.Audio.MeterDecayRate="Audio Meter Decay Rate"
+Basic.Settings.Audio.MeterDecayRate.Fast="Mabilis"
+Basic.Settings.Audio.MeterDecayRate.Medium="Medium (Type I PPM)"
+Basic.Settings.Audio.MeterDecayRate.Slow="Mabagal (Type II PPM)"
+Basic.Settings.Audio.MultiChannelWarning.Enabled="BABALA: Naka-enable ang surround sound audio."
+Basic.Settings.Audio.MultichannelWarning="Kung nagsi-stream, tingnan kung ang streaming service ay sinusuportahan ang parehong surround sound ingest pat ang surround sound playback. Ang Twitch, Facebook 360 Live, Mixer RTMP, Smashcast ay mga halimbawa kung saan ang surround sound ay sinusuportahan ng buo. Kahit na ang Facebook Live at YouTube live ay parehong tumatanggap ng surround ingest, ang Facebook Live ay nagda-downmix sa stereo, at ang YouTube Live ay nagpapakita lamang ng dalawang channel. \n\nAng OBS audio na mga filter ay akma sa surround sound, pero ang suporta sa VST plugin ay hindi garantisado."
+Basic.Settings.Audio.MultichannelWarning.Title="Mapapagana ba ang tunog ng palibot ng audio?"
+Basic.Settings.Audio.MultichannelWarning.Confirm="Sigurado ka ba na gusto mong paganahin ang tunog ng palibot ng audio?"
+Basic.Settings.Audio.DesktopDevice="Apatarong Desktop Awdiyo"
+Basic.Settings.Audio.DesktopDevice2="Aparatong Desktop Awdiyo 2"
+Basic.Settings.Audio.AuxDevice="Mic/Katulong na Aparato ng Awdiyo"
+Basic.Settings.Audio.AuxDevice2="Mic/Katulong na Aparato ng Awdiyo 2"
+Basic.Settings.Audio.AuxDevice3="Mic/Katulong na Aparato ng Awdiyo 3"
+Basic.Settings.Audio.EnablePushToMute="Paganahin Itulak-para-ma-i-mute"
+Basic.Settings.Audio.PushToMuteDelay="Pag-antala sa pagtulak-sa-walang tunog"
+Basic.Settings.Audio.EnablePushToTalk="Paganahin itulak-sa-usapan"
+Basic.Settings.Audio.PushToTalkDelay="Pag-antala sa pagtulak-sa-usapan"
+Basic.Settings.Audio.UnknownAudioDevice="[Ang aparato ay hindi nakakonekta o hindi magagamit]"
+
+Basic.Settings.Advanced="Pauna"
+Basic.Settings.Advanced.General.ProcessPriority="Prayoridad na Pagproseso"
+Basic.Settings.Advanced.General.ProcessPriority.High="Mataas"
+Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="Sa Taas ng Karaniwan"
+Basic.Settings.Advanced.General.ProcessPriority.Normal="Karaniwan"
+Basic.Settings.Advanced.General.ProcessPriority.BelowNormal="Sa ibaba ng karaniwan"
+Basic.Settings.Advanced.General.ProcessPriority.Idle="Walang ginagawa"
+Basic.Settings.Advanced.FormatWarning="Babala: Ang mga format ng mga kulay maliban sa NV12 ay ginawa unsa lahat para sa pagrerekord, at hindi nirerekomenda para sa pag-stream. Ang pag-stream ay maaaring magdulot ng dagdag na gamit sa CPU dahil sa pagbago ng format ng kulay."
+Basic.Settings.Advanced.Audio.BufferingTime="Bilis ng Pag-buffer ng Audio"
+Basic.Settings.Advanced.Video.ColorFormat="Fomat ng Kulay"
+Basic.Settings.Advanced.Video.ColorSpace="YUV Espasyo ng Kulay"
+Basic.Settings.Advanced.Video.ColorRange="YUV Hanay ng Kulay"
+Basic.Settings.Advanced.Video.ColorRange.Partial="Panguna"
+Basic.Settings.Advanced.Video.ColorRange.Full="Buo"
+Basic.Settings.Advanced.Audio.MonitoringDevice="Kagamitang Pangsubaybay ng Audio"
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Default"
+Basic.Settings.Advanced.Audio.DisableAudioDucking="Huwag paganahin ang audio ducking ng Windows"
+Basic.Settings.Advanced.StreamDelay="Antala sa Pag-stream"
+Basic.Settings.Advanced.StreamDelay.Duration="Bilis (segundo)"
+Basic.Settings.Advanced.StreamDelay.Preserve="Balikan kung saan huling pinutol (dagadagan ang antala) pagka konekta muli"
+Basic.Settings.Advanced.StreamDelay.MemoryUsage="Tantiyang Gamit sa Memorya: %1 MB"
+Basic.Settings.Advanced.Network="Network"
+Basic.Settings.Advanced.Network.BindToIP="Bumigkis sa IP"
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Paganahin ang bagong code ng pag-network"
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Mode para sa low latency"
+
+Basic.AdvAudio="Pinahusay na mga Katangian ng Audio"
+Basic.AdvAudio.Name="Pangalan"
+Basic.AdvAudio.Volume="Lakas ng tunog (%)"
+Basic.AdvAudio.Mono="I-downmix para maging Mono"
+Basic.AdvAudio.Panning="Panning"
+Basic.AdvAudio.SyncOffset="Sync Offset (ms)"
+Basic.AdvAudio.Monitoring="Pagsubaybay sa Audio"
+Basic.AdvAudio.Monitoring.None="Naka-off ang Monitor"
+Basic.AdvAudio.Monitoring.MonitorOnly="Monitor Lamang (naka-mute na output)"
+Basic.AdvAudio.Monitoring.Both="Monitor at Output"
+Basic.AdvAudio.AudioTracks="Mga Track"
+
+Basic.Settings.Hotkeys="Mga Hotkey"
+Basic.Settings.Hotkeys.Pair="Ang mga kombinasyon ng mga key kasama ang '%1' ay nagsisilbing mga toggle"
+
+Basic.Hotkeys.SelectScene="Lumipat sa eksena"
+
+Basic.SystemTray.Show="Ipakita"
+Basic.SystemTray.Hide="Itago"
+
+Basic.SystemTray.Message.Reconnecting="Nadiskonekta. Kumukonekta muli..."
+
+Hotkeys.Insert="Isingit"
+Hotkeys.Delete="Burahin"
+Hotkeys.Home="Home"
+Hotkeys.End="Wakas"
+Hotkeys.PageUp="Itaas ng Pahina"
+Hotkeys.PageDown="Ibaba ng Pahina"
+Hotkeys.NumLock="Num Lock"
+Hotkeys.ScrollLock="Scroll Lock"
+Hotkeys.CapsLock="Caps Lock"
+Hotkeys.Backspace="Backspace"
+Hotkeys.Tab="Tab"
+Hotkeys.Print="Ilimbag"
+Hotkeys.Pause="Ihinto"
+Hotkeys.Left="Kaliwa"
+Hotkeys.Right="Kanan"
+Hotkeys.Up="Taas"
+Hotkeys.Down="Baba"
+Hotkeys.Windows="Windows"
+Hotkeys.Super="Super"
+Hotkeys.Menu="Menu"
+Hotkeys.Space="Espasyo"
+Hotkeys.NumpadNum="Numpad %1"
+Hotkeys.NumpadMultiply="Numpad Multiply"
+Hotkeys.NumpadDivide="Numpad Divide"
+Hotkeys.NumpadAdd="Numpad Add"
+Hotkeys.NumpadSubtract="Numpad Subtract"
+Hotkeys.NumpadDecimal="Numpad Decimal"
+Hotkeys.AppleKeypadNum="%1 (Keypad)"
+Hotkeys.AppleKeypadMultiply="* (Keypad)"
+Hotkeys.AppleKeypadDivide="/ (Keypad)"
+Hotkeys.AppleKeypadAdd="+ (Keypad)"
+Hotkeys.AppleKeypadSubtract="- (Keypad)"
+Hotkeys.AppleKeypadDecimal=". (Keypad)"
+Hotkeys.AppleKeypadEqual="= (Keypad)"
+Hotkeys.MouseButton="Mouse %1"
+
+Mute="I-mute"
+Unmute="Ibalik ang Tunog"
+Push-to-mute="Pindutin-para-i-mute"
+Push-to-talk="Pindutin-para-makipagusap"
+
+SceneItemShow="Ipakita ang '%1'"
+SceneItemHide="Itago '%1'"
+
+OutputWarnings.NoTracksSelected="Kailangan mong pumili ng kahit isang track"
+OutputWarnings.MultiTrackRecording="Babala: May ilang mga format (tulad ng FLV) na hindi sumusuporta ng maramihang track kada isang pag-rekord"
+OutputWarnings.MP4Recording="Babala: Ang mga rekording na naka-save sa MP4 ay hindi na muling mababawi kung ang file ay hindi maaaring tapusin (hal. bilang resulta ng mga BSOD, nawalan ng kuryente, at iba pa). Kung gusto mong mag-rekord ng maraming audio track, maaari mong gamitin ang MKV at i-remux ang recording sa mp4 pag natapos na ito (File->Remux Recordings)"
+
+FinalScene.Title="Burahin ang Eksena"
+FinalScene.Text="Kailangan mayroon kahit isang eksena."
+
+
+
+
diff --git a/UI/data/locale/tr-TR.ini b/UI/data/locale/tr-TR.ini
index 1f8c4719d..7aee010dd 100644
--- a/UI/data/locale/tr-TR.ini
+++ b/UI/data/locale/tr-TR.ini
@@ -78,6 +78,8 @@ None="Hiçbiri"
StudioMode.Preview="Önizleme"
StudioMode.Program="Program"
ShowInMultiview="Çoklu Ekranda Göster"
+VerticalLayout="Dikey Düzen"
+Group="Grup"
AlreadyRunning.Title="OBS zaten çalışıyor"
AlreadyRunning.Text="OBS zaten çalışıyor! Bunu yapmak istemediyseniz, lütfen yeni bir örneği çalıştırmayı denemeden önce varolan tüm OBS örneklerini kapatın. OBS'yi sistem tablasına küçülmesi için ayarladıysanız, lütfen hala çalışıp çalışmadığını görmek için orayı kontrol edin."
@@ -209,7 +211,7 @@ ConfirmExit.Text="OBS şu anda etkin. Tüm yayınlar / kayıtlar kapatılacak.
ConfirmRemove.Title="Kaldırmayı Onayla"
ConfirmRemove.Text="'$1''i kaldırmak istediğinizden emin misiniz?"
-ConfirmRemove.TextMultiple="%1 öğeyi kaldırmak istediğinizden emin misiniz?"
+ConfirmRemove.TextMultiple="%1 ögeyi kaldırmak istediğinizden emin misiniz?"
Output.StartStreamFailed="Yayın başlatılamadı"
Output.StartRecordingFailed="Kayıt başlatılamadı"
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="Tekrar Oynatma Arabelleği Durduruluyor..."
Basic.Main.StopStreaming="Yayını Durdur"
Basic.Main.StoppingStreaming="Canlı Yayın Durduruluyor..."
Basic.Main.ForceStopStreaming="Yayını Durdur (gecikmeyi yoksay)"
+Basic.Main.Group="Grup %1"
+Basic.Main.GroupItems="Seçilen Ögeleri Grupla"
+Basic.Main.Ungroup="Grubu Çöz"
Basic.MainMenu.File="&Dosya"
Basic.MainMenu.File.Export="Dışa Aktar"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="&Araçlar"
Basic.MainMenu.Help="&Yardım"
Basic.MainMenu.Help.HelpPortal="Yardım &Portalı"
Basic.MainMenu.Help.Website="&Siteyi Ziyaret Et"
+Basic.MainMenu.Help.Discord="&Discord Sunucusuna Katıl"
Basic.MainMenu.Help.Logs="&Günlük Dosyaları"
Basic.MainMenu.Help.Logs.ShowLogs="&Günlük Dosyalarını Göster"
Basic.MainMenu.Help.Logs.UploadCurrentLog="&Mevcut Günlük Dosyasını Karşıya Yükle"
Basic.MainMenu.Help.Logs.UploadLastLog="&Son Günlük Dosyasını Karşıya Yükle"
Basic.MainMenu.Help.Logs.ViewCurrentLog="&Şimdiki Günlüğü Göster"
Basic.MainMenu.Help.CheckForUpdates="Güncellemeleri Denetle"
+Basic.MainMenu.Help.CrashLogs="Çökme &Raporları"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="Çökme Raporlarını &Göster"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="&Son Çökme Raporunu Yükle"
Basic.Settings.ProgramRestart="Programın, bu ayarların etkinleşmesi için yeniden başlatılması gerekir."
Basic.Settings.ConfirmTitle="Değişiklikleri Onayla"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Her zaman görev çubuğu yerine
Basic.Settings.General.SaveProjectors="Çıkışta projektörleri kaydet"
Basic.Settings.General.SwitchOnDoubleClick="Çift tıklamada sahneye geçiş yap"
Basic.Settings.General.StudioPortraitLayout="Dikey düzeni etkinleştir"
+Basic.Settings.General.Multiview="Çoklu görüntü"
+Basic.Settings.General.Multiview.MouseSwitch="Sahneler arası geçiş için tıkla"
+Basic.Settings.General.Multiview.DrawSourceNames="Sahne adlarını göster"
+Basic.Settings.General.Multiview.DrawSafeAreas="Güvenli alanları (EBU R 95) çiz"
Basic.Settings.General.MultiviewLayout="Çoklu Görüntü Düzeni"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Yatay, Üst"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Yatay, Alt"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Dikey, Sol"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Dikey, Sağ"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Yatay, Üst (8 Sahne)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Yatay, Alt (8 Sahne)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Dikey, Sol (8 Sahne)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Dikey, Sağ (8 Sahne)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Yatay, Üst (24 Sahne)"
Basic.Settings.Stream="Yayın"
Basic.Settings.Stream.StreamType="Yayın Türü"
@@ -631,6 +645,13 @@ Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Keskinleştirilmiş boyut
Basic.Settings.Audio="Ses"
Basic.Settings.Audio.SampleRate="Örnekleme Sıklığı"
Basic.Settings.Audio.Channels="Kanallar"
+Basic.Settings.Audio.MeterDecayRate="Ses Ölçer Sönüm Hızı"
+Basic.Settings.Audio.MeterDecayRate.Fast="Hızlı"
+Basic.Settings.Audio.MeterDecayRate.Medium="Orta (Tür I PPM)"
+Basic.Settings.Audio.MeterDecayRate.Slow="Yavaş (Tür II PPM)"
+Basic.Settings.Audio.PeakMeterType="Tepe Ölçer Türü"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="Örnek Tepe"
+Basic.Settings.Audio.PeakMeterType.TruePeak="Gerçek Tepe (Daha yüksek CPU kullanımı)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="Uyarı: Surround ses etkin."
Basic.Settings.Audio.MultichannelWarning="Yayın yapılıyorsa, yayın hizmetinizin hem surround ses alınımını hem de surround ses geri oynatımını desteklediğinden emin olun. Twitch, Facebook 360 Live, Karıştırıcı RTMP, Smashcast, surround sesin tam desteklendiği örneklerdir. Facebook Live'ın ve YouTube Live'ın her ikisi de surround alınımını desteklese de, Facebook Live stereo'ya indirger, ve YouTube Live sadece iki kanal oynatır.\n\nOBS ses filtreleri surround sesle uyumludur, ancak VST eklenti desteği kesin değildir."
Basic.Settings.Audio.MultichannelWarning.Title="Surround ses etkinleştirilsin mi?"
@@ -671,6 +692,7 @@ Basic.Settings.Advanced.Network="Ağ"
Basic.Settings.Advanced.Network.BindToIP="IP Bağla"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Yeni ağ kodunu etkinleştir"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Düşük gecike modu"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Ana pencere odaktayken kısayol tuşlarını devre dışı bırak"
Basic.AdvAudio="Gelişmiş Ses Özellikleri"
Basic.AdvAudio.Name="İsim"
@@ -745,3 +767,12 @@ OutputWarnings.MP4Recording="Uyarı: MP4'e kaydedilen kayıtlar eğer dosya sonl
FinalScene.Title="Sahneyi Sil"
FinalScene.Text="En az bir sahne olması gerekiyor."
+NoSources.Title="Kaynak Yok"
+NoSources.Text="Henüz hiç video kaynağı eklemediniz gibi görünüyor, bu yüzden sadece boş bir ekran çıktısı alacaksınız. Bunu yapmak istediğinize emin misiniz?"
+NoSources.Text.AddSource="Ana pencerede Kaynaklar kutusundaki + simgesine tıklayarak istediğiniz zaman kaynak ekleyebilirsiniz."
+
+ChangeBG="Renk Ayarla"
+CustomColor="Özel Renk"
+
+BrowserSource.EnableHardwareAcceleration="Tarayıcı Kaynak Donanım Hızlandırmasını Etkinleştir"
+
diff --git a/UI/data/locale/uk-UA.ini b/UI/data/locale/uk-UA.ini
index f45890bf8..57ff3fccf 100644
--- a/UI/data/locale/uk-UA.ini
+++ b/UI/data/locale/uk-UA.ini
@@ -78,6 +78,8 @@ None="Немає"
StudioMode.Preview="вікно Перегляду"
StudioMode.Program="Програма наживо"
ShowInMultiview="Показувати у Мульти-перегляді"
+VerticalLayout="Вертикальне компонування"
+Group="Група"
AlreadyRunning.Title="OBS вже виконується"
AlreadyRunning.Text="OBS вже запущено! Тільки якщо ви дійсно не намагаєтесь цього зробити, будь ласка позакривайте всі відкриті OBS перед тим як запускати нову копію. Якщо OBS налаштовано згортатися в трей, перевірте чи не виконується він там й досі."
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="Буфер Повторів зупиняєть
Basic.Main.StopStreaming="Закінчити трансляцію"
Basic.Main.StoppingStreaming="Припинення трансляції..."
Basic.Main.ForceStopStreaming="Закінчити трансляцію (миттєво)"
+Basic.Main.Group="Група %1"
+Basic.Main.GroupItems="Згрупувати вибрані елементи"
+Basic.Main.Ungroup="Розгрупувати"
Basic.MainMenu.File="&Файл"
Basic.MainMenu.File.Export="&Експорт"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="Додаткові &засоби"
Basic.MainMenu.Help="&Довідка"
Basic.MainMenu.Help.HelpPortal="&Портал з допомоги"
Basic.MainMenu.Help.Website="Відвідати &сайт"
+Basic.MainMenu.Help.Discord="Приє&днатися до серверу Discord"
Basic.MainMenu.Help.Logs="&Файли журналів"
Basic.MainMenu.Help.Logs.ShowLogs="&Показати файли журналів"
Basic.MainMenu.Help.Logs.UploadCurrentLog="Завантажити на сервер По&точний журнал"
Basic.MainMenu.Help.Logs.UploadLastLog="Завантажити на сервер &Останній журнал"
Basic.MainMenu.Help.Logs.ViewCurrentLog="П&ереглянути поточний журнал"
Basic.MainMenu.Help.CheckForUpdates="Перевірити оновлення"
+Basic.MainMenu.Help.CrashLogs="Звіти про &збої"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="П&оказати звіти про збої"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="Заванта&жити на сервер останній звіт про збій"
Basic.Settings.ProgramRestart="Програма потребує перезапуску, щоб нові налаштування набрали сили."
Basic.Settings.ConfirmTitle="Підтвердження змін"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Згортати в трей за
Basic.Settings.General.SaveProjectors="Зберегти налаштування режиму Проектор при виході"
Basic.Settings.General.SwitchOnDoubleClick="Відео-перехід до сцени за подвійним клацанням"
Basic.Settings.General.StudioPortraitLayout="Увімкнути портретне/вертикальне компонування"
+Basic.Settings.General.Multiview="Мульти-перегляд"
+Basic.Settings.General.Multiview.MouseSwitch="Переходити до сцени за клацанням миші"
+Basic.Settings.General.Multiview.DrawSourceNames="Показувати назви сцен"
+Basic.Settings.General.Multiview.DrawSafeAreas="Показати зони безпеки (EBU R 95)"
Basic.Settings.General.MultiviewLayout="Мульти-перегляд компонування"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Горизонтально, зверху"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Горизонтально, внизу"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Вертикально, ліворуч"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Вертикально, праворуч"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Горизонтально, зверху (8 сцен)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Горизонтально, знизу (8 сцен)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Вертикально, зліва (8 сцен)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Вертикально, праворуч (8 сцен)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Горизонтально, зверху (24 сцени)"
Basic.Settings.Stream="Трансляція"
Basic.Settings.Stream.StreamType="Тип Трансляції"
@@ -635,6 +649,9 @@ Basic.Settings.Audio.MeterDecayRate="Швидкість спаду індика
Basic.Settings.Audio.MeterDecayRate.Fast="Швидко"
Basic.Settings.Audio.MeterDecayRate.Medium="Середньо (PPM типу I)"
Basic.Settings.Audio.MeterDecayRate.Slow="Повільно (PPM типу II)"
+Basic.Settings.Audio.PeakMeterType="Тип вимірювача пікових значень"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="З точністю до вибірки"
+Basic.Settings.Audio.PeakMeterType.TruePeak="Істинно-піковий (більше навантаження на ЦП)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="ПОПЕРЕДЖЕННЯ: Увімкнуто об'ємний звук."
Basic.Settings.Audio.MultichannelWarning="Якщо робите трансляції, перевірте чи підтримує ваш сервіс трансляцій об'ємний звук на вході та виході. Twitch, Facebook 360 Live, Mixer RTMP, Smashcast - це приклади сервісів де об'ємний звук цілком підтримується. Навпаки, Facebook Live і YouTube Live обидва підтримують вхідний об'ємний звук, але Facebook Live мікшує його до стерео, а YouTube Live відтворює лише два канали.\n\nАудіо фільтри самої OBS сумісні з об'ємним звуком, хоча підтримку VST плагінами не гарантовано."
Basic.Settings.Audio.MultichannelWarning.Title="Увімкнути об'ємний звук для виводу аудіо?"
@@ -675,6 +692,7 @@ Basic.Settings.Advanced.Network="Мережа"
Basic.Settings.Advanced.Network.BindToIP="Прив'язати до адаптера (IP)"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Увімкнути новий мережевий код"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Режим з низькою затримкою"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Відключати гарячі клавіші, коли головне вікно знаходиться у фокусі"
Basic.AdvAudio="Розширені Налаштування Аудіо"
Basic.AdvAudio.Name="Назва"
@@ -749,3 +767,12 @@ OutputWarnings.MP4Recording="Попередження: Запис в MP4 мож
FinalScene.Title="Видалення сцени"
FinalScene.Text="Повинна бути принаймні одна сцена."
+NoSources.Title="Немає Джерел"
+NoSources.Text="Схоже, що ви не ще додали будь-якого відео Джерела. Таким чином на виводі буде лише порожній екран. Ви справді бажаєте це зробити?"
+NoSources.Text.AddSource="Ви можете будь-коли додати Джерела, натиснувши на значок (+) під панеллю Джерела в головному вікні."
+
+ChangeBG="Позначити кольором"
+CustomColor="Особливий колір"
+
+BrowserSource.EnableHardwareAcceleration="Задіяти апаратне прискорення для джерела 'Браузер'"
+
diff --git a/UI/data/locale/ur-PK.ini b/UI/data/locale/ur-PK.ini
new file mode 100644
index 000000000..d0afe8d77
--- /dev/null
+++ b/UI/data/locale/ur-PK.ini
@@ -0,0 +1,136 @@
+
+Language="انگلش"
+Region="متحدہ ریاستوں"
+
+OK="ٹھیک ہے"
+Apply="لاگو کریں"
+Cancel="منسوخ کریں"
+Close="بند کریں"
+Save="بچاؤ"
+Discard="چھوڑ دو"
+Disable="غیر فعال"
+Yes="جی ہاں"
+No="نہیں"
+Add="جمع"
+Remove="ہٹا دیں"
+Rename="تبدیل کریں"
+Interact="بات چیت"
+Filters="فلٹرز"
+Properties="خصوصیات"
+MoveUp="اوپر جایے"
+MoveDown="نیچے جائے"
+Settings="ترتیبات"
+Display="ڈسپلے"
+Name="نام"
+Exit="بند کریں"
+Mixer="مکسر"
+Browse="براؤز کریں"
+Mono="مونو"
+Stereo="سٹیریو"
+DroppedFrames="کھوئے گئے فریم 1 فیصد(2 فیصد)"
+StudioProgramProjector="پورے اسکرین پروجیکٹر (پروگرام)"
+PreviewProjector="پورے اسکرین پروجیکٹر (پیش نظارہ)"
+SceneProjector="پورے اسکرین پروجیکٹر (منظر)"
+SourceProjector="پورے اسکرین پروجیکٹر (ماخذ)"
+StudioProgramWindow="ونڈوز پروجیکٹر (پروگرام)"
+PreviewWindow="ونڈوز پروجیکٹر (پیش نظارہ)"
+SceneWindow="ہوا ہوا پروجیکٹر (منظر)"
+SourceWindow="ونڈوز پروجیکٹر (ماخذ)"
+MultiviewProjector="Multiview (پورے اسکرین)"
+MultiviewWindowed="Multi view (دریچہ شدہ)"
+Clear="واضح"
+Revert="واپس"
+Show="دکھائیں"
+Hide="چھپائیں"
+UnhideAll="سب کو چھوڑ دو"
+Untitled="غیر خطاب یافتہ"
+New="نیا"
+Duplicate="دونا کرنا"
+Enable="قابل کریں"
+DisableOSXVSync="OSX V-Sync کو غیر فعال کریں"
+ResetOSXVSyncOnExit="باہر نکلیں پرOSX V-Sync ری سیٹ کریں"
+HighResourceUsage="انکوڈنگ زیادہ اوورلوڈ! ویڈیو ترتیبات کو تبدیل کرنے یا تیزی سے انکوڈنگ کے پیش سیٹ کا استعمال کرتے ہوئے غور کریں."
+Transition="منتقلی"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UI/data/locale/vi-VN.ini b/UI/data/locale/vi-VN.ini
index b4caec9fd..763874da5 100644
--- a/UI/data/locale/vi-VN.ini
+++ b/UI/data/locale/vi-VN.ini
@@ -66,8 +66,10 @@ RemuxRecordings="Remux video"
Next="Tiếp tục"
Back="Quay lại"
Defaults="Mặc định"
+None="Không có"
StudioMode.Preview="Xem trước"
StudioMode.Program="Chương trình"
+Group="Nhóm"
AlreadyRunning.Title="OBS đã chạy"
AlreadyRunning.Text="OBS đã chạy rồi! Trừ khi bạn muốn làm điều này, xin vui lòng tắt mọi chương trình hiện tại của OBS trước khi cố gắng chạy một chương trình mới. Nếu bạn có OBS thiết lập để thu nhỏ trên khay hệ thống, xin vui lòng kiểm tra để xem nếu nó vẫn đang chạy hay không."
@@ -292,6 +294,8 @@ AddProfile.Text="Vui lòng nhập tên cấu hình"
RenameProfile.Title="Đổi tên cấu hình"
+Basic.Main.MixerRename.Title="Đổi tên nguồn âm thanh"
+Basic.Main.MixerRename.Text="Hãy nhập tên nguồn âm thanh"
Basic.Main.PreviewDisabled="Xem trước hiện đang vô hiệu hoá"
@@ -383,6 +387,7 @@ Basic.Main.StoppingReplayBuffer="Đang dừng Replay Buffer..."
Basic.Main.StopStreaming="Ngừng Stream"
Basic.Main.StoppingStreaming="Đang dừng stream..."
Basic.Main.ForceStopStreaming="Ngừng Stream (huỷ chậm trễ)"
+Basic.Main.Group="Nhóm %1"
Basic.MainMenu.File="&Tập tin"
Basic.MainMenu.File.Export="&Xuất"
@@ -472,10 +477,6 @@ Basic.Settings.General.SysTrayWhenStarted="Thu nhỏ về khay hệ thống khi
Basic.Settings.General.SystemTrayHideMinimize="Luôn luôn thu nhỏ về khay hệ thống thay vì thanh tác vụ"
Basic.Settings.General.StudioPortraitLayout="Bật bố cục theo chiều ngang/dọc"
Basic.Settings.General.MultiviewLayout="Giao diện nhiều lớp"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Ngang, Trên"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Ngang, Dưới"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Dọc, Trái"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Dọc, Phải"
Basic.Settings.Stream="Stream"
Basic.Settings.Stream.StreamType="Kiểu Stream"
@@ -697,3 +698,8 @@ OutputWarnings.MP4Recording="Chú ý: các bản ghi âm được lưu ở dạn
FinalScene.Title="Xóa cảnh"
FinalScene.Text="Cần có ít nhất một cảnh."
+
+ChangeBG="Thiết lập màu sắc"
+CustomColor="Tùy chỉnh màu sắc"
+
+
diff --git a/UI/data/locale/zh-CN.ini b/UI/data/locale/zh-CN.ini
index 87fb75130..86fb2460d 100644
--- a/UI/data/locale/zh-CN.ini
+++ b/UI/data/locale/zh-CN.ini
@@ -28,11 +28,11 @@ Browse="浏览"
Mono="单声道"
Stereo="立体声"
DroppedFrames="丢帧 %1 (%2%)"
-StudioProgramProjector="全屏投影仪(程序)"
+StudioProgramProjector="全屏投影仪(输出)"
PreviewProjector="全屏投影仪(预览)"
SceneProjector="全屏投影仪 (现场)"
SourceProjector="全屏投影仪(源)"
-StudioProgramWindow="窗口式投影仪 (程序)"
+StudioProgramWindow="窗口式投影仪 (输出)"
PreviewWindow="窗口化投影仪 (预览)"
SceneWindow="窗口化投影仪 (场景)"
SourceWindow="窗口化投影仪 (源)"
@@ -49,7 +49,7 @@ Duplicate="复制(&D)"
Enable="启用"
DisableOSXVSync="禁用 OSX V-Sync"
ResetOSXVSyncOnExit="退出时重置 OSX V-Sync"
-HighResourceUsage="编码过载! 考虑下调低视频设置或使用更快的编码预设."
+HighResourceUsage="编码过载! 请考虑降低视频设置或使用更快的编码预设"
Transition="过渡动画"
QuickTransitions="快速过渡动画"
Left="左"
@@ -61,7 +61,7 @@ Hours="小时"
Minutes="分钟"
Seconds="秒"
Deprecated="不推荐使用"
-ReplayBuffer="重拨缓存"
+ReplayBuffer="回放缓存"
Import="导入"
Export="导出"
Copy="复制"
@@ -76,15 +76,17 @@ HideMixer="混合器中隐藏"
TransitionOverride="过渡覆盖模式"
None="无"
StudioMode.Preview="预览"
-StudioMode.Program="程序"
+StudioMode.Program="输出"
ShowInMultiview="多屏中显示"
+VerticalLayout="垂直布局"
+Group="分组"
AlreadyRunning.Title="OBS 已在运行"
AlreadyRunning.Text="OBS 已经在运行! 除非你想要这样做, 请在你运行一个新的 OBS 前, 关闭任何已经在运行的 OBS. 如果你有一个 OBS 设置最小化到系统托盘, 请检查他是否仍在运行."
-AlreadyRunning.LaunchAnyway="无论如何启动"
+AlreadyRunning.LaunchAnyway="始终启动"
-Copy.Filters="复制筛选器"
-Paste.Filters="粘贴筛选器"
+Copy.Filters="复制滤镜"
+Paste.Filters="粘贴滤镜"
BandwidthTest.Region="区域"
BandwidthTest.Region.US="美国"
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="正在停止回放缓存..."
Basic.Main.StopStreaming="停止推流"
Basic.Main.StoppingStreaming="停止推流..."
Basic.Main.ForceStopStreaming="停止流 (放弃延迟)"
+Basic.Main.Group="分组 %1"
+Basic.Main.GroupItems="对所选项目进行分组"
+Basic.Main.Ungroup="取消分组"
Basic.MainMenu.File="文件(&F)"
Basic.MainMenu.File.Export="导出(&E)"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="工具 (&T)"
Basic.MainMenu.Help="帮助 (&H)"
Basic.MainMenu.Help.HelpPortal="帮助门户"
Basic.MainMenu.Help.Website="访问OBS主页 (&W)"
+Basic.MainMenu.Help.Discord="加入 &Discord 服务器"
Basic.MainMenu.Help.Logs="日志文件 (&L)"
Basic.MainMenu.Help.Logs.ShowLogs="显示日志文件 (&S)"
Basic.MainMenu.Help.Logs.UploadCurrentLog="上传当前日志文件 (&C)"
Basic.MainMenu.Help.Logs.UploadLastLog="上传最后一个日志文件 (&L)"
Basic.MainMenu.Help.Logs.ViewCurrentLog="查看当前日志 (&V)"
Basic.MainMenu.Help.CheckForUpdates="检查升级(&C)"
+Basic.MainMenu.Help.CrashLogs="错误报告(&R)"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="查看错误报告(&S)"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="上传上一次错误报告(&L)"
Basic.Settings.ProgramRestart="要使这些设置生效,必须重新启动该程序。"
Basic.Settings.ConfirmTitle="确认更改"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="总是最小化到系统托盘,
Basic.Settings.General.SaveProjectors="退出时保存投影仪"
Basic.Settings.General.SwitchOnDoubleClick="双击时切换到场景"
Basic.Settings.General.StudioPortraitLayout="启用纵向布局"
+Basic.Settings.General.Multiview="多视图"
+Basic.Settings.General.Multiview.MouseSwitch="点击切换场景"
+Basic.Settings.General.Multiview.DrawSourceNames="显示场景名"
+Basic.Settings.General.Multiview.DrawSafeAreas="显示安全区域(EBU R 95)"
Basic.Settings.General.MultiviewLayout="多视图布局"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="水平、顶部"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="水平、底部"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="垂直, 左侧"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="垂直, 右侧"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="水平, 顶部(8 场景)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="水平, 底部(8 场景)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="垂直, 左侧(8 场景)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="垂直, 右侧(8 场景)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="水平, 顶部(24 场景)"
Basic.Settings.Stream="流"
Basic.Settings.Stream.StreamType="流类型"
@@ -631,6 +645,13 @@ Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos(削尖缩放, 32个样本)
Basic.Settings.Audio="音频"
Basic.Settings.Audio.SampleRate="采样率"
Basic.Settings.Audio.Channels="声道"
+Basic.Settings.Audio.MeterDecayRate="音频表衰减率"
+Basic.Settings.Audio.MeterDecayRate.Fast="快速"
+Basic.Settings.Audio.MeterDecayRate.Medium="中速(峰值电平表I型)"
+Basic.Settings.Audio.MeterDecayRate.Slow="慢速(峰值电平表II型)"
+Basic.Settings.Audio.PeakMeterType="峰值计类型"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="采样峰值"
+Basic.Settings.Audio.PeakMeterType.TruePeak="真峰值 (更高的的 CPU 使用率)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="警告: 已启用环绕声音频。"
Basic.Settings.Audio.MultichannelWarning="如果串流, 请检查串流服务是否支持环绕立体声接收和环绕立体声播放。 Twitch, Facebook 360 Live, Mixer RTMP, Smashcast 是充分支持环绕立体声的例子。 虽然 Facebook Live 和 Youtube Live 都支持环绕立体声接收, 但是Facebook Live 降低混合至立体声, 而 Youtube Live 则只播放两个声道。\n\nOBS 音频过滤器与环绕立体声兼容, 但 VST 插件支持无法保证。"
Basic.Settings.Audio.MultichannelWarning.Title="是否启用环绕立体声?"
@@ -671,6 +692,7 @@ Basic.Settings.Advanced.Network="网络"
Basic.Settings.Advanced.Network.BindToIP="绑定 IP"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="启用新的网络代码"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="低延迟模式"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="当主窗口获得焦点时禁用热键"
Basic.AdvAudio="高级音频属性"
Basic.AdvAudio.Name="名称"
@@ -678,10 +700,10 @@ Basic.AdvAudio.Volume="音量 (%)"
Basic.AdvAudio.Mono="下降混合为单声道"
Basic.AdvAudio.Panning="平移"
Basic.AdvAudio.SyncOffset="同步偏移 (毫秒)"
-Basic.AdvAudio.Monitoring="音频监测"
+Basic.AdvAudio.Monitoring="音频监听"
Basic.AdvAudio.Monitoring.None="关闭监视"
Basic.AdvAudio.Monitoring.MonitorOnly="仅显示器(静音输出)"
-Basic.AdvAudio.Monitoring.Both="监视器和输出"
+Basic.AdvAudio.Monitoring.Both="监听并输出"
Basic.AdvAudio.AudioTracks="轨道"
Basic.Settings.Hotkeys="热键"
@@ -745,3 +767,12 @@ OutputWarnings.MP4Recording="警告︰ 录制保存到 MP4 将无法恢复,如
FinalScene.Title="删除场景"
FinalScene.Text="至少要有一个场景."
+NoSources.Title="无来源"
+NoSources.Text="看起来您未添加任何视频源,所以我们将只会输出黑色萤幕。确实要这样做吗?"
+NoSources.Text.AddSource="您可以通过单击主窗口中“来源”框下的“+”图标以添加来源。"
+
+ChangeBG="设置颜色"
+CustomColor="自定义颜色"
+
+BrowserSource.EnableHardwareAcceleration="启用浏览器源硬件加速"
+
diff --git a/UI/data/locale/zh-TW.ini b/UI/data/locale/zh-TW.ini
index 3e0643752..bc2a21572 100644
--- a/UI/data/locale/zh-TW.ini
+++ b/UI/data/locale/zh-TW.ini
@@ -78,6 +78,8 @@ None="無"
StudioMode.Preview="預覽"
StudioMode.Program="程式"
ShowInMultiview="在多視圖中顯示"
+VerticalLayout="垂直排版"
+Group="群組"
AlreadyRunning.Title="OBS 已在執行中"
AlreadyRunning.Text="OBS 已在執行中!除非這是您的意圖,請在執行新的 OBS 前關閉現存的 OBS 。如果有設定 OBS 最小化到系統工具列,請確認是否仍在該處執行。"
@@ -405,6 +407,9 @@ Basic.Main.StoppingReplayBuffer="正在停止重播緩衝..."
Basic.Main.StopStreaming="停止串流"
Basic.Main.StoppingStreaming="停止串流..."
Basic.Main.ForceStopStreaming="停止實況(丟棄延遲)"
+Basic.Main.Group="群組 %1"
+Basic.Main.GroupItems="群組選取的項目"
+Basic.Main.Ungroup="取消群組"
Basic.MainMenu.File="檔案 (&F)"
Basic.MainMenu.File.Export="匯出 (&E)"
@@ -471,12 +476,16 @@ Basic.MainMenu.Tools="工具(&T)"
Basic.MainMenu.Help="說明 (&H)"
Basic.MainMenu.Help.HelpPortal="幫助和門戶"
Basic.MainMenu.Help.Website="前往 OBS 網站 (&W)"
+Basic.MainMenu.Help.Discord="加入 &Discord 伺服器"
Basic.MainMenu.Help.Logs="Log 檔案 (&L)"
Basic.MainMenu.Help.Logs.ShowLogs="顯示 Log (&S)"
Basic.MainMenu.Help.Logs.UploadCurrentLog="上傳目前 Log 檔 (&C)"
Basic.MainMenu.Help.Logs.UploadLastLog="上傳上次的 Log 檔 (&L)"
Basic.MainMenu.Help.Logs.ViewCurrentLog="顯示當前紀錄檔 (&V)"
Basic.MainMenu.Help.CheckForUpdates="檢查更新"
+Basic.MainMenu.Help.CrashLogs="錯誤報告"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="顯示當機回報(&S)"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="上傳最新的錯誤回報(&L)"
Basic.Settings.ProgramRestart="為了套用新設定,請關閉後重啟。"
Basic.Settings.ConfirmTitle="確認修改"
@@ -507,11 +516,16 @@ Basic.Settings.General.SystemTrayHideMinimize="總是最小化到系統列,而
Basic.Settings.General.SaveProjectors="退出時保存投影設定"
Basic.Settings.General.SwitchOnDoubleClick="按兩下時切換到場景"
Basic.Settings.General.StudioPortraitLayout="啟用縱向/垂直佈局"
+Basic.Settings.General.Multiview="多顯示"
+Basic.Settings.General.Multiview.MouseSwitch="點擊以在場景之間切換"
+Basic.Settings.General.Multiview.DrawSourceNames="顯示場景名稱"
+Basic.Settings.General.Multiview.DrawSafeAreas="繪製安全區域 (EBU R 95)"
Basic.Settings.General.MultiviewLayout="多視圖佈局"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="水平, 上"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="水平, 下"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="垂直, 左"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="垂直, 右"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="橫排、頂部(八個場景)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="橫排、底部(八個場景)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="直行、靠左(八個場景)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="直行、靠右(八個場景)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="橫排、頂部(24 個場景)"
Basic.Settings.Stream="串流"
Basic.Settings.Stream.StreamType="串流類型"
@@ -631,6 +645,13 @@ Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos(縮放後最為銳利,
Basic.Settings.Audio="音效"
Basic.Settings.Audio.SampleRate="取樣頻率"
Basic.Settings.Audio.Channels="通道數"
+Basic.Settings.Audio.MeterDecayRate="音量計衰減速率"
+Basic.Settings.Audio.MeterDecayRate.Fast="快速"
+Basic.Settings.Audio.MeterDecayRate.Medium="中 (Type I PPM)"
+Basic.Settings.Audio.MeterDecayRate.Slow="慢 (Type II PPM)"
+Basic.Settings.Audio.PeakMeterType="峰值表類型"
+Basic.Settings.Audio.PeakMeterType.SamplePeak="範例峰值"
+Basic.Settings.Audio.PeakMeterType.TruePeak="真實峰值(較高的 CPU 用量)"
Basic.Settings.Audio.MultiChannelWarning.Enabled="警告: 已啟用環繞聲音訊。"
Basic.Settings.Audio.MultichannelWarning="如果是流媒體,請檢查您的流媒體服務是否同時支持環繞聲攝取和環繞聲播放。 Twitch,Facebook 360 Live,Mixer RTMP,Smashcast都是完全支持環繞聲的例子。 儘管Facebook Live和YouTube Live都接受環繞聲攝取,但是Facebook Live會混音為立體聲,而YouTube Live只播放兩個聲道。\n\n 儘管不支持VST插件,但OBS音頻濾波器與環繞聲兼容。"
Basic.Settings.Audio.MultichannelWarning.Title="是否啟用環繞聲音訊?"
@@ -671,6 +692,7 @@ Basic.Settings.Advanced.Network="網路"
Basic.Settings.Advanced.Network.BindToIP="綁定到 IP"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="啟用新的網路程式碼"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="低延遲模式"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="當主視窗處於焦點,則停用熱鍵"
Basic.AdvAudio="進階音訊屬性"
Basic.AdvAudio.Name="名稱"
@@ -745,3 +767,11 @@ OutputWarnings.MP4Recording="警告︰ 如果檔案無法完成,儲存成 MP4
FinalScene.Title="刪除場景"
FinalScene.Text="至少要有一個場景。"
+NoSources.Title="沒有來源"
+NoSources.Text="看起來您尚未增加任何視訊來源,所以我們只會輸出黑畫面。確定?"
+NoSources.Text.AddSource="您可以透過點一下主視窗「來源」框底下的 + 按鈕,隨時增加來源。"
+
+ChangeBG="設定顏色"
+CustomColor="自訂顏色"
+
+
diff --git a/UI/data/themes/Acri.qss b/UI/data/themes/Acri.qss
index af3eb9070..33c627802 100644
--- a/UI/data/themes/Acri.qss
+++ b/UI/data/themes/Acri.qss
@@ -1,3 +1,37 @@
+/* OBSTheme, main QApplication palette and QML values */
+OBSTheme {
+ window: #181819;
+ windowText: rgb(225,224,225);
+ base: rgb(18,18,21);
+ alternateBase: rgb(0,0,0);
+ text: rgb(225,224,225);
+ button: #162458;
+ buttonText: rgb(225,224,225);
+ brightText: #484848;
+
+ light: #162458;
+ mid: #181819;
+ dark: rgb(18,18,21);
+ shadow: rgb(0,0,0);
+
+ highlight: #252458;
+ highlightText: #FFFFFF;
+
+ link: #605ee6;
+ linkVisited: #605ee6;
+}
+
+OBSTheme::disabled {
+ text: #484848;
+ buttonText: #484848;
+ brightText: #484848;
+}
+
+OBSTheme::inactive {
+ highlight: rgb(48,47,48);
+ highlightText: rgb(255, 255, 255);
+}
+
/* General style, we override only what is needed. */
QWidget {
background-color: #181819;
@@ -9,6 +43,7 @@ QWidget {
font-family: "Open Sans", "Tahoma", "Arial", sans-serif;
font-size: 12px;
padding: 4px;
+ overflow: auto;
}
#menubar {
@@ -45,6 +80,14 @@ QWidget::disabled {
color: #484848;
}
+* [themeID="error"] {
+ color: #d91740;
+}
+
+* [themeID="warning"] {
+ color: #d9af17;
+}
+
/* Dropdown menus, Scenes box, Sources box */
QAbstractItemView {
background-color: #181819;
@@ -94,7 +137,8 @@ QMenuBar::item:selected {
}
/* Listbox item */
-QListWidget::item {
+QListWidget::item,
+SourceTree::item {
padding: 4px 2px;
margin-bottom: 2px;
margin-top: 0px;
@@ -110,11 +154,6 @@ QListWidget QLineEdit {
border-radius: none;
}
-SourceListWidget::item {
- margin-bottom: 1px;
- padding: -4px 2px;
-}
-
/* Dock stuff */
QDockWidget {
background: transparent;
@@ -157,6 +196,23 @@ SourceListWidget {
border-bottom: 2px solid #2f2f2f;
}
+SourceTree {
+ border: none;
+ border-bottom: 1px solid #2f2f2f;
+}
+
+SourceTree QLabel {
+ padding: 2px 0px;
+ margin: -2px 4px -2px;
+}
+
+SourceTree QLineEdit {
+ background-color: #0c101e;
+ padding: 2px;
+ margin: -2px 6px -2px 3px;
+ font-size: 12px;
+}
+
#scenesFrame,
#sourcesFrame {
margin-left: -7px;
@@ -179,13 +235,15 @@ SourceListWidget {
}
/* Listbox item selected, unfocused */
-QListWidget::item:hover {
+QListWidget::item:hover,
+SourceTree::item:hover {
background-color: #212121;
border: 1px solid #333336;
}
/* Listbox item selected */
-QListWidget::item:selected {
+QListWidget::item:selected,
+SourceTree::item:selected {
background-color: #131a30;
border: 1px solid #252a45;
}
@@ -225,7 +283,7 @@ QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical, QScrollBar::add-
QScrollBar:horizontal {
background-color: transparent;
- height: 10px;
+ height: 20px;
margin-left: -3px;
margin-right: -3px;
}
@@ -233,7 +291,7 @@ QScrollBar:horizontal {
QScrollBar::handle:horizontal {
background-color: #2f2f2f;
min-width: 20px;
- margin: 0px 0px -3px;
+ margin: 3px 0px;
border-radius: 0px;
border: none;
}
@@ -453,10 +511,12 @@ QPushButton {
QPushButton::flat {
background-color: rgb(24,24,25);
+ border: none;
}
QPushButton:checked {
- background-color: #202b52;
+ background-color: #581624;
+ border-color: #84162d;
}
QPushButton:hover {
@@ -468,6 +528,16 @@ QPushButton:pressed {
background-color: #161f41;
}
+QPushButton:disabled {
+ border: 1px solid #232426;
+ background-color: #1a1a1b;
+}
+
+QPushButton::flat:hover,
+QPushButton::flat:disabled {
+ border: none;
+}
+
/* Progress Bar */
QProgressBar {
@@ -505,16 +575,20 @@ QSlider::handle:horizontal {
}
QSlider::handle:horizontal:pressed {
- background-color: QLinearGradient(x1: 0, y1: 1, x2: 0, y2: 0,
+ background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 rgb(240,239,240),
stop: 0.25 rgb(200,199,200),
stop: 1 rgb(162,161,162));
}
+QSlider::sub-page:horizontal {
+ background-color: #2a3a75;
+}
+
QSlider::sub-page:horizontal:disabled {
- background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1,
- stop: 0 rgb(31,30,31),
- stop: 0.75 rgb(50, 49, 50));
+ background-color: QLinearGradient(x1: 0, y1: 1, x2: 0, y2: 0,
+ stop: 0 rgb(26,25,26),
+ stop: 0.75 rgb(10, 10, 10));
border-radius: 2px;
}
@@ -533,23 +607,27 @@ QSlider::handle:vertical {
stop: 0.25 rgb(200,199,200),
stop: 1 rgb(162,161,162));
border: 1px solid rgb(24,24,25);
- border-radius: 4px;
+ border-radius: 3px;
width: 10px;
height: 18px;
- margin: -3px 0; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */
+ margin: 0 -3px; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */
}
QSlider::handle:vertical:pressed {
- background-color: QLinearGradient(x1: 1, y1: 0, x2: 0, y2: 0,
+ background-color: QLinearGradient(x1: 0, y1: 0, x2: 1, y2: 0,
stop: 0 rgb(240,239,240),
stop: 0.25 rgb(200,199,200),
stop: 1 rgb(162,161,162));
}
-QSlider::sub-page:vertical:disabled {
+QSlider::add-page:vertical {
+ background-color: #2a3a75;
+}
+
+QSlider::add-page:vertical:disabled {
background-color: QLinearGradient(x1: 0, y1: 0, x2: 1, y2: 0,
- stop: 0 rgb(31,30,31),
- stop: 0.75 rgb(50, 49, 50));
+ stop: 0 rgb(26,25,26),
+ stop: 0.75 rgb(10, 10, 10));
border-radius: 2px;
}
@@ -557,15 +635,10 @@ QSlider::handle:hover {
background-color: rgb(200,199,200);
}
-QSlider::sub-page {
- background-color: #2a3a75;
-}
-
QSlider::handle:disabled {
background-color: rgb(15,15,16);
}
-
/* Volume Control */
/* Old Meters */
@@ -724,6 +797,30 @@ OBSHotkeyLabel[hotkeyPairHover=true] {
}
+/* Group Collapse Checkbox */
+
+SourceTreeSubItemCheckBox {
+ background: transparent;
+ outline: none;
+ padding: 0px;
+}
+
+SourceTreeSubItemCheckBox::indicator {
+ width: 12px;
+ height: 12px;
+}
+
+SourceTreeSubItemCheckBox::indicator:checked,
+SourceTreeSubItemCheckBox::indicator:checked:hover {
+ image: url(./Dark/expand.png);
+}
+
+SourceTreeSubItemCheckBox::indicator:unchecked,
+SourceTreeSubItemCheckBox::indicator:unchecked:hover {
+ image: url(./Dark/collapse.png);
+}
+
+
/* Label warning/error */
QLabel#warningLabel {
@@ -750,21 +847,10 @@ OBSBasicProperties,
background: #101010;
}
-#OBSBasicSourceSelect #sourceList {
- border-bottom: 2px solid #333336;
-}
-
FocusList::item {
padding: 0px 2px;
}
-#transitionsContainer QPushButton,
-#mixerDock QPushButton,
-#effectWidget QPushButton,
-#asyncWidget QPushButton {
- border: none;
-}
-
#fpsTypes {
padding: 0px;
}
@@ -774,3 +860,29 @@ FocusList::item {
background: transparent;
min-height: 26px;
}
+
+/* About dialog */
+
+* [themeID="aboutName"] {
+ font-size: 36px;
+ font-weight: bold;
+}
+
+* [themeID="aboutVersion"] {
+ font-size: 16px;
+ margin-bottom: 20px;
+}
+
+* [themeID="aboutInfo"] {
+ margin-bottom: 20px;
+}
+
+* [themeID="aboutHLayout"] {
+ background-color: rgb(8, 8, 11);
+}
+
+/* Preview background color */
+
+* [themeID="displayBackgroundColor"] {
+ qproperty-displayBackgroundColor: #28282A;
+}
diff --git a/UI/data/themes/Acri/cogwheel@2x.png b/UI/data/themes/Acri/cogwheel@2x.png
new file mode 100644
index 000000000..49c4070a7
Binary files /dev/null and b/UI/data/themes/Acri/cogwheel@2x.png differ
diff --git a/UI/data/themes/Dark.qss b/UI/data/themes/Dark.qss
index 4a9326c6a..7014ff340 100644
--- a/UI/data/themes/Dark.qss
+++ b/UI/data/themes/Dark.qss
@@ -28,6 +28,44 @@
/* rgb(42,130,218); /* blue */
+/* Custom theme information. This will set the application's QPalette, as
+ * well as pass to QML via the OBSTheme object.
+ * Can also use OBSTheme::disabled, OBSTheme::active, and OBSTheme::inactive.
+ * Using it without will set all three (making 'active' a bit redundant) */
+OBSTheme {
+ window: rgb(58,57,58); /* dark */
+ windowText: rgb(225,224,225); /* veryLight */
+ base: rgb(31,30,31); /* veryDark */
+ alternateBase: rgb(11,10,11); /* veryVeryDark */
+ text: rgb(225,224,225); /* veryLight */
+ button: rgb(88,87,88); /* kindaDark */
+ buttonText: rgb(225,224,225); /* veryLight */
+ brightText: rgb(200,199,200); /* lighter */
+
+ light: rgb(88,87,88); /* kindaDark */
+ mid: rgb(58,57,58); /* dark */
+ dark: rgb(31,30,31); /* veryDark */
+ shadow: rgb(11,10,11); /* veryVeryDark */
+
+ highlight: rgb(42,130,218); /* blue */
+ highlightText: rgb(0,0,0);
+
+ link: rgb(114, 162, 255); /* OBS blue */
+ linkVisited: rgb(114, 162, 255); /* OBS blue */
+}
+
+OBSTheme::disabled {
+ text: rgb(122,121,122); /* light */
+ buttonText: rgb(122,121,122); /* light */
+ brightText: rgb(122,121,122); /* light */
+}
+
+OBSTheme::inactive {
+ highlight: rgb(48,47,48);
+ highlightText: rgb(255, 255, 255);
+}
+
+
/* General style, we override only what is needed. */
QWidget {
background-color: rgb(58,57,58); /* dark */
@@ -48,7 +86,7 @@ QWidget::disabled {
color: 2px solid rgb(200,199,200); /* lighter */
}
-QAbstractItemView {
+QAbstractItemView, QStackedWidget#stackedMixerArea QWidget {
background-color: rgb(31,30,31); /* veryDark */
}
@@ -110,11 +148,9 @@ QGroupBox {
}
QScrollBar:vertical {
- background-color: QLinearGradient(x1: 0, y1: 0, x2: 1, y2: 0,
- stop: 0 rgb(31,30,31), /* veryDark */
- stop: 0.75 rgb(54, 53, 54),
- stop: 1 rgb(58,57,58)); /* dark */
+ background-color: rgb(58,57,58); /* dark */
width: 14px;
+ margin: 0px;
}
QScrollBar::handle:vertical {
@@ -141,11 +177,9 @@ QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical, QScrollBar::add-
}
QScrollBar:horizontal {
- background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1,
- stop: 0 rgb(31,30,31), /* veryDark */
- stop: 0.75 rgb(54, 53, 54),
- stop: 1 rgb(58,57,58)); /* dark */
+ background-color: rgb(58,57,58); /* dark */
height: 14px;
+ margin: 0px;
}
QScrollBar::handle:horizontal {
@@ -281,6 +315,13 @@ QComboBox {
padding-left: 10px;
}
+QComboBox:hover {
+ background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1,
+ stop: 0 rgb(111, 110, 101),
+ stop: 0.25 rgb(100, 99, 100),
+ stop: 1 rgb(88,87,88));
+}
+
QComboBox::drop-down {
border:none;
border-left: 1px solid rgba(31,30,31,155); /* veryDark */
@@ -319,7 +360,12 @@ QComboBox::down-arrow:editable {
QLineEdit, QTextEdit, QPlainTextEdit {
background-color: rgb(31,30,31); /* veryDark */
border: none;
- padding-left: 2px;
+ border-radius: 3px;
+ padding: 2px 2px 3px 7px;
+}
+
+OBSHotkeyWidget QLineEdit {
+ margin: 0px 3px 0px 0px;
}
@@ -328,9 +374,9 @@ QLineEdit, QTextEdit, QPlainTextEdit {
QSpinBox, QDoubleSpinBox {
background-color: rgb(31,30,31); /* veryDark */
border: none;
- padding-left: 2px;
- padding-right: 15px;
- margin-right: 10px;
+ border-radius: 3px;
+ margin: 0px 3px 0px 0px;
+ padding: 2px 2px 3px 7px;
}
QSpinBox::up-button, QDoubleSpinBox::up-button {
@@ -420,12 +466,16 @@ QPushButton::menu-indicator {
width: 25px;
}
+QPushButton[themeID="hotkeyButtons"] {
+ margin: 1px 2px;
+}
+
/* Sliders */
QSlider::groove:horizontal {
- background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1,
- stop: 0 rgb(31,30,31), /* veryDark */
- stop: 0.75 rgb(50, 49, 50));
+ background-color: QLinearGradient(x1: 0, y1: 1, x2: 0, y2: 0,
+ stop: 0 rgb(50, 49, 50), /* dark */
+ stop: 0.75 rgb(88,87,88)); /* kindaDark */
height: 4px;
border: none;
border-radius: 2px;
@@ -450,32 +500,37 @@ QSlider::handle:horizontal:pressed {
stop: 1 rgb(162,161,162)); /* light */
}
+QSlider::sub-page:horizontal {
+ background-color: rgb(42,130,218); /* blue */
+ border-radius: 2px;
+}
+
QSlider::sub-page:horizontal:disabled {
- background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1,
+ background-color: QLinearGradient(x1: 0, y1: 1, x2: 0, y2: 0,
stop: 0 rgb(31,30,31), /* veryDark */
- stop: 0.75 rgb(50, 49, 50));
+ stop: 0.75 rgb(50, 49, 50)); /* dark */
border-radius: 2px;
}
QSlider::groove:vertical {
- background-color: QLinearGradient(x1: 0, y1: 0, x2: 1, y2: 0,
- stop: 0 rgb(31,30,31), /* veryDark */
- stop: 0.75 rgb(50, 49, 50));
+ background-color: QLinearGradient(x1: 1, y1: 0, x2: 0, y2: 0,
+ stop: 0 rgb(50, 49, 50), /* dark */
+ stop: 0.75 rgb(88,87,88)); /* kindaDark */
width: 4px;
border: none;
border-radius: 2px;
}
QSlider::handle:vertical {
- background-color: QLinearGradient(x1: 0, y1: 0, x2: 1, y2: 0,
+ background-color: QLinearGradient(x1: 1, y1: 0, x2: 0, y2: 0,
stop: 0 rgb(240,239,240), /* lighter */
stop: 0.25 rgb(200,199,200),
stop: 1 rgb(162,161,162)); /* light */
border: 1px solid rgb(58,57,58); /* dark */
- border-radius: 4px;
+ border-radius: 3px;
width: 10px;
height: 18px;
- margin: -3px 0; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */
+ margin: 0 -3px; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */
}
QSlider::handle:vertical:pressed {
@@ -485,10 +540,15 @@ QSlider::handle:vertical:pressed {
stop: 1 rgb(162,161,162)); /* light */
}
-QSlider::sub-page:vertical:disabled {
- background-color: QLinearGradient(x1: 0, y1: 0, x2: 1, y2: 0,
+QSlider::add-page:vertical {
+ background-color: rgb(42,130,218); /* blue */
+ border-radius: 2px;
+}
+
+QSlider::add-page:vertical:disabled {
+ background-color: QLinearGradient(x1: 1, y1: 0, x2: 0, y2: 0,
stop: 0 rgb(31,30,31), /* veryDark */
- stop: 0.75 rgb(50, 49, 50));
+ stop: 0.75 rgb(50, 49, 50)); /* dark */
border-radius: 2px;
}
@@ -496,16 +556,10 @@ QSlider::handle:hover {
background-color: rgb(200,199,200); /* veryLight */
}
-QSlider::sub-page {
- background-color: rgb(42,130,218); /* blue */
- border-radius: 2px;
-}
-
QSlider::handle:disabled {
background-color: rgb(122,121,122); /* light */
}
-
/* Volume Control */
VolumeMeter {
@@ -527,6 +581,18 @@ QStatusBar::item {
border: none;
}
+/* Table View */
+
+QTableView {
+ gridline-color: rgb(88,87,88); /* kindaDark */
+}
+
+QHeaderView::section {
+ background-color: rgb(58,57,58); /* dark */
+ color: rgb(225,224,225); /* veryLight */
+ border: 1px solid rgb(31,30,31); /* veryDark */;
+ border-radius: 5px;
+}
/* Mute CheckBox */
@@ -547,6 +613,27 @@ OBSHotkeyLabel[hotkeyPairHover=true] {
}
+/* Group Collapse Checkbox */
+
+SourceTreeSubItemCheckBox {
+ background: transparent;
+ outline: none;
+}
+
+SourceTreeSubItemCheckBox::indicator {
+ width: 10px;
+ height: 10px;
+}
+
+SourceTreeSubItemCheckBox::indicator:checked {
+ image: url(./Dark/expand.png);
+}
+
+SourceTreeSubItemCheckBox::indicator:unchecked {
+ image: url(./Dark/collapse.png);
+}
+
+
/* Label warning/error */
QLabel#warningLabel {
@@ -573,3 +660,29 @@ QLabel#errorLabel {
color: rgb(0, 192, 0);
font-weight: bold;
}
+
+/* About dialog */
+
+* [themeID="aboutName"] {
+ font-size: 36px;
+ font-weight: bold;
+}
+
+* [themeID="aboutVersion"] {
+ font-size: 16px;
+ margin-bottom: 20px;
+}
+
+* [themeID="aboutInfo"] {
+ margin-bottom: 20px;
+}
+
+* [themeID="aboutHLayout"] {
+ background-color: rgb(31, 30, 31); /* veryDark */
+}
+
+/* Preview background color */
+
+* [themeID="displayBackgroundColor"] {
+ qproperty-displayBackgroundColor: rgb(76, 76, 76);
+}
diff --git a/UI/data/themes/Dark/cogwheel@2x.png b/UI/data/themes/Dark/cogwheel@2x.png
new file mode 100644
index 000000000..49c4070a7
Binary files /dev/null and b/UI/data/themes/Dark/cogwheel@2x.png differ
diff --git a/UI/data/themes/Dark/collapse.png b/UI/data/themes/Dark/collapse.png
new file mode 100644
index 000000000..1fd72a116
Binary files /dev/null and b/UI/data/themes/Dark/collapse.png differ
diff --git a/UI/data/themes/Dark/expand.png b/UI/data/themes/Dark/expand.png
new file mode 100644
index 000000000..dd5d2b5ec
Binary files /dev/null and b/UI/data/themes/Dark/expand.png differ
diff --git a/UI/data/themes/Default.qss b/UI/data/themes/Default.qss
index 0b88dd451..c5a010ab5 100644
--- a/UI/data/themes/Default.qss
+++ b/UI/data/themes/Default.qss
@@ -51,6 +51,24 @@ MuteCheckBox::indicator:unchecked {
image: url(:/res/images/unmute.png);
}
+SourceTreeSubItemCheckBox {
+ background: transparent;
+ outline: none;
+}
+
+SourceTreeSubItemCheckBox::indicator {
+ width: 10px;
+ height: 10px;
+}
+
+SourceTreeSubItemCheckBox::indicator:checked {
+ image: url(:/res/images/expand.png);
+}
+
+SourceTreeSubItemCheckBox::indicator:unchecked {
+ image: url(:/res/images/collapse.png);
+}
+
OBSHotkeyLabel[hotkeyPairHover=true] {
color: red;
}
@@ -97,3 +115,29 @@ QLabel#errorLabel {
color: rgb(0, 128, 0);
font-weight: bold;
}
+
+/* About dialog */
+
+* [themeID="aboutName"] {
+ font-size: 36px;
+ font-weight: bold;
+}
+
+* [themeID="aboutVersion"] {
+ font-size: 16px;
+ margin-bottom: 20px;
+}
+
+* [themeID="aboutInfo"] {
+ margin-bottom: 20px;
+}
+
+* [themeID="aboutHLayout"] {
+ background-color: #DCD9D7;
+}
+
+/* Preview background color */
+
+* [themeID="displayBackgroundColor"] {
+ qproperty-displayBackgroundColor: rgb(76, 76, 76);
+}
diff --git a/UI/data/themes/Rachni.qss b/UI/data/themes/Rachni.qss
index 5c7887cdb..62be5decb 100644
--- a/UI/data/themes/Rachni.qss
+++ b/UI/data/themes/Rachni.qss
@@ -40,6 +40,76 @@
/***************************************************************************/
+/************************/
+/* ---- Main Theme ---- */
+/************************/
+
+OBSTheme {
+ window: rgb(49, 54, 59); /* Blue-gray */
+ windowText: rgb(239, 240, 241); /* White */
+ base: rgb(0, 139, 163); /* Dark Cyan (Primary Dark) */
+ alternateBase: rgb(186, 45, 101); /* Dark Pink (Secondary Dark) */
+ text: rgb(239, 240, 241); /* White */
+ button: rgb(0, 188, 212); /* Cyan (Primary) */
+ buttonText: rgb(239, 240, 241); /* White */
+ brightText: rgb(255, 148, 194); /* Light Pink (Secondary Light) */
+
+ light: rgb(162, 161, 162); /* Lighter Gray */
+ mid: rgb(118, 121, 124); /* Light Grey */
+ dark: rgb(84, 87, 91); /* Gray */
+ shadow: rgb(35, 38, 41); /* Dark Gray */
+
+ highlight: rgb(98, 238, 255); /* Light Cyan (Primary Light) */
+ highlightText: rgb(0,0,0);
+
+ link: rgb(98, 238, 255); /* Light Cyan (Primary Light) */
+ linkVisited: rgb(98, 238, 255); /* Light Cyan (Primary Light) */
+}
+
+OBSTheme::disabled {
+ text: rgb(118, 121, 124); /* Light Gray */
+ buttonText: rgb(118, 121, 124); /* Light Gray */
+ brightText: rgb(118, 121, 124); /* Light Gray */
+}
+
+OBSTheme::inactive {
+ highlight: rgb(0, 188, 212); /* Cyan (Primary) */
+ highlightText: rgb(239, 240, 241); /* White */
+}
+
+
+/************************/
+/* ---- SourceTree ---- */
+/************************/
+
+SourceTree::item:selected:!active {
+ color: rgb(239, 240, 241); /* White */
+ background-color: rgba(255, 148, 194, 0.25); /* Light Pink (Secondary Light) */
+ border: none;
+}
+
+SourceTree::item:selected {
+ background-color: rgba(240, 98, 146, 0.5); /* Pink (Secondary) */
+ border: none;
+}
+
+SourceTree::item:hover,
+SourceTree::item:disabled:hover,
+SourceTree::item:hover:!active {
+ background-color: rgb(0, 188, 212); /* Cyan (Primary) */
+ color: rgb(239, 240, 241); /* White */
+ border: none;
+}
+
+SourceTree QLineEdit {
+ padding-top: 0;
+ padding-bottom: 0;
+ padding-right: 0;
+ padding-left: 2px;
+ border: none;
+ border-radius: none;
+}
+
/*************************/
/* --- General style --- */
/*************************/
@@ -535,16 +605,6 @@ QLineEdit {
color: rgb(239, 240, 241); /* White */
}
-QListWidget QLineEdit {
- padding-top: 0;
- padding-bottom: 0;
- padding-right: 0;
- padding-left: 2px;
- border: none;
- border-radius: none;
-}
-
-
/**********************/
/* --- Checkboxes --- */
/**********************/
@@ -701,6 +761,30 @@ MuteCheckBox::indicator:unchecked:disabled {
image: url(./Dark/unmute.png);
}
+/****************************/
+/* --- Group Checkboxes --- */
+/****************************/
+
+SourceTreeSubItemCheckBox {
+ background: transparent;
+ outline: none;
+}
+
+SourceTreeSubItemCheckBox::indicator {
+ width: 10px;
+ height: 10px;
+}
+
+SourceTreeSubItemCheckBox::indicator:checked,
+SourceTreeSubItemCheckBox::indicator:checked:hover {
+ image: url(./Dark/expand.png);
+}
+
+SourceTreeSubItemCheckBox::indicator:unchecked,
+SourceTreeSubItemCheckBox::indicator:unchecked:hover {
+ image: url(./Dark/collapse.png);
+}
+
/*************************/
/* --- Progress bars --- */
/*************************/
@@ -775,10 +859,10 @@ QPushButton:disabled {
}
QPushButton::menu-indicator {
- image: url(./Rachni/down_arrow.png);
- subcontrol-position: right;
- subcontrol-origin: padding;
- width: 25px;
+ image: url(./Rachni/down_arrow.png);
+ subcontrol-position: right;
+ subcontrol-origin: padding;
+ width: 25px;
}
/******************************/
@@ -1022,25 +1106,80 @@ QSlider::handle:horizontal:pressed {
stop: 1 rgb(162, 161, 162));
}
+QSlider::sub-page:horizontal {
+ background-color: rgb(0, 188, 212); /* Cyan (Primary) */
+ border-radius: 2px;
+}
+
QSlider::sub-page:horizontal:disabled {
background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 rgb(35, 38, 41), /* Dark Gray */
+ stop: 0.75 rgb(35, 38, 41)); /* Dark Gray */
+ border-radius: 2px;
+}
+
+QSlider::groove:vertical {
+ background-color: QLinearGradient(x1: 1, y1: 0, x2: 0, y2: 0,
+ stop: 0 rgb(35, 38, 41), /* Dark Gray */
stop: 0.75 rgb(50, 49, 50));
+ width: 4px;
+ border: none;
border-radius: 2px;
}
-QSlider::handle:hover {
- background-color: rgb(200, 199, 200);
+QSlider::handle:vertical {
+ background-color: QLinearGradient(x1: 1, y1: 0, x2: 0, y2: 0,
+ stop: 0 rgb(240, 239, 240),
+ stop: 0.25 rgb(200, 199, 200),
+ stop: 1 rgb(162, 161, 162));
+ border: 1px solid rgb(58, 57, 58);
+ border-radius: 3px;
+ width: 10px;
+ height: 18px;
+ margin: 0 -3px;
}
-QSlider::sub-page {
+QSlider::handle:vertical:pressed {
+ background-color: QLinearGradient(x1: 1, y1: 0, x2: 0, y2: 0,
+ stop: 0 rgb(240, 239, 240),
+ stop: 0.25 rgb(200, 199, 200),
+ stop: 1 rgb(162, 161, 162));
+}
+
+QSlider::add-page:vertical {
background-color: rgb(0, 188, 212); /* Cyan (Primary) */
border-radius: 2px;
}
+QSlider::add-page:vertical:disabled {
+ background-color: QLinearGradient(x1: 1, y1: 0, x2: 0, y2: 0,
+ stop: 0 rgb(35, 38, 41), /* Dark Gray */
+ stop: 0.75 rgb(35, 38, 41)); /* Dark Gray */
+ border-radius: 2px;
+}
+
+QSlider::handle:hover {
+ background-color: rgb(200, 199, 200);
+}
+
QSlider::handle:disabled {
background-color: rgb(122, 121, 122);
}
+/**********************/
+/* --- Table View --- */
+/**********************/
+
+QTableView {
+ gridline-color: rgb(118, 121, 124); /* Light Gray */
+}
+
+QHeaderView::section {
+ background-color: rgb(35, 38, 41); /* Dark Gray */
+ color: rgb(239, 240, 241); /* "White" */
+ border: 1px solid rgb(118, 121, 124); /* Light Gray */
+ border-radius: 2px;
+ padding: 4px;
+}
/****************/
/* --- Misc --- */
@@ -1067,8 +1206,15 @@ QFrame[frameShape="0"] {
border: 1px transparent;
}
-
/* Misc style tweaks for dark themes */
+* [themeID="error"] {
+ color: rgb(255, 89, 76); /* Red Error */
+}
+
+* [themeID="warning"] {
+ color: rgb(255, 148, 194); /* Light Pink (Secondary Light) */
+}
+
QStatusBar::item {
border: none;
}
@@ -1082,3 +1228,29 @@ QToolTip {
background-color: rgb(49, 54, 59); /* Blue-gray */
color: rgb(240, 98, 146); /* Pink (Secondary) */
}
+
+/* About dialog */
+
+* [themeID="aboutName"] {
+ font-size: 36px;
+ font-weight: bold;
+}
+
+* [themeID="aboutVersion"] {
+ font-size: 16px;
+ margin-bottom: 20px;
+}
+
+* [themeID="aboutInfo"] {
+ margin-bottom: 20px;
+}
+
+* [themeID="aboutHLayout"] {
+ background-color: rgb(35, 38, 41); /* Dark Gray */
+}
+
+/* Preview background color */
+
+* [themeID="displayBackgroundColor"] {
+ qproperty-displayBackgroundColor: rgb(35, 38, 41);
+}
diff --git a/UI/expand-checkbox.hpp b/UI/expand-checkbox.hpp
new file mode 100644
index 000000000..375a4ce55
--- /dev/null
+++ b/UI/expand-checkbox.hpp
@@ -0,0 +1,5 @@
+#include
+
+class ExpandCheckBox : public QCheckBox {
+ Q_OBJECT
+};
diff --git a/UI/forms/ColorSelect.ui b/UI/forms/ColorSelect.ui
new file mode 100644
index 000000000..b07e1f968
--- /dev/null
+++ b/UI/forms/ColorSelect.ui
@@ -0,0 +1,265 @@
+
+
+ ColorSelect
+
+
+
+ 0
+ 0
+ 98
+ 61
+
+
+
+
+ 0
+ 0
+
+
+
+ Form
+
+
+ QPushButton {
+ border: 1px solid black;
+}
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 16
+ 16
+
+
+
+
+ 16
+ 16
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16
+ 16
+
+
+
+
+ 16
+ 16
+
+
+
+
+
+
+ 2
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16
+ 16
+
+
+
+
+ 16
+ 16
+
+
+
+
+
+
+ 3
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16
+ 16
+
+
+
+
+ 16
+ 16
+
+
+
+
+
+
+ 4
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16
+ 16
+
+
+
+
+ 16
+ 16
+
+
+
+
+
+
+ 5
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16
+ 16
+
+
+
+
+ 16
+ 16
+
+
+
+
+
+
+ 6
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16
+ 16
+
+
+
+
+ 16
+ 16
+
+
+
+
+
+
+ 7
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16
+ 16
+
+
+
+
+ 16
+ 16
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UI/forms/OBSAbout.ui b/UI/forms/OBSAbout.ui
new file mode 100644
index 000000000..53ac93b32
--- /dev/null
+++ b/UI/forms/OBSAbout.ui
@@ -0,0 +1,166 @@
+
+
+ OBSAbout
+
+
+
+ 0
+ 0
+ 792
+ 389
+
+
+
+ About
+
+
+
+
+ 30
+ 30
+ 261
+ 261
+
+
+
+
+
+
+ :res/images/ebs.png
+
+
+
+
+
+ 320
+ 30
+ 441
+ 261
+
+
+
+
+ 0
+
+ -
+
+
+ OBS Studio
+
+
+
+ -
+
+
+ Version
+
+
+
+ -
+
+
+ About.Info
+
+
+ true
+
+
+
+ -
+
+
+ Contribute
+
+
+ true
+
+
+
+ -
+
+
+ Donate
+
+
+
+ -
+
+
+ Get Involved
+
+
+
+ -
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+
+
+
+ 0
+ 320
+ 791
+ 71
+
+
+
+
+ 0
+
+ -
+
+
+ About
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ Authors
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ License
+
+
+ Qt::AlignCenter
+
+
+
+
+
+
+
+
+ ClickableLabel
+ QLabel
+
+
+
+
+
+
diff --git a/UI/forms/OBSBasic.ui b/UI/forms/OBSBasic.ui
index f6a7c32ac..6c945d491 100644
--- a/UI/forms/OBSBasic.ui
+++ b/UI/forms/OBSBasic.ui
@@ -28,7 +28,7 @@
- :/res/images/obs.png:/res/images/obs.png
+ :/res/images/ebs.png:/res/images/ebs.png
@@ -137,11 +137,23 @@
+
+
+
+
+
+
-
+
Copy
@@ -283,6 +295,7 @@
+
@@ -304,7 +317,6 @@
Basic.MainMenu.Tools
-
@@ -509,7 +521,7 @@
0
-
-
+
0
@@ -606,63 +618,112 @@
4
-
-
-
-
- 220
- 0
-
-
-
- Qt::CustomContextMenu
-
-
- QFrame::StyledPanel
-
-
- QFrame::Sunken
-
-
- Qt::ScrollBarAlwaysOn
-
-
- Qt::ScrollBarAlwaysOff
-
-
- true
-
-
-
-
- 0
- 0
- 230
- 16
-
+
+
+
+ Qt::CustomContextMenu
-
-
- 0
- 0
-
+
+ QFrame::StyledPanel
-
-
- 0
-
-
- 0
+
+ QFrame::Sunken
+
+
+ Qt::ScrollBarAlwaysOn
+
+
+ Qt::ScrollBarAlwaysOff
+
+
+ true
+
+
+
+
+ 0
+ 0
+ 230
+ 16
+
-
- 0
+
+
+ 0
+ 0
+
-
- 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+
+
+
+
+ Qt::CustomContextMenu
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Sunken
+
+
+ Qt::ScrollBarAlwaysOff
+
+
+ Qt::ScrollBarAlwaysOn
+
+
+ true
+
+
+
+
+ 0
+ 0
+ 16
+ 230
+
-
- 0
+
+
+ 0
+ 0
+
-
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+
@@ -962,31 +1023,6 @@
- -
-
-
- true
-
-
-
- 0
- 0
-
-
-
-
- 130
- 0
-
-
-
- Basic.Main.StartRecording
-
-
- true
-
-
-
-
@@ -1491,16 +1527,6 @@
PasteDuplicate
-
-
- Basic.AutoConfig
-
-
-
-
- Basic.AutoConfig.Beta
-
-
Basic.Stats
@@ -1582,6 +1608,37 @@
Basic.MainMenu.Help.HelpPortal
+
+
+ Basic.MainMenu.Help.CrashLogs.ShowLogs
+
+
+
+
+ Basic.MainMenu.Help.CrashLogs.UploadLastLog
+
+
+
+
+ Basic.MainMenu.Help.Discord
+
+
+
+
+ true
+
+
+ true
+
+
+ Basic.Stats
+
+
+
+
+ Basic.MainMenu.Help.About
+
+
@@ -1595,6 +1652,12 @@
QStatusBar
window-basic-status-bar.hpp
+
+ HScrollArea
+ QScrollArea
+ horizontal-scroll-area.hpp
+ 1
+
VScrollArea
QScrollArea
@@ -1602,9 +1665,9 @@
1
- SourceListWidget
- QListWidget
-
+ SourceTree
+ QListView
+
diff --git a/UI/forms/OBSBasicFilters.ui b/UI/forms/OBSBasicFilters.ui
index b25d5d373..572a31f9d 100644
--- a/UI/forms/OBSBasicFilters.ui
+++ b/UI/forms/OBSBasicFilters.ui
@@ -425,6 +425,42 @@
+
+
+
+ :/res/images/list_remove.png:/res/images/list_remove.png
+
+
+ Remove
+
+
+ Del
+
+
+
+
+
+ :/res/images/up.png:/res/images/up.png
+
+
+ Basic.MainMenu.Edit.Order.MoveUp
+
+
+ Ctrl+Up
+
+
+
+
+
+ :/res/images/down.png:/res/images/down.png
+
+
+ Basic.MainMenu.Edit.Order.MoveDown
+
+
+ Ctrl+Down
+
+
diff --git a/UI/forms/OBSBasicSettings.ui b/UI/forms/OBSBasicSettings.ui
index ea5cfb8c8..9aaf6249b 100644
--- a/UI/forms/OBSBasicSettings.ui
+++ b/UI/forms/OBSBasicSettings.ui
@@ -145,8 +145,8 @@
0
0
- 801
- 741
+ 804
+ 1072
@@ -582,10 +582,74 @@
+
+
+
+ -
+
+
+ Basic.Settings.General.Multiview
+
+
+
+ QFormLayout::AllNonFixedFieldsGrow
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ 2
+
+
-
+
+
+ Qt::Horizontal
+
+
+ QSizePolicy::Fixed
+
+
+
+ 170
+ 5
+
+
+
+
+ -
+
+
+ Basic.Settings.General.Multiview.MouseSwitch
+
+
+ true
+
+
+
+ -
+
+
+ Basic.Settings.General.Multiview.DrawSourceNames
+
+
+ true
+
+
+
-
+
+
+ Basic.Settings.General.Multiview.DrawSafeAreas
+
+
+ true
+
+
+
+ -
- -
+
-
Basic.Settings.General.MultiviewLayout
@@ -704,20 +768,6 @@
- -
-
-
-
-
-
- Modifying the bandwidth manualy will not affect the quality of the stream as it is managed automaticaly by WebRTC.
-
-
- Qt::AlignCenter
-
-
-
-
-
@@ -747,8 +797,8 @@
0
0
- 603
- 640
+ 813
+ 770
@@ -1339,7 +1389,7 @@
-
- 0
+ 1
true
@@ -1630,285 +1680,285 @@
0
-
-
-
-
-
- 0
-
-
- 0
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ QFormLayout::AllNonFixedFieldsGrow
-
- 0
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
+
0
-
-
-
+
-
+
-
+
0
0
-
-
- QFormLayout::AllNonFixedFieldsGrow
+
+
+ 170
+ 0
+
+
+
+ Basic.Settings.Output.Simple.SavePath
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ advOutRecPath
+
+
+
+ -
+
+
-
+
+
+ true
+
+
+
+ -
+
+
+ true
+
+
+ Browse
+
+
+
+
+
+ -
+
+
+ Basic.Settings.Output.NoSpaceFileName
+
+
+ true
+
+
+
+ -
+
+
+ Basic.Settings.Output.Format
+
+
+ advOutRecFormat
+
+
+
+ -
+
+
-
+
+ flv
+
+
+ -
+
+ mp4
+
+
+ -
+
+ mov
+
+
+ -
+
+ mkv
+
+
+ -
+
+ ts
+
+
+ -
+
+ m3u8
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ Basic.Settings.Output.Adv.AudioTrack
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
0
-
-
-
-
-
- 0
- 0
-
-
-
-
- 170
- 0
-
-
+
+ 0
+
+
+ 0
+
+
-
+
- Basic.Settings.Output.Simple.SavePath
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
- advOutRecPath
+ 1
- -
-
-
-
-
-
- true
-
-
-
- -
-
-
- true
-
-
- Browse
-
-
-
-
-
- -
-
+
-
+
- Basic.Settings.Output.NoSpaceFileName
-
-
- true
+ 2
- -
-
+
-
+
- Basic.Settings.Output.Format
+ 3
-
- advOutRecFormat
-
-
-
- -
-
-
-
-
- flv
-
-
- -
-
- mp4
-
-
- -
-
- mov
-
-
- -
-
- mkv
-
-
- -
-
- ts
-
-
- -
-
- m3u8
-
-
- -
-
+
-
+
- Basic.Settings.Output.Adv.AudioTrack
-
-
-
- -
-
-
-
- 0
- 0
-
+ 4
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
- 1
-
-
-
- -
-
-
- 2
-
-
-
- -
-
-
- 3
-
-
-
- -
-
-
- 4
-
-
-
- -
-
-
- 5
-
-
-
- -
-
-
- 6
-
-
-
-
- -
-
+
-
+
- Basic.Settings.Output.Encoder
-
-
- advOutRecEncoder
+ 5
- -
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Qt::RightToLeft
-
+
-
+
- Basic.Settings.Output.Adv.Rescale
+ 6
- -
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
- false
-
-
- true
-
-
-
-
-
-
- -
-
-
- Basic.Settings.Output.CustomMuxerSettings
+
+
+
+ -
+
+
+ Basic.Settings.Output.Encoder
+
+
+ advOutRecEncoder
+
+
+
+ -
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::RightToLeft
+
+
+ Basic.Settings.Output.Adv.Rescale
+
+
+
+ -
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ false
-
- advOutMuxCustom
+
+ true
- -
-
-
+ -
+
+
+ Basic.Settings.Output.CustomMuxerSettings
+
+
+ advOutMuxCustom
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
@@ -3376,60 +3426,17 @@
- -
-
-
- true
-
-
-
-
- 0
- 0
- 98
- 28
-
-
-
-
-
- -
-
-
- color: rgb(255, 0, 4);
-
+
-
+
-
+ Basic.Settings.Audio.MeterDecayRate
-
- true
+
+ meterDecayRate
- -
-
-
-
-
-
- true
-
-
- warning
-
-
-
- -
-
-
- Basic.Settings.Audio.MeterDecayRate
-
-
- meterDecayRate
-
-
-
- -
+
-
Basic.Settings.Audio.MeterDecayRate.Fast
@@ -3454,6 +3461,106 @@
+ -
+
+
+ Basic.Settings.Audio.PeakMeterType
+
+
+ peakMeterType
+
+
+
+ -
+
+
+ 0
+
+
-
+
+ Basic.Settings.Audio.PeakMeterType.SamplePeak
+
+
+ -
+
+ Basic.Settings.Audio.PeakMeterType.TruePeak
+
+
+
+
+ -
+
+
+ true
+
+
+
+
+ 0
+ 0
+ 98
+ 28
+
+
+
+
+
+ -
+
+
+
+
+
+ true
+
+
+ error
+
+
+
+ -
+
+
+
+
+
+ true
+
+
+ warning
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+ -
+
+
+ true
+
+
+
+ -
+
+
+ Basic.Settings.Audio.AuxDevice4
+
+
+ auxAudioDevice4
+
+
+
@@ -3736,15 +3843,15 @@
0
-
- color: rgb(255, 0, 4);
-
true
+
+ error
+
@@ -3776,7 +3883,7 @@
-
+
0
@@ -3805,11 +3912,11 @@
0
0
- 596
- 761
+ 594
+ 807
-
+
0
@@ -3822,9 +3929,9 @@
9
- -
+
-
-
+
-
@@ -3834,6 +3941,12 @@
QFormLayout::AllNonFixedFieldsGrow
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ 2
+
-
@@ -3847,6 +3960,19 @@
-
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 170
+ 0
+
+
+
+
@@ -3862,6 +3988,9 @@
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+ 2
+
-
@@ -4034,6 +4163,19 @@
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 170
+ 20
+
+
+
+
@@ -4046,6 +4188,12 @@
QFormLayout::AllNonFixedFieldsGrow
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ 2
+
-
@@ -4066,6 +4214,19 @@
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 170
+ 20
+
+
+
+
@@ -4081,6 +4242,9 @@
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+ 2
+
-
@@ -4101,7 +4265,7 @@
- -
+
-
0
@@ -4133,7 +4297,7 @@
- -
+
-
Basic.Settings.Output.ReplayBuffer.Prefix
@@ -4143,6 +4307,39 @@
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 170
+ 20
+
+
+
+
+ -
+
+
+ Basic.Settings.Advanced.AutoRemux
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
@@ -4155,6 +4352,9 @@
QFormLayout::AllNonFixedFieldsGrow
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
2
@@ -4244,6 +4444,19 @@
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 170
+ 20
+
+
+
+
@@ -4256,6 +4469,12 @@
QFormLayout::AllNonFixedFieldsGrow
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ 2
+
-
@@ -4325,6 +4544,19 @@
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 170
+ 20
+
+
+
+
@@ -4337,9 +4569,12 @@
QFormLayout::AllNonFixedFieldsGrow
- -
-
-
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ 2
+
-
@@ -4350,6 +4585,9 @@
+ -
+
+
-
@@ -4367,33 +4605,84 @@
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 170
+ 20
+
+
+
+
-
-
-
- color: rgb(255, 0, 4);
-
-
-
-
-
- true
+
+
+ Basic.Main.Sources
+
+
+ 2
+
+
-
+
+
+ Qt::Horizontal
+
+
+
+ 170
+ 20
+
+
+
+
+ -
+
+
+ BrowserSource.EnableHardwareAcceleration
+
+
+
+
-
-
-
- color: rgb(255, 0, 4);
-
-
-
-
-
- true
+
+
+ Basic.Settings.Hotkeys
+
+
+ 2
+
+
-
+
+
+ Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 170
+ 20
+
+
+
+
+
@@ -4403,6 +4692,48 @@
+ -
+
+
+ 10
+
+
+ 10
+
+
+ 10
+
+
+ 10
+
+
-
+
+
+
+
+
+ true
+
+
+ error
+
+
+
+ -
+
+
+
+
+
+ true
+
+
+ error
+
+
+
+
+
diff --git a/UI/forms/OBSLicenseAgreement.ui b/UI/forms/OBSLicenseAgreement.ui
deleted file mode 100644
index e9c2d4970..000000000
--- a/UI/forms/OBSLicenseAgreement.ui
+++ /dev/null
@@ -1,108 +0,0 @@
-
-
- OBSLicenseAgreement
-
-
-
- 0
- 0
- 457
- 430
-
-
-
-
- 200
- 300
-
-
-
- LicenseAgreement
-
-
- -
-
-
- LicenseAgreement.PleaseReview
-
-
- Qt::RichText
-
-
- true
-
-
- true
-
-
- Qt::TextBrowserInteraction
-
-
-
- -
-
-
-
-
-
- true
-
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
- OK
-
-
-
-
-
-
-
-
-
-
-
- agree
- clicked()
- OBSLicenseAgreement
- accept()
-
-
- 138
- 419
-
-
- 40
- 424
-
-
-
-
-
diff --git a/UI/forms/OBSRemux.ui b/UI/forms/OBSRemux.ui
index 4c74e56b1..0f762b30c 100644
--- a/UI/forms/OBSRemux.ui
+++ b/UI/forms/OBSRemux.ui
@@ -6,77 +6,62 @@
0
0
- 491
- 124
+ 850
+ 400
RemuxRecordings
-
- -
-
-
- Remux.SourceFile
-
-
-
- -
-
-
- Remux.TargetFile
-
-
-
- -
-
-
-
-
-
-
- -
-
-
- Browse
-
-
-
-
-
- -
-
-
-
-
-
-
- -
-
-
- Browse
-
-
-
-
-
- -
-
-
- 24
-
-
-
- -
-
-
-
-
-
- QDialogButtonBox::Ok|QDialogButtonBox::Close
-
-
-
-
-
-
+
+ -
+
+
+ Remux.HelpText
+
+
+
+ -
+
+
+ 6
+
+
-
+
+
+ QDialogButtonBox::Close|QDialogButtonBox::Ok|QDialogButtonBox::Reset|QDialogButtonBox::RestoreDefaults
+
+
+
+
+
+ -
+
+
+ QAbstractItemView::NoSelection
+
+
+ 23
+
+
+ 23
+
+
+ false
+
+
+ 23
+
+
+
+ -
+
+
+ 24
+
+
+
+
diff --git a/UI/forms/images/collapse.png b/UI/forms/images/collapse.png
new file mode 100644
index 000000000..04707a44d
Binary files /dev/null and b/UI/forms/images/collapse.png differ
diff --git a/UI/forms/images/configuration21_16@2x.png b/UI/forms/images/configuration21_16@2x.png
new file mode 100644
index 000000000..fb5656036
Binary files /dev/null and b/UI/forms/images/configuration21_16@2x.png differ
diff --git a/UI/forms/images/ebs.png b/UI/forms/images/ebs.png
new file mode 100644
index 000000000..309e541e1
Binary files /dev/null and b/UI/forms/images/ebs.png differ
diff --git a/UI/forms/images/expand.png b/UI/forms/images/expand.png
new file mode 100644
index 000000000..1222bcdc1
Binary files /dev/null and b/UI/forms/images/expand.png differ
diff --git a/UI/forms/images/invisible_mask@2x.png b/UI/forms/images/invisible_mask@2x.png
new file mode 100644
index 000000000..dffe83aa6
Binary files /dev/null and b/UI/forms/images/invisible_mask@2x.png differ
diff --git a/UI/forms/images/locked_mask@2x.png b/UI/forms/images/locked_mask@2x.png
new file mode 100644
index 000000000..9cad6a4ac
Binary files /dev/null and b/UI/forms/images/locked_mask@2x.png differ
diff --git a/UI/forms/images/obs.png b/UI/forms/images/obs.png
old mode 100755
new mode 100644
diff --git a/UI/forms/images/properties@2x.png b/UI/forms/images/properties@2x.png
new file mode 100644
index 000000000..fb5656036
Binary files /dev/null and b/UI/forms/images/properties@2x.png differ
diff --git a/UI/forms/images/settings/advanced@2x.png b/UI/forms/images/settings/advanced@2x.png
new file mode 100644
index 000000000..f4e19cbb0
Binary files /dev/null and b/UI/forms/images/settings/advanced@2x.png differ
diff --git a/UI/forms/images/settings/applications-system-2@2x.png b/UI/forms/images/settings/applications-system-2@2x.png
new file mode 100644
index 000000000..b99e3d0d1
Binary files /dev/null and b/UI/forms/images/settings/applications-system-2@2x.png differ
diff --git a/UI/forms/images/settings/decibel_audio_player@2x.png b/UI/forms/images/settings/decibel_audio_player@2x.png
new file mode 100644
index 000000000..d55529004
Binary files /dev/null and b/UI/forms/images/settings/decibel_audio_player@2x.png differ
diff --git a/UI/forms/images/settings/network-bluetooth@2x.png b/UI/forms/images/settings/network-bluetooth@2x.png
new file mode 100644
index 000000000..98cbd0374
Binary files /dev/null and b/UI/forms/images/settings/network-bluetooth@2x.png differ
diff --git a/UI/forms/images/settings/network@2x.png b/UI/forms/images/settings/network@2x.png
new file mode 100644
index 000000000..ded3efd6c
Binary files /dev/null and b/UI/forms/images/settings/network@2x.png differ
diff --git a/UI/forms/images/settings/preferences-desktop-keyboard-shortcuts@2x.png b/UI/forms/images/settings/preferences-desktop-keyboard-shortcuts@2x.png
new file mode 100644
index 000000000..37d5c5c4c
Binary files /dev/null and b/UI/forms/images/settings/preferences-desktop-keyboard-shortcuts@2x.png differ
diff --git a/UI/forms/images/settings/preferences-system-network-3@2x.png b/UI/forms/images/settings/preferences-system-network-3@2x.png
new file mode 100644
index 000000000..75090280a
Binary files /dev/null and b/UI/forms/images/settings/preferences-system-network-3@2x.png differ
diff --git a/UI/forms/images/settings/system-settings-3@2x.png b/UI/forms/images/settings/system-settings-3@2x.png
new file mode 100644
index 000000000..6baeb0ae2
Binary files /dev/null and b/UI/forms/images/settings/system-settings-3@2x.png differ
diff --git a/UI/forms/images/settings/video-display-3@2x.png b/UI/forms/images/settings/video-display-3@2x.png
new file mode 100644
index 000000000..fbe85632c
Binary files /dev/null and b/UI/forms/images/settings/video-display-3@2x.png differ
diff --git a/UI/forms/images/tray_active.png b/UI/forms/images/tray_active.png
old mode 100755
new mode 100644
index 22a8b92fa..3f7d0d806
Binary files a/UI/forms/images/tray_active.png and b/UI/forms/images/tray_active.png differ
diff --git a/UI/forms/images/unlocked_mask@2x.png b/UI/forms/images/unlocked_mask@2x.png
new file mode 100644
index 000000000..de5a6ad08
Binary files /dev/null and b/UI/forms/images/unlocked_mask@2x.png differ
diff --git a/UI/forms/images/visible_mask@2x.png b/UI/forms/images/visible_mask@2x.png
new file mode 100644
index 000000000..540180fdd
Binary files /dev/null and b/UI/forms/images/visible_mask@2x.png differ
diff --git a/UI/forms/obs.qrc b/UI/forms/obs.qrc
index 367fc13ba..d667780f7 100644
--- a/UI/forms/obs.qrc
+++ b/UI/forms/obs.qrc
@@ -4,28 +4,44 @@
images/unmute.png
images/refresh.png
images/configuration21_16.png
+ images/configuration21_16@2x.png
images/invisible_mask.png
+ images/invisible_mask@2x.png
images/visible_mask.png
+ images/visible_mask@2x.png
images/list_remove.png
images/add.png
images/down.png
images/editscene.png
images/live.png
images/properties.png
+ images/properties@2x.png
images/up.png
- images/obs.png
+ images/ebs.png
images/tray_active.png
images/locked_mask.png
+ images/locked_mask@2x.png
images/unlocked_mask.png
+ images/unlocked_mask@2x.png
+ images/collapse.png
+ images/expand.png
images/settings/advanced.png
+ images/settings/advanced@2x.png
images/settings/network.png
+ images/settings/network@2x.png
images/settings/video-display-3.png
+ images/settings/video-display-3@2x.png
images/settings/decibel_audio_player.png
+ images/settings/decibel_audio_player@2x.png
images/settings/applications-system-2.png
+ images/settings/applications-system-2@2x.png
images/settings/system-settings-3.png
+ images/settings/system-settings-3@2x.png
images/settings/network-bluetooth.png
+ images/settings/network-bluetooth@2x.png
images/settings/preferences-desktop-keyboard-shortcuts.png
+ images/settings/preferences-desktop-keyboard-shortcuts@2x.png
diff --git a/UI/frontend-plugins/frontend-tools/CMakeLists.txt b/UI/frontend-plugins/frontend-tools/CMakeLists.txt
index 37a022a88..ca29cad87 100644
--- a/UI/frontend-plugins/frontend-tools/CMakeLists.txt
+++ b/UI/frontend-plugins/frontend-tools/CMakeLists.txt
@@ -25,6 +25,7 @@ set(frontend-tools_HEADERS
tool-helpers.hpp
../../properties-view.hpp
../../properties-view.moc.hpp
+ ../../horizontal-scroll-area.hpp
../../vertical-scroll-area.hpp
../../double-slider.hpp
)
@@ -34,6 +35,7 @@ set(frontend-tools_SOURCES
frontend-tools.c
output-timer.cpp
../../properties-view.cpp
+ ../../horizontal-scroll-area.cpp
../../vertical-scroll-area.cpp
../../double-slider.cpp
)
diff --git a/UI/frontend-plugins/frontend-tools/captions-mssapi-stream.cpp b/UI/frontend-plugins/frontend-tools/captions-mssapi-stream.cpp
index f8b642534..2861949c7 100644
--- a/UI/frontend-plugins/frontend-tools/captions-mssapi-stream.cpp
+++ b/UI/frontend-plugins/frontend-tools/captions-mssapi-stream.cpp
@@ -249,8 +249,9 @@ STDMETHODIMP CaptionStream::Stat(STATSTG *stg, DWORD flag)
stg->cbSize.QuadPart = (ULONGLONG)buf->size;
if (flag == STATFLAG_DEFAULT) {
- stg->pwcsName = (wchar_t*)CoTaskMemAlloc(sizeof(stat_name));
- memcpy(stg->pwcsName, stat_name, sizeof(stat_name));
+ size_t byte_size = (wcslen(stat_name) + 1) * sizeof(wchar_t);
+ stg->pwcsName = (wchar_t*)CoTaskMemAlloc(byte_size);
+ memcpy(stg->pwcsName, stat_name, byte_size);
}
return S_OK;
diff --git a/UI/frontend-plugins/frontend-tools/captions.cpp b/UI/frontend-plugins/frontend-tools/captions.cpp
index 43ebf94e2..5c68d8781 100644
--- a/UI/frontend-plugins/frontend-tools/captions.cpp
+++ b/UI/frontend-plugins/frontend-tools/captions.cpp
@@ -1,4 +1,5 @@
#include
+#include
#include
#include
diff --git a/UI/frontend-plugins/frontend-tools/data/locale/el-GR.ini b/UI/frontend-plugins/frontend-tools/data/locale/el-GR.ini
index 76847958b..0fa26e4be 100644
--- a/UI/frontend-plugins/frontend-tools/data/locale/el-GR.ini
+++ b/UI/frontend-plugins/frontend-tools/data/locale/el-GR.ini
@@ -25,5 +25,18 @@ OutputTimer.Record.StoppingIn="Διακοπή εγγραφής σε:"
OutputTimer.Stream.EnableEverytime="Ενεργοποίηση χρονόμετρου streaming κάθε φορά"
OutputTimer.Record.EnableEverytime="Ενεργοποίηση χρονόμετρου εγγραφής κάθε φορά"
+Scripts="Δέσμες ενεργειών"
+LoadedScripts="Φορτωμένες δέσμες ενεργειών"
+AddScripts="Προσθήκη δεσμών ενεργειών"
+RemoveScripts="Αφαίρεση δεσμών ενεργειών"
+ReloadScripts="Επαναφόρτωση δεσμών ενεργειών"
+PythonSettings="Ρυθμίσεις Python"
+PythonSettings.PythonInstallPath32bit="Χώρος εγκατάστασης Python (32bit)"
+PythonSettings.PythonInstallPath64bit="Χώρος εγκατάστασης Python (64bit)"
+PythonSettings.BrowsePythonPath="Περιήγηση τού χώρου εγκατάστασης Python"
+ScriptLogWindow="Script Log"
+Description="Περιγραφή"
+FileFilter.ScriptFiles="Κρυπτογραφημένο αρχείο δέσμης ενεργειών"
+FileFilter.AllFiles="Όλα τα αρχεία"
diff --git a/UI/frontend-plugins/frontend-tools/data/locale/fil-PH.ini b/UI/frontend-plugins/frontend-tools/data/locale/fil-PH.ini
new file mode 100644
index 000000000..b0c8450d5
--- /dev/null
+++ b/UI/frontend-plugins/frontend-tools/data/locale/fil-PH.ini
@@ -0,0 +1,42 @@
+SceneSwitcher="Awyomatikong Eskana Tagalipat"
+SceneSwitcher.OnNoMatch="Kapag walang tumutugma sa bintana:"
+SceneSwitcher.OnNoMatch.DontSwitch="Huwag lumipat"
+SceneSwitcher.OnNoMatch.SwitchTo="Lumipat sa:"
+SceneSwitcher.CheckInterval="Suriin ang aktibong pamagat ng bintana bawat:"
+SceneSwitcher.ActiveOrNotActive="Ang Eskana Tagalipat ay:"
+InvalidRegex.Title="Di-wastong Regular Expression"
+InvalidRegex.Text="Siya ay regular na expression na ipinasok mo ay hindi wasto."
+Active="Aktibo"
+Inactive="Di-aktibo"
+Start="Magsimula"
+Stop="Ihinto"
+
+Captions="Mga Caption (Experimental)"
+Captions.AudioSource="Pinagmulan ng audio"
+Captions.CurrentSystemLanguage="Kasalukuyang Wika ng Wika (%1)"
+Captions.Provider="Tagapagbigay"
+Captions.Error.GenericFail="Nabigong magsimula ng mga caption"
+
+OutputTimer="Output ng Timer"
+OutputTimer.Stream="Itigil ang streaming pagkatapos:"
+OutputTimer.Record="Itigil ang pag-record pagkatapos ng:"
+OutputTimer.Stream.StoppingIn="Ang pagtigil ng streaming sa:"
+OutputTimer.Record.StoppingIn="Pagre-record ng pagtigil sa:"
+OutputTimer.Stream.EnableEverytime="Paganahin ang streaming timer sa bawat oras"
+OutputTimer.Record.EnableEverytime="Paganahin ang timer ng pag-record sa bawat oras"
+
+Scripts="Mga script"
+LoadedScripts="Mga Loaded na Mga Script"
+AddScripts="Magdagdag ng Mga Script"
+RemoveScripts="Alisin ang Mga Script"
+ReloadScripts="I-reload ang Mga Script"
+PythonSettings="Mga Setting ng Python"
+PythonSettings.PythonInstallPath32bit="Path ng Pag-install ng Python (32bit)"
+PythonSettings.PythonInstallPath64bit="Path ng Pag-install ng Python (64bit)"
+PythonSettings.BrowsePythonPath="Mag-browse sa Python Path"
+ScriptLogWindow="Mag-log ng Script"
+Description="Paglalarawan"
+
+FileFilter.ScriptFiles="Mga File ng Script"
+FileFilter.AllFiles="Lahat ng Mga File"
+
diff --git a/UI/frontend-plugins/frontend-tools/data/locale/gd-GB.ini b/UI/frontend-plugins/frontend-tools/data/locale/gd-GB.ini
new file mode 100644
index 000000000..c7597a6b8
--- /dev/null
+++ b/UI/frontend-plugins/frontend-tools/data/locale/gd-GB.ini
@@ -0,0 +1,42 @@
+SceneSwitcher="Suidsear fèin-obrachail nan sealladh"
+SceneSwitcher.OnNoMatch="Mura freagair uinneag"
+SceneSwitcher.OnNoMatch.DontSwitch="Na dèan suids"
+SceneSwitcher.OnNoMatch.SwitchTo="Dèan suids gu:"
+SceneSwitcher.CheckInterval="Thoir sùil air tiotal na h-uinneige gnìomhaich gach:"
+SceneSwitcher.ActiveOrNotActive="Tha suidsear nan sealladh:"
+InvalidRegex.Title="Chan eil an t-eas-preisean riaghailteach dligheach"
+InvalidRegex.Text="Chan eil an t-eas-preisean riaghailteach a chuir thu a-steach dligheach."
+Active="Gnìomhach"
+Inactive="Neo-ghnìomhach"
+Start="Tòisich"
+Stop="Cuir stad air"
+
+Captions="Fo-thiotalan (deuchainneil)"
+Captions.AudioSource="Tùs fuaime"
+Captions.CurrentSystemLanguage="Cànan làithreach an t-siostaim (%1)"
+Captions.Provider="Solaraiche"
+Captions.Error.GenericFail="Cha deach leinn na fo-thiotalan a thòiseachadh"
+
+OutputTimer="Tìmear an às-chuir"
+OutputTimer.Stream="Cuir stad air an t-sruthadh às dèidh:"
+OutputTimer.Record="Cuir stad air a’ chlàradh às dèidh:"
+OutputTimer.Stream.StoppingIn="Thèid an sruthadh a chur ’na stad às dèidh:"
+OutputTimer.Record.StoppingIn="Thèid an clàradh a chur ’na stad às dèidh:"
+OutputTimer.Stream.EnableEverytime="Cuir tìmear an t-sruthaidh an comas gach turas"
+OutputTimer.Record.EnableEverytime="Cuir tìmear a’ chlàraidh an comas gach turas"
+
+Scripts="Sgriobtaichean"
+LoadedScripts="Sgriobtaichean luchdaichte"
+AddScripts="Cuir sgriobtaichean ris"
+RemoveScripts="Thoir sgriobtaichean air falbh"
+ReloadScripts="Ath-luchdaich na sgriobtaichean"
+PythonSettings="Roghainnean Python"
+PythonSettings.PythonInstallPath32bit="Slighe stàlaidh Python (32 biod)"
+PythonSettings.PythonInstallPath64bit="Slighe stàlaidh Python (64 biod)"
+PythonSettings.BrowsePythonPath="Rùraich airson slighe stàlaidh Python"
+ScriptLogWindow="Loga nan sgriobt"
+Description="Tuairisgeul"
+
+FileFilter.ScriptFiles="Faidhlichean sgriobt"
+FileFilter.AllFiles="Na h-uile faidhle"
+
diff --git a/UI/frontend-plugins/frontend-tools/data/locale/he-IL.ini b/UI/frontend-plugins/frontend-tools/data/locale/he-IL.ini
index d100f7f54..1e2aaeb60 100644
--- a/UI/frontend-plugins/frontend-tools/data/locale/he-IL.ini
+++ b/UI/frontend-plugins/frontend-tools/data/locale/he-IL.ini
@@ -1,7 +1,9 @@
+SceneSwitcher="החלפת סצנה אוטומטית"
SceneSwitcher.OnNoMatch="כאשר אין חלון מתאים:"
SceneSwitcher.OnNoMatch.DontSwitch="אל תעבור"
SceneSwitcher.OnNoMatch.SwitchTo="עבור ל:"
SceneSwitcher.CheckInterval="בדוק כותרת חלון פעיל בכל:"
+SceneSwitcher.ActiveOrNotActive="החלפת סצנה זה:"
InvalidRegex.Title="ביטוי רגולרי לא חוקי"
InvalidRegex.Text="הביטוי הרגולרי שהזנת אינו חוקי."
Active="פעיל"
@@ -23,6 +25,15 @@ OutputTimer.Record.StoppingIn="הקלטה עוצרת ב:"
OutputTimer.Stream.EnableEverytime="הפעל טיימר הזרמה כל פעם"
OutputTimer.Record.EnableEverytime="הפעל טיימר הקלטה כל פעם"
+Scripts="תסריטים"
+LoadedScripts="תסריטים טעונים"
+AddScripts="הוסף תסריט"
+RemoveScripts="מחק תסריטים"
+ReloadScripts="טען מחדש תסריטים"
+PythonSettings="הגדרות פייתון"
+PythonSettings.PythonInstallPath32bit="נתיב התקנת פייתון (32 סיביות)"
+PythonSettings.PythonInstallPath64bit="התקנת נתיב פייתון (64 סיביות)"
+PythonSettings.BrowsePythonPath="עיון בנתיב פייתון"
ScriptLogWindow="סקריפט לוג"
Description="תיאור"
diff --git a/UI/frontend-plugins/frontend-tools/data/locale/ka-GE.ini b/UI/frontend-plugins/frontend-tools/data/locale/ka-GE.ini
index bbf555709..d6288a3ed 100644
--- a/UI/frontend-plugins/frontend-tools/data/locale/ka-GE.ini
+++ b/UI/frontend-plugins/frontend-tools/data/locale/ka-GE.ini
@@ -1,11 +1,42 @@
+SceneSwitcher="სცენის თვითგადამრთველი"
+SceneSwitcher.OnNoMatch="როცა არცერთი ფანჯარა არ ემთხვევა:"
+SceneSwitcher.OnNoMatch.DontSwitch="არ გადაირთოს"
+SceneSwitcher.OnNoMatch.SwitchTo="გადაირთოს:"
+SceneSwitcher.CheckInterval="მოქმედი ფანჯრის დასახელების გადამოწმების დროის შუალედი:"
+SceneSwitcher.ActiveOrNotActive="სცენის თვითგადამრთველი:"
+InvalidRegex.Title="არამართებული რეგულარული გამოსახულება"
+InvalidRegex.Text="შეყვანილი რეგულარული გამოსახულება არასწორია."
Active="ჩართული"
Inactive="გამორთული"
Start="დაწყება"
Stop="შეწყვეტა"
+Captions="წარწერები (საცდელი)"
Captions.AudioSource="აუდიოს წყარო"
+Captions.CurrentSystemLanguage="სისტემის მიმდინარე ენა (%1)"
+Captions.Provider="მომწოდებელი"
+Captions.Error.GenericFail="წარწერების დადება ვერ მოხერხდა"
+OutputTimer="ჩაწერის და ნაკადის წამზომი"
+OutputTimer.Stream="ნაკადი გაეშვას არაუმეტეს:"
+OutputTimer.Record="ჩაწერა გაგრძელდეს არაუმეტეს:"
+OutputTimer.Stream.StoppingIn="ნაკადის შეჩერების დროა:"
OutputTimer.Record.StoppingIn="ჩაწერის შეწყვეტის დრო:"
+OutputTimer.Stream.EnableEverytime="ნაკადის წამზომის ჩართვა ყოველ ჯერზე"
+OutputTimer.Record.EnableEverytime="ჩაწერის წამზომის ჩართვა ყოველ ჯერზე"
+Scripts="სკრიპტები"
+LoadedScripts="ჩატვირთული სკრიპტები"
+AddScripts="სკრიპტების დამატება"
+RemoveScripts="სკრიპტების მოცილება"
+ReloadScripts="სკრიპტების გადატვირთვა"
+PythonSettings="Python-ის პარამეტრები"
+PythonSettings.PythonInstallPath32bit="Python-ის დასაყენებელი მდებარეობა (32bit)"
+PythonSettings.PythonInstallPath64bit="Python-ის დასაყენებელი მდებარეობა (64bit)"
+PythonSettings.BrowsePythonPath="Python-ის მდებარეობის მოძიება"
+ScriptLogWindow="სკრიპტის აღრიცხვა"
+Description="აღწერილობა"
+FileFilter.ScriptFiles="სკრიპტის ფაილები"
+FileFilter.AllFiles="ყველა ფაილი"
diff --git a/UI/frontend-plugins/frontend-tools/data/locale/ms-MY.ini b/UI/frontend-plugins/frontend-tools/data/locale/ms-MY.ini
index 18ab93e1a..2de18faa1 100644
--- a/UI/frontend-plugins/frontend-tools/data/locale/ms-MY.ini
+++ b/UI/frontend-plugins/frontend-tools/data/locale/ms-MY.ini
@@ -1,13 +1,28 @@
+SceneSwitcher.OnNoMatch.DontSwitch="Tidak perlu tukar"
+SceneSwitcher.OnNoMatch.SwitchTo="Tukar ke:"
Active="Aktif"
Inactive="Tidak Aktif"
Start="Mula"
Stop="Berhenti"
+Captions="Kapsyen (eksperimen)"
+Captions.AudioSource="Sumber audio"
+Captions.CurrentSystemLanguage="Sistem bahasa sekarang(%1)"
+Captions.Provider="Provider"
OutputTimer.Stream="Berhenti 'streaming' selepas:"
OutputTimer.Record="Berhenti merakam selepas:"
OutputTimer.Stream.StoppingIn="'Streaming' dihentikan dalam:"
OutputTimer.Record.StoppingIn="Rakaman dihentikan dalam:"
+Scripts="Skrip"
+AddScripts="Tambah skrip"
+RemoveScripts="Keluarkan skrip"
+PythonSettings="Setting Python"
+PythonSettings.PythonInstallPath32bit="Python memasang laluan (32 bit)"
+PythonSettings.PythonInstallPath64bit="Python memasang laluan (64 bit)"
+Description="Huraian"
+FileFilter.ScriptFiles="Fail skrip"
+FileFilter.AllFiles="Semua fail"
diff --git a/UI/frontend-plugins/frontend-tools/data/locale/nb-NO.ini b/UI/frontend-plugins/frontend-tools/data/locale/nb-NO.ini
index 8ce8952f0..b9ecf01d9 100644
--- a/UI/frontend-plugins/frontend-tools/data/locale/nb-NO.ini
+++ b/UI/frontend-plugins/frontend-tools/data/locale/nb-NO.ini
@@ -1,4 +1,4 @@
-SceneSwitcher="Automatisk Scene Skifter"
+SceneSwitcher="Automatisk sceneskifter"
SceneSwitcher.OnNoMatch="Når ingen vindu passer overens:"
SceneSwitcher.OnNoMatch.DontSwitch="Ikke bytt"
SceneSwitcher.OnNoMatch.SwitchTo="Bytt til:"
@@ -22,8 +22,23 @@ OutputTimer.Stream="Stopp streaming etter:"
OutputTimer.Record="Stopp opptak etter:"
OutputTimer.Stream.StoppingIn="Streaming stopper om:"
OutputTimer.Record.StoppingIn="Opptak stopper om:"
-OutputTimer.Stream.EnableEverytime="Aktiver streaming timer hver gang"
-OutputTimer.Record.EnableEverytime="Aktiver opptaks timer hver gang"
+OutputTimer.Stream.EnableEverytime="Aktiver strømmeklokken hver gang"
+OutputTimer.Record.EnableEverytime="Aktiver opptaksklokken hver gang"
+
+Scripts="Skripter"
+LoadedScripts="Innlastede skripter"
+AddScripts="Legg til skripter"
+RemoveScripts="Fjern skripter"
+ReloadScripts="Last inn skripter på nytt"
+PythonSettings="Python-innstillinger"
+PythonSettings.PythonInstallPath32bit="Python-installasjonsfilbane (32-bit)"
+PythonSettings.PythonInstallPath64bit="Python-installasjonsfilbane (64-bit)"
+PythonSettings.BrowsePythonPath="Finn Python-filbanen"
+ScriptLogWindow="Skripthistorikk"
+Description="Beskrivelse"
+
+FileFilter.ScriptFiles="Skriptfiler"
+FileFilter.AllFiles="Alle filer"
Scripts="Skripter"
LoadedScripts="Innlastede skripter"
diff --git a/UI/frontend-plugins/frontend-tools/data/locale/ru-RU.ini b/UI/frontend-plugins/frontend-tools/data/locale/ru-RU.ini
index 42e53e6a3..b5de83b0f 100644
--- a/UI/frontend-plugins/frontend-tools/data/locale/ru-RU.ini
+++ b/UI/frontend-plugins/frontend-tools/data/locale/ru-RU.ini
@@ -17,12 +17,12 @@ Captions.CurrentSystemLanguage="Текущий язык системы (%1)"
Captions.Provider="Поставщик"
Captions.Error.GenericFail="Не удалось запустить субтитры"
-OutputTimer="Таймер записи и стрима"
-OutputTimer.Stream="Завершить стрим через:"
+OutputTimer="Таймер записи и трансляции"
+OutputTimer.Stream="Завершить трансляцию через:"
OutputTimer.Record="Завершить запись через:"
-OutputTimer.Stream.StoppingIn="Стрим будет завершён через:"
+OutputTimer.Stream.StoppingIn="Трансляция будет завершена через:"
OutputTimer.Record.StoppingIn="Запись будет завершена через:"
-OutputTimer.Stream.EnableEverytime="Включать таймер стрима каждый раз"
+OutputTimer.Stream.EnableEverytime="Включать таймер трансляции каждый раз"
OutputTimer.Record.EnableEverytime="Включать таймер записи каждый раз"
Scripts="Скрипты"
diff --git a/UI/frontend-plugins/frontend-tools/data/locale/tl-PH.ini b/UI/frontend-plugins/frontend-tools/data/locale/tl-PH.ini
new file mode 100644
index 000000000..3725caf61
--- /dev/null
+++ b/UI/frontend-plugins/frontend-tools/data/locale/tl-PH.ini
@@ -0,0 +1,42 @@
+SceneSwitcher="Awtomatikong Taga-palit ng Eksena"
+SceneSwitcher.OnNoMatch="Kapag walang tumugmang window:"
+SceneSwitcher.OnNoMatch.DontSwitch="Huwag lumipat"
+SceneSwitcher.OnNoMatch.SwitchTo="Lumipat sa:"
+SceneSwitcher.CheckInterval="Suriin ang pamagat ng aktibong window kada:"
+SceneSwitcher.ActiveOrNotActive="Ang Tag-palit ng Eksena ay:"
+InvalidRegex.Title="Di-wastong Regular Expression"
+InvalidRegex.Text="Ang regular na ekspresyon na iyong ipinasok ay imbalido."
+Active="Aktibo"
+Inactive="Hindi aktibo"
+Start="Simula"
+Stop="Ihinto"
+
+Captions="Mga Pamagat (Eksparimento)"
+Captions.AudioSource="Pinanggalingan ng Audio"
+Captions.CurrentSystemLanguage="Kasalukuyang linggwahe ng sistema (%1)"
+Captions.Provider="Tagapagtustos"
+Captions.Error.GenericFail="Nabigo sa pasisimula ng mga pamagat"
+
+OutputTimer="Pamlabas na Orasan"
+OutputTimer.Stream="Itigil ang pag-stream pagkatapos:"
+OutputTimer.Record="Itigil ang pagtatala pagkatapos:"
+OutputTimer.Stream.StoppingIn="Ang pagtigil ng stream sa:"
+OutputTimer.Record.StoppingIn="Ang pagtigil ng pagtatala sa:"
+OutputTimer.Stream.EnableEverytime="Paganahin ang streaming timer sa bawat oras"
+OutputTimer.Record.EnableEverytime="Paganahin ang timer ng pagtatala bawat oras"
+
+Scripts="Mga iskrip"
+LoadedScripts="Mga iskrip na naikarga"
+AddScripts="Magdagdag ng iskrip"
+RemoveScripts="Tanggalin ang mga iskrip"
+ReloadScripts="Ikargang muli ang mga Iskrip"
+PythonSettings="Mga Setting Python"
+PythonSettings.PythonInstallPath32bit="I-install ang daan sa Python (32bit)"
+PythonSettings.PythonInstallPath64bit="I-install ang Daan sa Python (64bit)"
+PythonSettings.BrowsePythonPath="Daan ng Browse Python"
+ScriptLogWindow="Mag-log sa Iskrip"
+Description="Paglalarawan"
+
+FileFilter.ScriptFiles="Mga File ng Iskrip"
+FileFilter.AllFiles="Lahat ng mga File"
+
diff --git a/UI/frontend-plugins/frontend-tools/data/locale/vi-VN.ini b/UI/frontend-plugins/frontend-tools/data/locale/vi-VN.ini
index bbaac9c7f..6ea363b87 100644
--- a/UI/frontend-plugins/frontend-tools/data/locale/vi-VN.ini
+++ b/UI/frontend-plugins/frontend-tools/data/locale/vi-VN.ini
@@ -4,6 +4,8 @@ SceneSwitcher.OnNoMatch.DontSwitch="Không chuyển"
SceneSwitcher.OnNoMatch.SwitchTo="Chuyển sang:"
SceneSwitcher.CheckInterval="Kiểm tra tiêu đề cửa sổ mỗi:"
SceneSwitcher.ActiveOrNotActive="Chuyển cảnh đang:"
+InvalidRegex.Title="Cụm từ thông dụng không hợp lệ"
+InvalidRegex.Text="Cụm từ thông dụng mà bạn đã nhập không hợp lệ."
Active="Đang hoạt động"
Inactive="Không hoạt động"
Start="Bắt đầu"
@@ -15,10 +17,28 @@ Captions.CurrentSystemLanguage="Ngôn ngữ hiện tại của máy tính (%1)"
Captions.Provider="Nhà cung cấp"
Captions.Error.GenericFail="Thất bại trong việc bắt đầu phụ đề"
+OutputTimer="Hẹn giờ đầu ra"
OutputTimer.Stream="Dừng stream sau:"
OutputTimer.Record="Dừng ghi video sau:"
OutputTimer.Stream.StoppingIn="Stream sẽ dừng trong:"
OutputTimer.Record.StoppingIn="Quay video sẽ dừng trong:"
+OutputTimer.Stream.EnableEverytime="Bật hẹn giờ phát trực tuyến mỗi lần"
+OutputTimer.Record.EnableEverytime="Bật hẹn giờ phát mỗi lần"
+
+Scripts="Kịch bản"
+LoadedScripts="Kịch bản đã nạp"
+AddScripts="Thêm script"
+RemoveScripts="Gỡ bỏ kịch bản"
+ReloadScripts="Nạp lại kịch bản"
+PythonSettings="Thiết lập Python"
+PythonSettings.PythonInstallPath32bit="Đường dẫn cài đặt Python (32bit)"
+PythonSettings.PythonInstallPath64bit="Đường dẫn cài đặt Python (64bit)"
+PythonSettings.BrowsePythonPath="Duyệt đường dẫn Python"
+ScriptLogWindow="Bản ghi kịch bản"
+Description="Mô tả"
+
+FileFilter.ScriptFiles="Tập tin script"
+FileFilter.AllFiles="Tất cả tập tin"
AddScripts="Thêm script"
Description="Mô tả"
diff --git a/UI/frontend-plugins/frontend-tools/data/locale/zh-CN.ini b/UI/frontend-plugins/frontend-tools/data/locale/zh-CN.ini
index 274a488da..316d41257 100644
--- a/UI/frontend-plugins/frontend-tools/data/locale/zh-CN.ini
+++ b/UI/frontend-plugins/frontend-tools/data/locale/zh-CN.ini
@@ -11,10 +11,10 @@ Inactive="未激活"
Start="开始"
Stop="停止"
-Captions="标题(实验)"
+Captions="字幕 (实验)"
Captions.AudioSource="音频源"
Captions.CurrentSystemLanguage="当前系统语言 (%1)"
-Captions.Provider="供应商"
+Captions.Provider="提供程序"
Captions.Error.GenericFail="启动捕获失败"
OutputTimer="输出计时器"
diff --git a/UI/frontend-plugins/frontend-tools/data/scripts/instant-replay.lua b/UI/frontend-plugins/frontend-tools/data/scripts/instant-replay.lua
index 8137990d6..b1f82ff32 100644
--- a/UI/frontend-plugins/frontend-tools/data/scripts/instant-replay.lua
+++ b/UI/frontend-plugins/frontend-tools/data/scripts/instant-replay.lua
@@ -2,6 +2,7 @@ obs = obslua
source_name = ""
hotkey_id = obs.OBS_INVALID_HOTKEY_ID
attempts = 0
+last_replay = ""
----------------------------------------------------------
@@ -22,27 +23,45 @@ function try_play()
obs.obs_output_release(replay_buffer)
+ if path == last_replay then
+ path = nil
+ end
+
-- If the path is valid and the source exists, update it with the
-- replay file to play back the replay. Otherwise, stop attempting to
- -- replay after 10 seconds
+ -- replay after 10 retries
if path == nil then
attempts = attempts + 1
if attempts >= 10 then
obs.remove_current_callback()
end
else
+ last_replay = path
local source = obs.obs_get_source_by_name(source_name)
if source ~= nil then
local settings = obs.obs_data_create()
- obs.obs_data_set_string(settings, "local_file", path)
- obs.obs_data_set_bool(settings, "is_local_file", true)
- obs.obs_data_set_bool(settings, "close_when_inactive", true)
- obs.obs_data_set_bool(settings, "restart_on_activate", true)
-
- -- updating will automatically cause the source to
- -- refresh if the source is currently active, otherwise
- -- the source will play whenever its scene is activated
- obs.obs_source_update(source, settings)
+ source_id = obs.obs_source_get_id(source)
+ if source_id == "ffmpeg_source" then
+ obs.obs_data_set_string(settings, "local_file", path)
+ obs.obs_data_set_bool(settings, "is_local_file", true)
+
+ -- updating will automatically cause the source to
+ -- refresh if the source is currently active
+ obs.obs_source_update(source, settings)
+ elseif source_id == "vlc_source" then
+ -- "playlist"
+ array = obs.obs_data_array_create()
+ item = obs.obs_data_create()
+ obs.obs_data_set_string(item, "value", path)
+ obs.obs_data_array_push_back(array, item)
+ obs.obs_data_set_array(settings, "playlist", array)
+
+ -- updating will automatically cause the source to
+ -- refresh if the source is currently active
+ obs.obs_source_update(source, settings)
+ obs.obs_data_release(item)
+ obs.obs_data_array_release(array)
+ end
obs.obs_data_release(settings)
obs.obs_source_release(source)
@@ -65,11 +84,11 @@ function instant_replay(pressed)
local ph = obs.obs_output_get_proc_handler(replay_buffer)
obs.proc_handler_call(ph, "save", nil)
- -- Set a 1-second timer to attempt playback every 1 second
+ -- Set a 2-second timer to attempt playback every 1 second
-- until the replay is available
if obs.obs_output_active(replay_buffer) then
attempts = 0
- obs.timer_add(try_play, 1000)
+ obs.timer_add(try_play, 2000)
else
obs.script_log(obs.LOG_WARNING, "Tried to save an instant replay, but the replay buffer is not active!")
end
@@ -90,7 +109,7 @@ end
-- A function named script_description returns the description shown to
-- the user
function script_description()
- return "When the \"Instant Replay\" hotkey is triggered, saves a replay with the replay buffer, and then plays it in a media source as soon as the replay is ready. Requires an active replay buffer.\n\nMade by Jim"
+ return "When the \"Instant Replay\" hotkey is triggered, saves a replay with the replay buffer, and then plays it in a media source as soon as the replay is ready. Requires an active replay buffer.\n\nMade by Jim and Exeldro"
end
-- A function named script_properties defines the properties that the user
@@ -106,6 +125,11 @@ function script_properties()
if source_id == "ffmpeg_source" then
local name = obs.obs_source_get_name(source)
obs.obs_property_list_add_string(p, name, name)
+ elseif source_id == "vlc_source" then
+ local name = obs.obs_source_get_name(source)
+ obs.obs_property_list_add_string(p, name, name)
+ else
+ -- obs.script_log(obs.LOG_INFO, source_id)
end
end
end
diff --git a/UI/frontend-plugins/frontend-tools/scripts.cpp b/UI/frontend-plugins/frontend-tools/scripts.cpp
index d923dcf61..364757e48 100644
--- a/UI/frontend-plugins/frontend-tools/scripts.cpp
+++ b/UI/frontend-plugins/frontend-tools/scripts.cpp
@@ -12,6 +12,7 @@
#include
#include
#include
+#include
#include
#include
diff --git a/UI/horizontal-scroll-area.cpp b/UI/horizontal-scroll-area.cpp
new file mode 100644
index 000000000..8f927fc59
--- /dev/null
+++ b/UI/horizontal-scroll-area.cpp
@@ -0,0 +1,10 @@
+#include
+#include "horizontal-scroll-area.hpp"
+
+void HScrollArea::resizeEvent(QResizeEvent *event)
+{
+ if (!!widget())
+ widget()->setMaximumHeight(event->size().height());
+
+ QScrollArea::resizeEvent(event);
+}
diff --git a/UI/horizontal-scroll-area.hpp b/UI/horizontal-scroll-area.hpp
new file mode 100644
index 000000000..8a64c3ea8
--- /dev/null
+++ b/UI/horizontal-scroll-area.hpp
@@ -0,0 +1,19 @@
+#pragma once
+
+#include
+
+class QResizeEvent;
+
+class HScrollArea : public QScrollArea {
+ Q_OBJECT
+
+public:
+ inline HScrollArea(QWidget *parent = nullptr)
+ : QScrollArea(parent)
+ {
+ setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ }
+
+protected:
+ virtual void resizeEvent(QResizeEvent *event) override;
+};
diff --git a/UI/item-widget-helpers.hpp b/UI/item-widget-helpers.hpp
index 9a4d43e41..776c2fb7b 100644
--- a/UI/item-widget-helpers.hpp
+++ b/UI/item-widget-helpers.hpp
@@ -28,3 +28,15 @@ class QListWidgetItem;
QListWidgetItem *TakeListItem(QListWidget *widget, int row);
void DeleteListItem(QListWidget *widget, QListWidgetItem *item);
void ClearListItems(QListWidget *widget);
+
+template
+void InsertQObjectByName(std::vector &controls, QObjectPtr control)
+{
+ QString name = control->objectName();
+ auto finder = [name](QObjectPtr elem) {
+ return elem->objectName() > name;
+ };
+ auto found_at = std::find_if(controls.begin(), controls.end(), finder);
+
+ controls.insert(found_at, control);
+}
diff --git a/UI/locked-checkbox.cpp b/UI/locked-checkbox.cpp
index 91a049fac..a5f6b5649 100644
--- a/UI/locked-checkbox.cpp
+++ b/UI/locked-checkbox.cpp
@@ -7,10 +7,17 @@
LockedCheckBox::LockedCheckBox() : QCheckBox()
{
- lockedImage =
- QPixmap::fromImage(QImage(":/res/images/locked_mask.png"));
- unlockedImage =
- QPixmap::fromImage(QImage(":/res/images/unlocked_mask.png"));
+ QString lockedFile;
+ QString unlockedFile;
+ if (devicePixelRatio() >= 2) {
+ lockedFile = ":/res/images/locked_mask@2x.png";
+ unlockedFile = ":/res/images/unlocked_mask@2x.png";
+ } else {
+ lockedFile = ":/res/images/locked_mask.png";
+ unlockedFile = ":/res/images/unlocked_mask.png";
+ }
+ lockedImage = QPixmap::fromImage(QImage(lockedFile));
+ unlockedImage = QPixmap::fromImage(QImage(unlockedFile));
setMinimumSize(16, 16);
setStyleSheet("outline: none;");
@@ -31,6 +38,5 @@ void LockedCheckBox::paintEvent(QPaintEvent *event)
palette().color(foregroundRole()));
QPainter p(this);
- p.drawPixmap(0, 0, image.width(), image.height(),
- QPixmap::fromImage(image));
+ p.drawPixmap(0, 0, 16, 16, QPixmap::fromImage(image));
}
diff --git a/UI/obs-app.cpp b/UI/obs-app.cpp
index d5fc09a21..255089252 100644
--- a/UI/obs-app.cpp
+++ b/UI/obs-app.cpp
@@ -24,9 +24,10 @@
#include
#include
#include
-#include
+#include
#include
#include
+#include
#include
#include
@@ -38,7 +39,6 @@
#include "obs-app.hpp"
#include "window-basic-main.hpp"
#include "window-basic-settings.hpp"
-#include "window-license-agreement.hpp"
#include "crash-report.hpp"
#include "platform.hpp"
@@ -60,6 +60,7 @@ static log_handler_t def_log_handler;
static string currentLogFile;
static string lastLogFile;
+static string lastCrashLogFile;
bool portable_mode = false;
static bool multi = false;
@@ -76,8 +77,12 @@ string opt_starting_collection;
string opt_starting_profile;
string opt_starting_scene;
-// AMD PowerXpress High Performance Flags
+bool remuxAfterRecord = false;
+string remuxFilename;
+
+// GPU hint exports for AMD/NVIDIA laptops
#ifdef _MSC_VER
+extern "C" __declspec(dllexport) DWORD NvOptimusEnablement = 1;
extern "C" __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;
#endif
@@ -344,6 +349,7 @@ static void do_log(int log_level, const char *msg, va_list args, void *param)
}
#else
def_log_handler(log_level, msg, args2, nullptr);
+ va_end(args2);
#endif
if (log_level <= LOG_INFO || log_verbose) {
@@ -365,6 +371,7 @@ bool OBSApp::InitGlobalConfigDefaults()
config_set_default_string(globalConfig, "General", "Language",
DEFAULT_LANG);
config_set_default_uint(globalConfig, "General", "MaxLogs", 10);
+ config_set_default_int(globalConfig, "General", "InfoIncrement", -1);
config_set_default_string(globalConfig, "General", "ProcessPriority",
"Normal");
config_set_default_bool(globalConfig, "General", "EnableAutoUpdates",
@@ -417,9 +424,25 @@ bool OBSApp::InitGlobalConfigDefaults()
"CurrentTheme", "Dark");
}
+ config_set_default_bool(globalConfig, "BasicWindow",
+ "VerticalVolControl", false);
+
+ config_set_default_bool(globalConfig, "BasicWindow",
+ "MultiviewMouseSwitch", true);
+
+ config_set_default_bool(globalConfig, "BasicWindow",
+ "MultiviewDrawNames", true);
+
+ config_set_default_bool(globalConfig, "BasicWindow",
+ "MultiviewDrawAreas", true);
+
#ifdef _WIN32
+ uint32_t winver = GetWindowsVersion();
+
config_set_default_bool(globalConfig, "Audio", "DisableAudioDucking",
true);
+ config_set_default_bool(globalConfig, "General", "BrowserHWAccel",
+ winver > 0x601);
#endif
#ifdef __APPLE__
@@ -444,34 +467,34 @@ static bool MakeUserDirs()
{
char path[512];
- if (GetConfigPath(path, sizeof(path), "obs-studio/basic") <= 0)
+ if (GetConfigPath(path, sizeof(path), "ebs-studio/basic") <= 0)
return false;
if (!do_mkdir(path))
return false;
- if (GetConfigPath(path, sizeof(path), "obs-studio/logs") <= 0)
+ if (GetConfigPath(path, sizeof(path), "ebs-studio/logs") <= 0)
return false;
if (!do_mkdir(path))
return false;
- if (GetConfigPath(path, sizeof(path), "obs-studio/profiler_data") <= 0)
+ if (GetConfigPath(path, sizeof(path), "ebs-studio/profiler_data") <= 0)
return false;
if (!do_mkdir(path))
return false;
#ifdef _WIN32
- if (GetConfigPath(path, sizeof(path), "obs-studio/crashes") <= 0)
+ if (GetConfigPath(path, sizeof(path), "ebs-studio/crashes") <= 0)
return false;
if (!do_mkdir(path))
return false;
- if (GetConfigPath(path, sizeof(path), "obs-studio/updates") <= 0)
+ if (GetConfigPath(path, sizeof(path), "ebs-studio/updates") <= 0)
return false;
if (!do_mkdir(path))
return false;
#endif
- if (GetConfigPath(path, sizeof(path), "obs-studio/plugin_config") <= 0)
+ if (GetConfigPath(path, sizeof(path), "ebs-studio/plugin_config") <= 0)
return false;
if (!do_mkdir(path))
return false;
@@ -483,12 +506,12 @@ static bool MakeUserProfileDirs()
{
char path[512];
- if (GetConfigPath(path, sizeof(path), "obs-studio/basic/profiles") <= 0)
+ if (GetConfigPath(path, sizeof(path), "ebs-studio/basic/profiles") <= 0)
return false;
if (!do_mkdir(path))
return false;
- if (GetConfigPath(path, sizeof(path), "obs-studio/basic/scenes") <= 0)
+ if (GetConfigPath(path, sizeof(path), "ebs-studio/basic/scenes") <= 0)
return false;
if (!do_mkdir(path))
return false;
@@ -502,7 +525,7 @@ static string GetProfileDirFromName(const char *name)
os_glob_t *glob;
char path[512];
- if (GetConfigPath(path, sizeof(path), "obs-studio/basic/profiles") <= 0)
+ if (GetConfigPath(path, sizeof(path), "ebs-studio/basic/profiles") <= 0)
return outputPath;
strcat(path, "/*");
@@ -548,7 +571,7 @@ static string GetSceneCollectionFileFromName(const char *name)
os_glob_t *glob;
char path[512];
- if (GetConfigPath(path, sizeof(path), "obs-studio/basic/scenes") <= 0)
+ if (GetConfigPath(path, sizeof(path), "ebs-studio/basic/scenes") <= 0)
return outputPath;
strcat(path, "/*.json");
@@ -587,13 +610,49 @@ static string GetSceneCollectionFileFromName(const char *name)
return outputPath;
}
+bool OBSApp::UpdatePre22MultiviewLayout(const char *layout)
+{
+ if (!layout)
+ return false;
+
+ if (astrcmpi(layout, "horizontaltop") == 0) {
+ config_set_int(globalConfig, "BasicWindow", "MultiviewLayout",
+ static_cast(
+ MultiviewLayout::HORIZONTAL_TOP_8_SCENES));
+ return true;
+ }
+
+ if (astrcmpi(layout, "horizontalbottom") == 0) {
+ config_set_int(globalConfig, "BasicWindow", "MultiviewLayout",
+ static_cast(
+ MultiviewLayout::HORIZONTAL_BOTTOM_8_SCENES));
+ return true;
+ }
+
+ if (astrcmpi(layout, "verticalleft") == 0) {
+ config_set_int(globalConfig, "BasicWindow", "MultiviewLayout",
+ static_cast(
+ MultiviewLayout::VERTICAL_LEFT_8_SCENES));
+ return true;
+ }
+
+ if (astrcmpi(layout, "verticalright") == 0) {
+ config_set_int(globalConfig, "BasicWindow", "MultiviewLayout",
+ static_cast(
+ MultiviewLayout::VERTICAL_RIGHT_8_SCENES));
+ return true;
+ }
+
+ return false;
+}
+
bool OBSApp::InitGlobalConfig()
{
char path[512];
bool changed = false;
int len = GetConfigPath(path, sizeof(path),
- "obs-studio/global.ini");
+ "ebs-studio/global.ini");
if (len <= 0) {
return false;
}
@@ -652,6 +711,13 @@ bool OBSApp::InitGlobalConfig()
changed = true;
}
+ if (config_has_user_value(globalConfig, "BasicWindow",
+ "MultiviewLayout")) {
+ const char *layout = config_get_string(globalConfig,
+ "BasicWindow", "MultiviewLayout");
+ changed |= UpdatePre22MultiviewLayout(layout);
+ }
+
if (changed)
config_save_safe(globalConfig, "tmp", nullptr);
@@ -726,6 +792,192 @@ bool OBSApp::InitLocale()
return true;
}
+void OBSApp::AddExtraThemeColor(QPalette &pal, int group,
+ const char *name, uint32_t color)
+{
+ std::function func;
+
+#define DEF_PALETTE_ASSIGN(name) \
+ do { \
+ func = [&] (QPalette::ColorGroup group) \
+ { \
+ pal.setColor(group, QPalette::name, \
+ QColor::fromRgb(color)); \
+ }; \
+ } while (false)
+
+ if (astrcmpi(name, "alternateBase") == 0) {
+ DEF_PALETTE_ASSIGN(AlternateBase);
+ } else if (astrcmpi(name, "base") == 0) {
+ DEF_PALETTE_ASSIGN(Base);
+ } else if (astrcmpi(name, "brightText") == 0) {
+ DEF_PALETTE_ASSIGN(BrightText);
+ } else if (astrcmpi(name, "button") == 0) {
+ DEF_PALETTE_ASSIGN(Button);
+ } else if (astrcmpi(name, "buttonText") == 0) {
+ DEF_PALETTE_ASSIGN(ButtonText);
+ } else if (astrcmpi(name, "brightText") == 0) {
+ DEF_PALETTE_ASSIGN(BrightText);
+ } else if (astrcmpi(name, "dark") == 0) {
+ DEF_PALETTE_ASSIGN(Dark);
+ } else if (astrcmpi(name, "highlight") == 0) {
+ DEF_PALETTE_ASSIGN(Highlight);
+ } else if (astrcmpi(name, "highlightedText") == 0) {
+ DEF_PALETTE_ASSIGN(HighlightedText);
+ } else if (astrcmpi(name, "light") == 0) {
+ DEF_PALETTE_ASSIGN(Light);
+ } else if (astrcmpi(name, "link") == 0) {
+ DEF_PALETTE_ASSIGN(Link);
+ } else if (astrcmpi(name, "linkVisited") == 0) {
+ DEF_PALETTE_ASSIGN(LinkVisited);
+ } else if (astrcmpi(name, "mid") == 0) {
+ DEF_PALETTE_ASSIGN(Mid);
+ } else if (astrcmpi(name, "midlight") == 0) {
+ DEF_PALETTE_ASSIGN(Midlight);
+ } else if (astrcmpi(name, "shadow") == 0) {
+ DEF_PALETTE_ASSIGN(Shadow);
+ } else if (astrcmpi(name, "text") == 0 ||
+ astrcmpi(name, "foreground") == 0) {
+ DEF_PALETTE_ASSIGN(Text);
+ } else if (astrcmpi(name, "toolTipBase") == 0) {
+ DEF_PALETTE_ASSIGN(ToolTipBase);
+ } else if (astrcmpi(name, "toolTipText") == 0) {
+ DEF_PALETTE_ASSIGN(ToolTipText);
+ } else if (astrcmpi(name, "windowText") == 0) {
+ DEF_PALETTE_ASSIGN(WindowText);
+ } else if (astrcmpi(name, "window") == 0 ||
+ astrcmpi(name, "background") == 0) {
+ DEF_PALETTE_ASSIGN(Window);
+ } else {
+ return;
+ }
+
+#undef DEF_PALETTE_ASSIGN
+
+ switch (group) {
+ case QPalette::Disabled:
+ case QPalette::Active:
+ case QPalette::Inactive:
+ func((QPalette::ColorGroup)group);
+ break;
+ default:
+ func((QPalette::ColorGroup)QPalette::Disabled);
+ func((QPalette::ColorGroup)QPalette::Active);
+ func((QPalette::ColorGroup)QPalette::Inactive);
+ }
+}
+
+struct CFParser {
+ cf_parser cfp = {};
+ inline ~CFParser() {cf_parser_free(&cfp);}
+ inline operator cf_parser*() {return &cfp;}
+ inline cf_parser *operator->() {return &cfp;}
+};
+
+void OBSApp::ParseExtraThemeData(const char *path)
+{
+ BPtr data = os_quick_read_utf8_file(path);
+ QPalette pal = palette();
+ CFParser cfp;
+ int ret;
+
+ cf_parser_parse(cfp, data, path);
+
+ while (cf_go_to_token(cfp, "OBSTheme", nullptr)) {
+ if (!cf_next_token(cfp)) return;
+
+ int group = -1;
+
+ if (cf_token_is(cfp, ":")) {
+ ret = cf_next_token_should_be(cfp, ":", nullptr,
+ nullptr);
+ if (ret != PARSE_SUCCESS) continue;
+
+ if (!cf_next_token(cfp)) return;
+
+ if (cf_token_is(cfp, "disabled")) {
+ group = QPalette::Disabled;
+ } else if (cf_token_is(cfp, "active")) {
+ group = QPalette::Active;
+ } else if (cf_token_is(cfp, "inactive")) {
+ group = QPalette::Inactive;
+ } else {
+ continue;
+ }
+
+ if (!cf_next_token(cfp)) return;
+ }
+
+ if (!cf_token_is(cfp, "{")) continue;
+
+ for (;;) {
+ if (!cf_next_token(cfp)) return;
+
+ ret = cf_token_is_type(cfp, CFTOKEN_NAME, "name",
+ nullptr);
+ if (ret != PARSE_SUCCESS)
+ break;
+
+ DStr name;
+ dstr_copy_strref(name, &cfp->cur_token->str);
+
+ ret = cf_next_token_should_be(cfp, ":", ";",
+ nullptr);
+ if (ret != PARSE_SUCCESS) continue;
+
+ if (!cf_next_token(cfp)) return;
+
+ const char *array;
+ uint32_t color = 0;
+
+ if (cf_token_is(cfp, "#")) {
+ array = cfp->cur_token->str.array;
+ color = strtol(array + 1, nullptr, 16);
+
+ } else if (cf_token_is(cfp, "rgb")) {
+ ret = cf_next_token_should_be(cfp, "(", ";",
+ nullptr);
+ if (ret != PARSE_SUCCESS) continue;
+ if (!cf_next_token(cfp)) return;
+
+ array = cfp->cur_token->str.array;
+ color |= strtol(array, nullptr, 10) << 16;
+
+ ret = cf_next_token_should_be(cfp, ",", ";",
+ nullptr);
+ if (ret != PARSE_SUCCESS) continue;
+ if (!cf_next_token(cfp)) return;
+
+ array = cfp->cur_token->str.array;
+ color |= strtol(array, nullptr, 10) << 8;
+
+ ret = cf_next_token_should_be(cfp, ",", ";",
+ nullptr);
+ if (ret != PARSE_SUCCESS) continue;
+ if (!cf_next_token(cfp)) return;
+
+ array = cfp->cur_token->str.array;
+ color |= strtol(array, nullptr, 10);
+
+ } else if (cf_token_is(cfp, "white")) {
+ color = 0xFFFFFF;
+
+ } else if (cf_token_is(cfp, "black")) {
+ color = 0;
+ }
+
+ if (!cf_go_to_token(cfp, ";", nullptr)) return;
+
+ AddExtraThemeColor(pal, group, name->array, color);
+ }
+
+ ret = cf_token_should_be(cfp, "}", "}", nullptr);
+ if (ret != PARSE_SUCCESS) continue;
+ }
+
+ setPalette(pal);
+}
+
bool OBSApp::SetTheme(std::string name, std::string path)
{
theme = name;
@@ -734,7 +986,7 @@ bool OBSApp::SetTheme(std::string name, std::string path)
if (path == "") {
char userDir[512];
name = "themes/" + name + ".qss";
- string temp = "obs-studio/" + name;
+ string temp = "ebs-studio/" + name;
int ret = GetConfigPath(userDir, sizeof(userDir),
temp.c_str());
@@ -747,12 +999,18 @@ bool OBSApp::SetTheme(std::string name, std::string path)
}
QString mpath = QString("file:///") + path.c_str();
+ setPalette(defaultPalette);
setStyleSheet(mpath);
+ ParseExtraThemeData(path.c_str());
+
+ emit StyleChanged();
return true;
}
bool OBSApp::InitTheme()
{
+ defaultPalette = palette();
+
const char *themeName = config_get_string(globalConfig, "General",
"CurrentTheme");
if (!themeName) {
@@ -805,13 +1063,13 @@ static void move_basic_to_profiles(void)
os_glob_t *glob;
/* if not first time use */
- if (GetConfigPath(path, 512, "obs-studio/basic") <= 0)
+ if (GetConfigPath(path, 512, "ebs-studio/basic") <= 0)
return;
if (!os_file_exists(path))
return;
/* if the profiles directory doesn't already exist */
- if (GetConfigPath(new_path, 512, "obs-studio/basic/profiles") <= 0)
+ if (GetConfigPath(new_path, 512, "ebs-studio/basic/profiles") <= 0)
return;
if (os_file_exists(new_path))
return;
@@ -858,12 +1116,12 @@ static void move_basic_to_scene_collections(void)
char path[512];
char new_path[512];
- if (GetConfigPath(path, 512, "obs-studio/basic") <= 0)
+ if (GetConfigPath(path, 512, "ebs-studio/basic") <= 0)
return;
if (!os_file_exists(path))
return;
- if (GetConfigPath(new_path, 512, "obs-studio/basic/scenes") <= 0)
+ if (GetConfigPath(new_path, 512, "ebs-studio/basic/scenes") <= 0)
return;
if (os_file_exists(new_path))
return;
@@ -915,6 +1173,9 @@ void OBSApp::AppInit()
EnableOSXVSync(false);
#endif
+ enableHotkeysInFocus = !config_get_bool(globalConfig, "General",
+ "DisableHotkeysInFocus");
+
move_basic_to_profiles();
move_basic_to_scene_collections();
@@ -935,54 +1196,66 @@ static bool StartupOBS(const char *locale, profiler_name_store_t *store)
{
char path[512];
- if (GetConfigPath(path, sizeof(path), "obs-studio/plugin_config") <= 0)
+ if (GetConfigPath(path, sizeof(path), "ebs-studio/plugin_config") <= 0)
return false;
return obs_startup(locale, path, store);
}
+inline void OBSApp::ResetHotkeyState(bool inFocus)
+{
+ obs_hotkey_enable_background_press(
+ inFocus || enableHotkeysInFocus);
+}
+
+void OBSApp::EnableInFocusHotkeys(bool enable)
+{
+ enableHotkeysInFocus = enable;
+ ResetHotkeyState(applicationState() != Qt::ApplicationActive);
+}
+
bool OBSApp::OBSInit()
{
ProfileScope("OBSApp::OBSInit");
- bool licenseAccepted = config_get_bool(globalConfig, "General",
- "LicenseAccepted");
- OBSLicenseAgreement agreement(nullptr);
+ setAttribute(Qt::AA_UseHighDpiPixmaps);
- if (licenseAccepted || agreement.exec() == QDialog::Accepted) {
- if (!licenseAccepted) {
- config_set_bool(globalConfig, "General",
- "LicenseAccepted", true);
- config_save(globalConfig);
- }
+ if (!StartupOBS(locale.c_str(), GetProfilerNameStore()))
+ return false;
- if (!StartupOBS(locale.c_str(), GetProfilerNameStore()))
- return false;
+#ifdef _WIN32
+ bool browserHWAccel = config_get_bool(globalConfig, "General",
+ "BrowserHWAccel");
- blog(LOG_INFO, "Portable mode: %s",
- portable_mode ? "true" : "false");
+ obs_data_t *settings = obs_data_create();
+ obs_data_set_bool(settings, "BrowserHWAccel", browserHWAccel);
+ obs_apply_private_data(settings);
+ obs_data_release(settings);
- setQuitOnLastWindowClosed(false);
+ blog(LOG_INFO, "Browser Hardware Acceleration: %s",
+ browserHWAccel ? "true" : "false");
+#endif
- mainWindow = new OBSBasic();
+ blog(LOG_INFO, "Portable mode: %s",
+ portable_mode ? "true" : "false");
- mainWindow->setAttribute(Qt::WA_DeleteOnClose, true);
- connect(mainWindow, SIGNAL(destroyed()), this, SLOT(quit()));
+ setQuitOnLastWindowClosed(false);
- mainWindow->OBSInit();
+ mainWindow = new OBSBasic();
- connect(this, &QGuiApplication::applicationStateChanged,
- [](Qt::ApplicationState state)
- {
- obs_hotkey_enable_background_press(
- state != Qt::ApplicationActive);
- });
- obs_hotkey_enable_background_press(
- applicationState() != Qt::ApplicationActive);
- return true;
- } else {
- return false;
- }
+ mainWindow->setAttribute(Qt::WA_DeleteOnClose, true);
+ connect(mainWindow, SIGNAL(destroyed()), this, SLOT(quit()));
+
+ mainWindow->OBSInit();
+
+ connect(this, &QGuiApplication::applicationStateChanged,
+ [this](Qt::ApplicationState state)
+ {
+ ResetHotkeyState(
+ state != Qt::ApplicationActive);
+ });
+ ResetHotkeyState(applicationState() != Qt::ApplicationActive);
+ return true;
}
string OBSApp::GetVersionString() const
@@ -1001,7 +1274,9 @@ string OBSApp::GetVersionString() const
#ifdef _WIN32
if (sizeof(void*) == 8)
- ver << "64bit, ";
+ ver << "64-bit, ";
+ else
+ ver << "32-bit, ";
ver << "windows)";
#elif __APPLE__
@@ -1051,6 +1326,11 @@ const char *OBSApp::GetCurrentLog() const
return currentLogFile.c_str();
}
+const char *OBSApp::GetLastCrashLog() const
+{
+ return lastCrashLogFile.c_str();
+}
+
bool OBSApp::TranslateString(const char *lookupVal, const char **out) const
{
for (obs_frontend_translate_ui_cb cb : translatorHooks) {
@@ -1097,13 +1377,18 @@ static bool expect_token(lexer *lex, const char *str, base_token_type type)
return strref_cmp(&token.text, str) == 0;
}
-static uint64_t convert_log_name(const char *name)
+static uint64_t convert_log_name(bool has_prefix, const char *name)
{
BaseLexer lex;
string year, month, day, hour, minute, second;
lexer_start(lex, name);
+ if (has_prefix) {
+ string temp;
+ if (!get_token(lex, temp, BASETOKEN_ALPHA)) return 0;
+ }
+
if (!get_token(lex, year, BASETOKEN_DIGIT)) return 0;
if (!expect_token(lex, "-", BASETOKEN_OTHER)) return 0;
if (!get_token(lex, month, BASETOKEN_DIGIT)) return 0;
@@ -1120,7 +1405,7 @@ static uint64_t convert_log_name(const char *name)
return std::stoull(timestring.str());
}
-static void delete_oldest_file(const char *location)
+static void delete_oldest_file(bool has_prefix, const char *location)
{
BPtr logDir(GetConfigPathPtr(location));
string oldestLog;
@@ -1138,7 +1423,8 @@ static void delete_oldest_file(const char *location)
if (entry->directory || *entry->d_name == '.')
continue;
- uint64_t ts = convert_log_name(entry->d_name);
+ uint64_t ts = convert_log_name(has_prefix,
+ entry->d_name);
if (ts) {
if (ts < oldest_ts) {
@@ -1161,9 +1447,10 @@ static void delete_oldest_file(const char *location)
}
}
-static void get_last_log(void)
+static void get_last_log(bool has_prefix, const char *subdir_to_use,
+ std::string &last)
{
- BPtr logDir(GetConfigPathPtr("obs-studio/logs"));
+ BPtr logDir(GetConfigPathPtr(subdir_to_use));
struct os_dirent *entry;
os_dir_t *dir = os_opendir(logDir);
uint64_t highest_ts = 0;
@@ -1173,11 +1460,12 @@ static void get_last_log(void)
if (entry->directory || *entry->d_name == '.')
continue;
- uint64_t ts = convert_log_name(entry->d_name);
+ uint64_t ts = convert_log_name(has_prefix,
+ entry->d_name);
if (ts > highest_ts) {
- lastLogFile = entry->d_name;
- highest_ts = ts;
+ last = entry->d_name;
+ highest_ts = ts;
}
}
@@ -1208,8 +1496,18 @@ string GenerateTimeDateFilename(const char *extension, bool noSpace)
string GenerateSpecifiedFilename(const char *extension, bool noSpace,
const char *format)
{
+ OBSBasic *main = reinterpret_cast(App()->GetMainWindow());
+ bool autoRemux = config_get_bool(main->Config(), "Video", "AutoRemux");
+
+ if ((strcmp(extension, "mp4") == 0) && autoRemux)
+ extension = "mkv";
+
BPtr filename = os_generate_formatted_filename(extension,
!noSpace, format);
+
+ remuxFilename = string(filename);
+ remuxAfterRecord = autoRemux;
+
return string(filename);
}
@@ -1240,10 +1538,13 @@ static void create_log_file(fstream &logFile)
{
stringstream dst;
- get_last_log();
+ get_last_log(false, "ebs-studio/logs", lastLogFile);
+#ifdef _WIN32
+ get_last_log(true, "ebs-studio/crashes", lastCrashLogFile);
+#endif
currentLogFile = GenerateTimeDateFilename("txt");
- dst << "obs-studio/logs/" << currentLogFile.c_str();
+ dst << "ebs-studio/logs/" << currentLogFile.c_str();
BPtr path(GetConfigPathPtr(dst.str().c_str()));
@@ -1258,7 +1559,7 @@ static void create_log_file(fstream &logFile)
#endif
if (logFile.is_open()) {
- delete_oldest_file("obs-studio/logs");
+ delete_oldest_file(false, "ebs-studio/logs");
base_set_log_handler(do_log, &logFile);
} else {
blog(LOG_ERROR, "Failed to open log file");
@@ -1304,7 +1605,7 @@ static void SaveProfilerData(const ProfilerSnapshot &snap)
#define LITERAL_SIZE(x) x, (sizeof(x) - 1)
ostringstream dst;
- dst.write(LITERAL_SIZE("obs-studio/profiler_data/"));
+ dst.write(LITERAL_SIZE("ebs-studio/profiler_data/"));
dst.write(currentLogFile.c_str(), pos);
dst.write(LITERAL_SIZE(".csv.gz"));
#undef LITERAL_SIZE
@@ -1349,33 +1650,32 @@ static int run_program(fstream &logFile, int argc, char *argv[])
OBSApp program(argc, argv, profilerNameStore.get());
try {
+ bool created_log = false;
+
program.AppInit();
+ delete_oldest_file(false, "ebs-studio/profiler_data");
OBSTranslator translator;
-
- create_log_file(logFile);
- delete_oldest_file("obs-studio/profiler_data");
-
program.installTranslator(&translator);
#ifdef _WIN32
/* --------------------------------------- */
/* check and warn if already running */
+ bool cancel_launch = false;
bool already_running = false;
RunOnceMutex rom = GetRunOnceMutex(already_running);
- if (already_running && !multi) {
- blog(LOG_WARNING, "\n================================");
- blog(LOG_WARNING, "Warning: OBS is already running!");
- blog(LOG_WARNING, "================================\n");
+ if (!already_running) {
+ goto run;
+ }
+ if (!multi) {
QMessageBox::StandardButtons buttons(
QMessageBox::Yes | QMessageBox::Cancel);
QMessageBox mb(QMessageBox::Question,
QTStr("AlreadyRunning.Title"),
- QTStr("AlreadyRunning.Text"),
- buttons,
+ QTStr("AlreadyRunning.Text"), buttons,
nullptr);
mb.setButtonText(QMessageBox::Yes,
QTStr("AlreadyRunning.LaunchAnyway"));
@@ -1384,23 +1684,37 @@ static int run_program(fstream &logFile, int argc, char *argv[])
QMessageBox::StandardButton button;
button = (QMessageBox::StandardButton)mb.exec();
- if (button == QMessageBox::Cancel) {
- blog(LOG_INFO, "User shut down the program "
- "because OBS was already "
- "running");
- return 0;
- }
+ cancel_launch = button == QMessageBox::Cancel;
+ }
- blog(LOG_WARNING, "User is now running a secondary "
- "instance of OBS!");
+ if (cancel_launch)
+ return 0;
- } else if (already_running && multi) {
+ if (!created_log) {
+ create_log_file(logFile);
+ created_log = true;
+ }
+
+ if (multi) {
blog(LOG_INFO, "User enabled --multi flag and is now "
- "running multiple instances of OBS.");
+ "running multiple instances of EBS.");
+ } else {
+ blog(LOG_WARNING, "================================");
+ blog(LOG_WARNING, "Warning: EBS is already running!");
+ blog(LOG_WARNING, "================================");
+ blog(LOG_WARNING, "User is now running multiple "
+ "instances of EBS!");
}
/* --------------------------------------- */
+run:
#endif
+
+ if (!created_log) {
+ create_log_file(logFile);
+ created_log = true;
+ }
+
if (argc > 1) {
stringstream stor;
stor << argv[1];
@@ -1430,7 +1744,7 @@ static int run_program(fstream &logFile, int argc, char *argv[])
#ifdef _WIN32
#define CRASH_MESSAGE \
- "Woops, OBS has crashed!\n\nWould you like to copy the crash log " \
+ "Woops, EBS has crashed!\n\nWould you like to copy the crash log " \
"to the clipboard? (Crash logs will still be saved to the " \
"%appdata%\\obs-studio\\crashes directory)"
@@ -1441,9 +1755,9 @@ static void main_crash_handler(const char *format, va_list args, void *param)
vsnprintf(text, MAX_CRASH_REPORT_SIZE, format, args);
text[MAX_CRASH_REPORT_SIZE - 1] = 0;
- delete_oldest_file("obs-studio/crashes");
+ delete_oldest_file(true, "ebs-studio/crashes");
- string name = "obs-studio/crashes/Crash ";
+ string name = "ebs-studio/crashes/Crash ";
name += GenerateTimeDateFilename("txt");
BPtr path(GetConfigPathPtr(name.c_str()));
@@ -1462,7 +1776,7 @@ static void main_crash_handler(const char *format, va_list args, void *param)
file << text;
file.close();
- int ret = MessageBoxA(NULL, CRASH_MESSAGE, "OBS has crashed!",
+ int ret = MessageBoxA(NULL, CRASH_MESSAGE, "EBS has crashed!",
MB_YESNO | MB_ICONERROR | MB_TASKMODAL);
if (ret == IDYES) {
@@ -1656,7 +1970,7 @@ static void move_to_xdg(void)
if (os_mkdirs(new_path) == MKDIR_ERROR)
return;
- if (GetConfigPath(new_path, 512, "obs-studio") <= 0)
+ if (GetConfigPath(new_path, 512, "ebs-studio") <= 0)
return;
if (os_file_exists(old_path) && !os_file_exists(new_path)) {
@@ -1780,7 +2094,7 @@ static void convert_14_2_encoder_setting(const char *encoder, const char *file)
modified = true;
}
- if (!rc_item && astrcmpi(encoder, "obs_x264") == 0) {
+ if (!rc_item && astrcmpi(encoder, "ebs_x264") == 0) {
if (!cbr_item)
obs_data_set_string(data, "rate_control", "CBR");
else if (!cbr)
@@ -1800,7 +2114,7 @@ static void convert_14_2_encoder_setting(const char *encoder, const char *file)
static void upgrade_settings(void)
{
char path[512];
- int pathlen = GetConfigPath(path, 512, "obs-studio/basic/profiles");
+ int pathlen = GetConfigPath(path, 512, "ebs-studio/basic/profiles");
if (pathlen <= 0)
return;
@@ -1870,6 +2184,7 @@ int main(int argc, char *argv[])
#endif
#ifdef _WIN32
+ obs_init_win32_crash_handler();
SetErrorMode(SEM_FAILCRITICALERRORS);
load_debug_privilege();
base_set_crash_handler(main_crash_handler, nullptr);
@@ -1881,6 +2196,8 @@ int main(int argc, char *argv[])
move_to_xdg();
#endif
+ obs_set_cmdline_args(argc, argv);
+
for (int i = 1; i < argc; i++) {
if (arg_is(argv[i], "--portable", "-p")) {
portable_mode = true;
@@ -1947,7 +2264,7 @@ int main(int argc, char *argv[])
exit(0);
} else if (arg_is(argv[i], "--version", "-V")) {
- std::cout << "OBS Studio - " <<
+ std::cout << "EBS Studio - " <<
App()->GetVersionString() << "\n";
exit(0);
}
diff --git a/UI/obs-app.hpp b/UI/obs-app.hpp
index 53043ac3f..27b6cc3e7 100644
--- a/UI/obs-app.hpp
+++ b/UI/obs-app.hpp
@@ -73,13 +73,26 @@ class OBSApp : public QApplication {
os_inhibit_t *sleepInhibitor = nullptr;
int sleepInhibitRefs = 0;
+ bool enableHotkeysInFocus = true;
+
+
std::deque translatorHooks;
+ bool UpdatePre22MultiviewLayout(const char *layout);
+
bool InitGlobalConfig();
bool InitGlobalConfigDefaults();
bool InitLocale();
bool InitTheme();
+ inline void ResetHotkeyState(bool inFocus);
+
+ QPalette defaultPalette;
+
+ void ParseExtraThemeData(const char *path);
+ void AddExtraThemeColor(QPalette &pal, int group,
+ const char *name, uint32_t color);
+
public:
OBSApp(int &argc, char **argv, profiler_name_store_t *store);
~OBSApp();
@@ -87,6 +100,8 @@ class OBSApp : public QApplication {
void AppInit();
bool OBSInit();
+ void EnableInFocusHotkeys(bool enable);
+
inline QMainWindow *GetMainWindow() const {return mainWindow.data();}
inline config_t *GlobalConfig() const {return globalConfig;}
@@ -116,6 +131,8 @@ class OBSApp : public QApplication {
const char *GetLastLog() const;
const char *GetCurrentLog() const;
+ const char *GetLastCrashLog() const;
+
std::string GetVersionString() const;
bool IsPortableMode();
@@ -148,6 +165,9 @@ class OBSApp : public QApplication {
{
translatorHooks.pop_front();
}
+
+signals:
+ void StyleChanged();
};
int GetConfigPath(char *path, size_t size, const char *name);
@@ -177,6 +197,10 @@ static inline int GetProfilePath(char *path, size_t size, const char *file)
}
extern bool portable_mode;
+
+extern bool remuxAfterRecord;
+extern std::string remuxFilename;
+
extern bool opt_start_streaming;
extern bool opt_start_recording;
extern bool opt_start_replaybuffer;
diff --git a/UI/obs-frontend-api/obs-frontend-api.cpp b/UI/obs-frontend-api/obs-frontend-api.cpp
index ee47fff00..c3c933ab8 100644
--- a/UI/obs-frontend-api/obs-frontend-api.cpp
+++ b/UI/obs-frontend-api/obs-frontend-api.cpp
@@ -148,6 +148,13 @@ void obs_frontend_set_current_scene_collection(const char *collection)
c->obs_frontend_set_current_scene_collection(collection);
}
+bool obs_frontend_add_scene_collection(const char *name)
+{
+ return callbacks_valid()
+ ? c->obs_frontend_add_scene_collection(name)
+ : false;
+}
+
char **obs_frontend_get_profiles(void)
{
if (!callbacks_valid())
@@ -297,6 +304,18 @@ void obs_frontend_save(void)
c->obs_frontend_save();
}
+void obs_frontend_defer_save_begin(void)
+{
+ if (callbacks_valid())
+ c->obs_frontend_defer_save_begin();
+}
+
+void obs_frontend_defer_save_end(void)
+{
+ if (callbacks_valid())
+ c->obs_frontend_defer_save_end();
+}
+
void obs_frontend_add_save_callback(obs_frontend_save_cb callback,
void *private_data)
{
diff --git a/UI/obs-frontend-api/obs-frontend-api.h b/UI/obs-frontend-api/obs-frontend-api.h
index 05483ff53..ae674943a 100644
--- a/UI/obs-frontend-api/obs-frontend-api.h
+++ b/UI/obs-frontend-api/obs-frontend-api.h
@@ -42,7 +42,8 @@ enum obs_frontend_event {
OBS_FRONTEND_EVENT_STUDIO_MODE_DISABLED,
OBS_FRONTEND_EVENT_PREVIEW_SCENE_CHANGED,
- OBS_FRONTEND_EVENT_SCENE_COLLECTION_CLEANUP
+ OBS_FRONTEND_EVENT_SCENE_COLLECTION_CLEANUP,
+ OBS_FRONTEND_EVENT_FINISHED_LOADING
};
/* ------------------------------------------------------------------------- */
@@ -95,6 +96,7 @@ EXPORT void obs_frontend_set_current_transition(obs_source_t *transition);
EXPORT char **obs_frontend_get_scene_collections(void);
EXPORT char *obs_frontend_get_current_scene_collection(void);
EXPORT void obs_frontend_set_current_scene_collection(const char *collection);
+EXPORT bool obs_frontend_add_scene_collection(const char *name);
EXPORT char **obs_frontend_get_profiles(void);
EXPORT char *obs_frontend_get_current_profile(void);
@@ -150,6 +152,8 @@ EXPORT void obs_frontend_replay_buffer_stop(void);
EXPORT bool obs_frontend_replay_buffer_active(void);
EXPORT void obs_frontend_save(void);
+EXPORT void obs_frontend_defer_save_begin(void);
+EXPORT void obs_frontend_defer_save_end(void);
EXPORT obs_output_t *obs_frontend_get_streaming_output(void);
EXPORT obs_output_t *obs_frontend_get_recording_output(void);
diff --git a/UI/obs-frontend-api/obs-frontend-internal.hpp b/UI/obs-frontend-api/obs-frontend-internal.hpp
index 0749d2ed5..b1a906418 100644
--- a/UI/obs-frontend-api/obs-frontend-internal.hpp
+++ b/UI/obs-frontend-api/obs-frontend-internal.hpp
@@ -26,6 +26,7 @@ struct obs_frontend_callbacks {
virtual char *obs_frontend_get_current_scene_collection(void)=0;
virtual void obs_frontend_set_current_scene_collection(
const char *collection)=0;
+ virtual bool obs_frontend_add_scene_collection(const char *name)=0;
virtual void obs_frontend_get_profiles(
std::vector &strings)=0;
@@ -61,7 +62,9 @@ struct obs_frontend_callbacks {
virtual config_t *obs_frontend_get_profile_config(void)=0;
virtual config_t *obs_frontend_get_global_config(void)=0;
- virtual void obs_frontend_save(void)=0;
+ virtual void obs_frontend_save(void) = 0;
+ virtual void obs_frontend_defer_save_begin(void) = 0;
+ virtual void obs_frontend_defer_save_end(void) = 0;
virtual void obs_frontend_add_save_callback(
obs_frontend_save_cb callback, void *private_data)=0;
virtual void obs_frontend_remove_save_callback(
diff --git a/UI/platform-osx.mm b/UI/platform-osx.mm
index 19b1a9cdc..6a0258197 100644
--- a/UI/platform-osx.mm
+++ b/UI/platform-osx.mm
@@ -31,7 +31,7 @@
bool GetDataFilePath(const char *data, string &output)
{
stringstream str;
- str << OBS_DATA_PATH "/obs-studio/" << data;
+ str << OBS_DATA_PATH "/ebs-studio/" << data;
output = str.str();
return !access(output.c_str(), R_OK);
}
@@ -168,3 +168,11 @@ void EnableOSXVSync(bool enable)
deferred_updates(enable ? 1 : 0);
}
}
+
+void EnableOSXDockIcon(bool enable)
+{
+ if (enable)
+ [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
+ else
+ [NSApp setActivationPolicy:NSApplicationActivationPolicyProhibited];
+}
diff --git a/UI/platform-windows.cpp b/UI/platform-windows.cpp
index 90740187a..5c16ebd2e 100644
--- a/UI/platform-windows.cpp
+++ b/UI/platform-windows.cpp
@@ -51,10 +51,10 @@ static inline bool check_path(const char* data, const char *path,
bool GetDataFilePath(const char *data, string &output)
{
- if (check_path(data, "data/obs-studio/", output))
+ if (check_path(data, "data/ebs-studio/", output))
return true;
- return check_path(data, OBS_DATA_PATH "/obs-studio/", output);
+ return check_path(data, OBS_DATA_PATH "/ebs-studio/", output);
}
bool InitApplicationBundle()
diff --git a/UI/platform-x11.cpp b/UI/platform-x11.cpp
index c6b02b9b3..387585697 100644
--- a/UI/platform-x11.cpp
+++ b/UI/platform-x11.cpp
@@ -41,7 +41,7 @@ static inline bool check_path(const char* data, const char *path,
return (access(output.c_str(), R_OK) == 0);
}
-#define INSTALL_DATA_PATH OBS_INSTALL_PREFIX OBS_DATA_PATH "/obs-studio/"
+#define INSTALL_DATA_PATH OBS_INSTALL_PREFIX OBS_DATA_PATH "/ebs-studio/"
bool GetDataFilePath(const char *data, string &output)
{
@@ -51,7 +51,7 @@ bool GetDataFilePath(const char *data, string &output)
return true;
}
- if (check_path(data, OBS_DATA_PATH "/obs-studio/", output))
+ if (check_path(data, OBS_DATA_PATH "/ebs-studio/", output))
return true;
if (check_path(data, INSTALL_DATA_PATH, output))
return true;
diff --git a/UI/platform.hpp b/UI/platform.hpp
index 5011e6050..4da23b3bd 100644
--- a/UI/platform.hpp
+++ b/UI/platform.hpp
@@ -63,4 +63,5 @@ RunOnceMutex GetRunOnceMutex(bool &already_running);
#ifdef __APPLE__
void EnableOSXVSync(bool enable);
+void EnableOSXDockIcon(bool enable);
#endif
diff --git a/UI/properties-view.cpp b/UI/properties-view.cpp
index 169b9f702..4a286b6ca 100644
--- a/UI/properties-view.cpp
+++ b/UI/properties-view.cpp
@@ -576,6 +576,10 @@ void OBSPropertiesView::AddEditableList(obs_property_t *prop,
for (size_t i = 0; i < count; i++) {
obs_data_t *item = obs_data_array_item(array, i);
list->addItem(QT_UTF8(obs_data_get_string(item, "value")));
+ list->setItemSelected(list->item((int)i),
+ obs_data_get_bool(item, "selected"));
+ list->setItemHidden(list->item((int)i),
+ obs_data_get_bool(item, "hidden"));
obs_data_release(item);
}
@@ -634,9 +638,16 @@ void OBSPropertiesView::AddColor(obs_property_t *prop, QFormLayout *layout,
button->setText(QTStr("Basic.PropertiesWindow.SelectColor"));
button->setToolTip(QT_UTF8(obs_property_long_description(prop)));
+ color.setAlpha(255);
+
+ QPalette palette = QPalette(color);
colorLabel->setFrameStyle(QFrame::Sunken | QFrame::Panel);
colorLabel->setText(color.name(QColor::HexArgb));
- colorLabel->setPalette(QPalette(color));
+ colorLabel->setPalette(palette);
+ colorLabel->setStyleSheet(
+ QString("background-color :%1; color: %2;")
+ .arg(palette.color(QPalette::Window).name(QColor::HexArgb))
+ .arg(palette.color(QPalette::WindowText).name(QColor::HexArgb)));
colorLabel->setAutoFillBackground(true);
colorLabel->setAlignment(Qt::AlignCenter);
colorLabel->setToolTip(QT_UTF8(obs_property_long_description(prop)));
@@ -1626,13 +1637,19 @@ bool WidgetInfo::ColorChanged(const char *setting)
#endif
color = QColorDialog::getColor(color, view, QT_UTF8(desc), options);
+ color.setAlpha(255);
if (!color.isValid())
return false;
QLabel *label = static_cast(widget);
label->setText(color.name(QColor::HexArgb));
- label->setPalette(QPalette(color));
+ QPalette palette = QPalette(color);
+ label->setPalette(palette);
+ label->setStyleSheet(
+ QString("background-color :%1; color: %2;")
+ .arg(palette.color(QPalette::Window).name(QColor::HexArgb))
+ .arg(palette.color(QPalette::WindowText).name(QColor::HexArgb)));
obs_data_set_int(view->settings, setting, color_to_int(color));
@@ -1646,11 +1663,18 @@ bool WidgetInfo::FontChanged(const char *setting)
uint32_t flags;
QFont font;
+ QFontDialog::FontDialogOptions options;
+
+#ifdef __APPLE__
+ options = QFontDialog::DontUseNativeDialog;
+#endif
+
if (!font_obj) {
- font = QFontDialog::getFont(&success, view);
+ QFont initial;
+ font = QFontDialog::getFont(&success, initial, view, "Pick a Font", options);
} else {
MakeQFont(font_obj, font);
- font = QFontDialog::getFont(&success, font, view);
+ font = QFontDialog::getFont(&success, font, view, "Pick a Font", options);
obs_data_release(font_obj);
}
@@ -1690,7 +1714,10 @@ void WidgetInfo::EditableListChanged()
obs_data_t *arrayItem = obs_data_create();
obs_data_set_string(arrayItem, "value",
QT_TO_UTF8(item->text()));
-
+ obs_data_set_bool(arrayItem, "selected",
+ item->isSelected());
+ obs_data_set_bool(arrayItem, "hidden",
+ item->isHidden());
obs_data_array_push_back(array, arrayItem);
obs_data_release(arrayItem);
}
diff --git a/UI/qt-display.cpp b/UI/qt-display.cpp
index 90bd9bebd..0640ca32e 100644
--- a/UI/qt-display.cpp
+++ b/UI/qt-display.cpp
@@ -6,6 +6,20 @@
#include
#include
+static inline long long color_to_int(QColor color)
+{
+ auto shift = [&](unsigned val, int shift)
+ {
+ return ((val & 0xff) << shift);
+ };
+
+ return shift(color.red(), 0) |
+ shift(color.green(), 8) |
+ shift(color.blue(), 16) |
+ shift(color.alpha(), 24);
+}
+
+
OBSQTDisplay::OBSQTDisplay(QWidget *parent, Qt::WindowFlags flags)
: QWidget(parent, flags)
{
@@ -39,6 +53,14 @@ OBSQTDisplay::OBSQTDisplay(QWidget *parent, Qt::WindowFlags flags)
connect(windowHandle(), &QWindow::visibleChanged, windowVisible);
connect(windowHandle(), &QWindow::screenChanged, sizeChanged);
+
+ this->setProperty("themeID", "displayBackgroundColor");
+}
+
+void OBSQTDisplay::SetDisplayBackgroundColor(const QColor &color)
+{
+ backgroundColor = (uint32_t)color_to_int(color);
+ obs_display_set_background_color(display, backgroundColor);
}
void OBSQTDisplay::CreateDisplay()
@@ -56,7 +78,7 @@ void OBSQTDisplay::CreateDisplay()
QTToGSWindow(winId(), info.window);
- display = obs_display_create(&info);
+ display = obs_display_create(&info, backgroundColor);
emit DisplayCreated(this);
}
diff --git a/UI/qt-display.hpp b/UI/qt-display.hpp
index 438100bf9..4c975cee2 100644
--- a/UI/qt-display.hpp
+++ b/UI/qt-display.hpp
@@ -5,6 +5,8 @@
class OBSQTDisplay : public QWidget {
Q_OBJECT
+ Q_PROPERTY(QColor displayBackgroundColor WRITE SetDisplayBackgroundColor
+ NOTIFY SetDisplayBackgroundColor)
OBSDisplay display;
@@ -23,4 +25,9 @@ class OBSQTDisplay : public QWidget {
virtual QPaintEngine *paintEngine() const override;
inline obs_display_t *GetDisplay() const {return display;}
+
+ uint32_t backgroundColor;
+
+private slots:
+ void SetDisplayBackgroundColor(const QColor &color);
};
diff --git a/UI/qt-wrappers.hpp b/UI/qt-wrappers.hpp
index 7899387bf..5273f9298 100644
--- a/UI/qt-wrappers.hpp
+++ b/UI/qt-wrappers.hpp
@@ -17,8 +17,10 @@
#pragma once
+#include
#include
#include
+#include
#include
#include
@@ -79,3 +81,10 @@ class SignalBlocker {
};
void DeleteLayout(QLayout *layout);
+
+static inline Qt::ConnectionType WaitConnection()
+{
+ return QThread::currentThread() == qApp->thread()
+ ? Qt::DirectConnection
+ : Qt::BlockingQueuedConnection;
+}
diff --git a/UI/slider-absoluteset-style.hpp b/UI/slider-absoluteset-style.hpp
index a94ebebdd..d275ad2f0 100644
--- a/UI/slider-absoluteset-style.hpp
+++ b/UI/slider-absoluteset-style.hpp
@@ -6,7 +6,7 @@ class SliderAbsoluteSetStyle : public QProxyStyle
{
public:
SliderAbsoluteSetStyle(const QString& baseStyle);
- SliderAbsoluteSetStyle(QStyle* baseStyle);
+ SliderAbsoluteSetStyle(QStyle* baseStyle = Q_NULLPTR);
int styleHint(QStyle::StyleHint hint, const QStyleOption* option,
const QWidget* widget, QStyleHintReturn* returnData) const;
};
diff --git a/UI/source-tree.cpp b/UI/source-tree.cpp
new file mode 100644
index 000000000..c86aea9cb
--- /dev/null
+++ b/UI/source-tree.cpp
@@ -0,0 +1,1399 @@
+#include "window-basic-main.hpp"
+#include "obs-app.hpp"
+#include "source-tree.hpp"
+#include "qt-wrappers.hpp"
+#include "visibility-checkbox.hpp"
+#include "locked-checkbox.hpp"
+#include "expand-checkbox.hpp"
+
+#include
+#include
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+static inline OBSScene GetCurrentScene()
+{
+ OBSBasic *main = reinterpret_cast(App()->GetMainWindow());
+ return main->GetCurrentScene();
+}
+
+/* ========================================================================= */
+
+SourceTreeItem::SourceTreeItem(SourceTree *tree_, OBSSceneItem sceneitem_)
+ : tree (tree_),
+ sceneitem (sceneitem_)
+{
+ setAttribute(Qt::WA_TranslucentBackground);
+
+ obs_source_t *source = obs_sceneitem_get_source(sceneitem);
+ const char *name = obs_source_get_name(source);
+
+ obs_data_t *privData = obs_sceneitem_get_private_settings(sceneitem);
+ int preset = obs_data_get_int(privData, "color-preset");
+
+ if (preset == 1) {
+ const char *color = obs_data_get_string(privData, "color");
+ std::string col = "background: ";
+ col += color;
+ setStyleSheet(col.c_str());
+ } else if (preset > 1) {
+ setStyleSheet("");
+ setProperty("bgColor", preset - 1);
+ } else {
+ setStyleSheet("background: none");
+ }
+
+ obs_data_release(privData);
+
+ vis = new VisibilityCheckBox();
+ vis->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
+ vis->setMaximumSize(16, 16);
+ vis->setChecked(obs_sceneitem_visible(sceneitem));
+
+ lock = new LockedCheckBox();
+ lock->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
+ lock->setMaximumSize(16, 16);
+ lock->setChecked(obs_sceneitem_locked(sceneitem));
+
+ label = new QLabel(QT_UTF8(name));
+ label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ label->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
+ label->setAttribute(Qt::WA_TranslucentBackground);
+
+#ifdef __APPLE__
+ vis->setAttribute(Qt::WA_LayoutUsesWidgetRect);
+ lock->setAttribute(Qt::WA_LayoutUsesWidgetRect);
+#endif
+
+ boxLayout = new QHBoxLayout();
+ boxLayout->setContentsMargins(1, 1, 2, 1);
+ boxLayout->setSpacing(1);
+ boxLayout->addWidget(label);
+ boxLayout->addWidget(vis);
+ boxLayout->addWidget(lock);
+#ifdef __APPLE__
+ /* Hack: Fixes a bug where scrollbars would be above the lock icon */
+ boxLayout->addSpacing(16);
+#endif
+
+ Update(false);
+
+ setLayout(boxLayout);
+
+ /* --------------------------------------------------------- */
+
+ auto setItemVisible = [this] (bool checked)
+ {
+ SignalBlocker sourcesSignalBlocker(this);
+ obs_sceneitem_set_visible(sceneitem, checked);
+ };
+
+ auto setItemLocked = [this] (bool checked)
+ {
+ SignalBlocker sourcesSignalBlocker(this);
+ obs_sceneitem_set_locked(sceneitem, checked);
+ };
+
+ connect(vis, &QAbstractButton::clicked, setItemVisible);
+ connect(lock, &QAbstractButton::clicked, setItemLocked);
+}
+
+void SourceTreeItem::paintEvent(QPaintEvent *event)
+{
+ QStyleOption opt;
+ opt.init(this);
+ QPainter p(this);
+ style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
+
+ QWidget::paintEvent(event);
+}
+
+void SourceTreeItem::DisconnectSignals()
+{
+ sceneRemoveSignal.Disconnect();
+ itemRemoveSignal.Disconnect();
+ deselectSignal.Disconnect();
+ visibleSignal.Disconnect();
+ renameSignal.Disconnect();
+ removeSignal.Disconnect();
+}
+
+void SourceTreeItem::ReconnectSignals()
+{
+ if (!sceneitem)
+ return;
+
+ DisconnectSignals();
+
+ /* --------------------------------------------------------- */
+
+ auto removeItem = [] (void *data, calldata_t *cd)
+ {
+ SourceTreeItem *this_ = reinterpret_cast(data);
+ obs_sceneitem_t *curItem =
+ (obs_sceneitem_t*)calldata_ptr(cd, "item");
+
+ if (curItem == this_->sceneitem) {
+ QMetaObject::invokeMethod(this_->tree,
+ "Remove",
+ Q_ARG(OBSSceneItem, curItem));
+ curItem = nullptr;
+ }
+ if (!curItem) {
+ this_->DisconnectSignals();
+ this_->sceneitem = nullptr;
+ }
+ };
+
+ auto itemVisible = [] (void *data, calldata_t *cd)
+ {
+ SourceTreeItem *this_ = reinterpret_cast(data);
+ obs_sceneitem_t *curItem =
+ (obs_sceneitem_t*)calldata_ptr(cd, "item");
+ bool visible = calldata_bool(cd, "visible");
+
+ if (curItem == this_->sceneitem)
+ QMetaObject::invokeMethod(this_, "VisibilityChanged",
+ Q_ARG(bool, visible));
+ };
+
+ auto itemDeselect = [] (void *data, calldata_t *cd)
+ {
+ SourceTreeItem *this_ = reinterpret_cast(data);
+ obs_sceneitem_t *curItem =
+ (obs_sceneitem_t*)calldata_ptr(cd, "item");
+
+ if (curItem == this_->sceneitem)
+ QMetaObject::invokeMethod(this_, "Deselect");
+ };
+
+ auto reorderGroup = [] (void *data, calldata_t*)
+ {
+ SourceTreeItem *this_ = reinterpret_cast(data);
+ QMetaObject::invokeMethod(this_->tree, "ReorderItems");
+ };
+
+ obs_scene_t *scene = obs_sceneitem_get_scene(sceneitem);
+ obs_source_t *sceneSource = obs_scene_get_source(scene);
+ signal_handler_t *signal = obs_source_get_signal_handler(sceneSource);
+
+ sceneRemoveSignal.Connect(signal, "remove", removeItem, this);
+ itemRemoveSignal.Connect(signal, "item_remove", removeItem, this);
+ visibleSignal.Connect(signal, "item_visible", itemVisible, this);
+
+ if (obs_sceneitem_is_group(sceneitem)) {
+ obs_source_t *source = obs_sceneitem_get_source(sceneitem);
+ signal = obs_source_get_signal_handler(source);
+
+ groupReorderSignal.Connect(signal, "reorder", reorderGroup,
+ this);
+ }
+
+ if (scene != GetCurrentScene())
+ deselectSignal.Connect(signal, "item_deselect", itemDeselect,
+ this);
+
+ /* --------------------------------------------------------- */
+
+ auto renamed = [] (void *data, calldata_t *cd)
+ {
+ SourceTreeItem *this_ = reinterpret_cast(data);
+ const char *name = calldata_string(cd, "new_name");
+
+ QMetaObject::invokeMethod(this_, "Renamed",
+ Q_ARG(QString, QT_UTF8(name)));
+ };
+
+ auto removeSource = [] (void *data, calldata_t *)
+ {
+ SourceTreeItem *this_ = reinterpret_cast(data);
+ this_->DisconnectSignals();
+ this_->sceneitem = nullptr;
+ };
+
+ obs_source_t *source = obs_sceneitem_get_source(sceneitem);
+ signal = obs_source_get_signal_handler(source);
+ renameSignal.Connect(signal, "rename", renamed, this);
+ removeSignal.Connect(signal, "remove", removeSource, this);
+}
+
+void SourceTreeItem::mouseDoubleClickEvent(QMouseEvent *event)
+{
+ QWidget::mouseDoubleClickEvent(event);
+
+ if (expand) {
+ expand->setChecked(!expand->isChecked());
+ } else {
+ obs_source_t *source = obs_sceneitem_get_source(sceneitem);
+ OBSBasic *main =
+ reinterpret_cast(App()->GetMainWindow());
+ if (source) {
+ main->CreatePropertiesWindow(source);
+ }
+ }
+}
+
+bool SourceTreeItem::IsEditing()
+{
+ return editor != nullptr;
+}
+
+void SourceTreeItem::EnterEditMode()
+{
+ setFocusPolicy(Qt::StrongFocus);
+ boxLayout->removeWidget(label);
+ editor = new QLineEdit(label->text());
+ editor->installEventFilter(this);
+ boxLayout->insertWidget(1, editor);
+ setFocusProxy(editor);
+}
+
+void SourceTreeItem::ExitEditMode(bool save)
+{
+ if (!editor)
+ return;
+
+ OBSBasic *main = reinterpret_cast(App()->GetMainWindow());
+ OBSScene scene = main->GetCurrentScene();
+
+ std::string newName = QT_TO_UTF8(editor->text());
+
+ setFocusProxy(nullptr);
+ boxLayout->removeWidget(editor);
+ delete editor;
+ editor = nullptr;
+ setFocusPolicy(Qt::NoFocus);
+ boxLayout->insertWidget(1, label);
+
+ /* ----------------------------------------- */
+ /* check for empty string */
+
+ if (!save)
+ return;
+
+ if (newName.empty()) {
+ OBSMessageBox::information(main,
+ QTStr("NoNameEntered.Title"),
+ QTStr("NoNameEntered.Text"));
+ return;
+ }
+
+ /* ----------------------------------------- */
+ /* Check for same name */
+
+ obs_source_t *source = obs_sceneitem_get_source(sceneitem);
+ if (newName == obs_source_get_name(source))
+ return;
+
+ /* ----------------------------------------- */
+ /* check for existing source */
+
+ obs_source_t *existingSource =
+ obs_get_source_by_name(newName.c_str());
+ obs_source_release(existingSource);
+ bool exists = !!existingSource;
+
+ if (exists) {
+ OBSMessageBox::information(main,
+ QTStr("NameExists.Title"),
+ QTStr("NameExists.Text"));
+ return;
+ }
+
+ /* ----------------------------------------- */
+ /* rename */
+
+ SignalBlocker sourcesSignalBlocker(this);
+ obs_source_set_name(source, newName.c_str());
+ label->setText(QT_UTF8(newName.c_str()));
+}
+
+bool SourceTreeItem::eventFilter(QObject *object, QEvent *event)
+{
+ if (editor != object)
+ return false;
+
+ if (event->type() == QEvent::KeyPress) {
+ QKeyEvent *keyEvent = static_cast(event);
+
+ switch (keyEvent->key()) {
+ case Qt::Key_Escape:
+ QMetaObject::invokeMethod(this, "ExitEditMode",
+ Qt::QueuedConnection,
+ Q_ARG(bool, false));
+ return true;
+ case Qt::Key_Tab:
+ case Qt::Key_Backtab:
+ case Qt::Key_Enter:
+ case Qt::Key_Return:
+ QMetaObject::invokeMethod(this, "ExitEditMode",
+ Qt::QueuedConnection,
+ Q_ARG(bool, true));
+ return true;
+ }
+ } else if (event->type() == QEvent::FocusOut) {
+ QMetaObject::invokeMethod(this, "ExitEditMode",
+ Qt::QueuedConnection,
+ Q_ARG(bool, true));
+ return true;
+ }
+
+ return false;
+}
+
+void SourceTreeItem::VisibilityChanged(bool visible)
+{
+ vis->setChecked(visible);
+}
+
+void SourceTreeItem::Renamed(const QString &name)
+{
+ label->setText(name);
+}
+
+void SourceTreeItem::Update(bool force)
+{
+ OBSScene scene = GetCurrentScene();
+ obs_scene_t *itemScene = obs_sceneitem_get_scene(sceneitem);
+
+ Type newType;
+
+ /* ------------------------------------------------- */
+ /* if it's a group item, insert group checkbox */
+
+ if (obs_sceneitem_is_group(sceneitem)) {
+ newType = Type::Group;
+
+ /* ------------------------------------------------- */
+ /* if it's a group sub-item */
+
+ } else if (itemScene != scene) {
+ newType = Type::SubItem;
+
+ /* ------------------------------------------------- */
+ /* if it's a regular item */
+
+ } else {
+ newType = Type::Item;
+ }
+
+ /* ------------------------------------------------- */
+
+ if (!force && newType == type) {
+ return;
+ }
+
+ /* ------------------------------------------------- */
+
+ ReconnectSignals();
+
+ if (spacer) {
+ boxLayout->removeItem(spacer);
+ delete spacer;
+ spacer = nullptr;
+ }
+
+ if (type == Type::Group) {
+ boxLayout->removeWidget(expand);
+ expand->deleteLater();
+ expand = nullptr;
+ }
+
+ type = newType;
+
+ if (type == Type::SubItem) {
+ spacer = new QSpacerItem(16, 1);
+ boxLayout->insertItem(0, spacer);
+
+ } else if (type == Type::Group) {
+ expand = new SourceTreeSubItemCheckBox();
+ expand->setSizePolicy(
+ QSizePolicy::Maximum,
+ QSizePolicy::Maximum);
+ expand->setMaximumSize(10, 16);
+ expand->setMinimumSize(10, 0);
+#ifdef __APPLE__
+ expand->setAttribute(Qt::WA_LayoutUsesWidgetRect);
+#endif
+ boxLayout->insertWidget(0, expand);
+
+ obs_data_t *data = obs_sceneitem_get_private_settings(sceneitem);
+ expand->blockSignals(true);
+ expand->setChecked(obs_data_get_bool(data, "collapsed"));
+ expand->blockSignals(false);
+ obs_data_release(data);
+
+ connect(expand, &QPushButton::toggled,
+ this, &SourceTreeItem::ExpandClicked);
+
+ } else {
+ spacer = new QSpacerItem(3, 1);
+ boxLayout->insertItem(0, spacer);
+ }
+}
+
+void SourceTreeItem::ExpandClicked(bool checked)
+{
+ OBSData data = obs_sceneitem_get_private_settings(sceneitem);
+ obs_data_release(data);
+
+ obs_data_set_bool(data, "collapsed", checked);
+
+ if (!checked)
+ tree->GetStm()->ExpandGroup(sceneitem);
+ else
+ tree->GetStm()->CollapseGroup(sceneitem);
+}
+
+void SourceTreeItem::Deselect()
+{
+ tree->SelectItem(sceneitem, false);
+}
+
+/* ========================================================================= */
+
+void SourceTreeModel::OBSFrontendEvent(enum obs_frontend_event event, void *ptr)
+{
+ SourceTreeModel *stm = reinterpret_cast(ptr);
+
+ switch ((int)event) {
+ case OBS_FRONTEND_EVENT_PREVIEW_SCENE_CHANGED:
+ stm->SceneChanged();
+ break;
+ case OBS_FRONTEND_EVENT_EXIT:
+ case OBS_FRONTEND_EVENT_SCENE_COLLECTION_CLEANUP:
+ stm->Clear();
+ break;
+ }
+}
+
+void SourceTreeModel::Clear()
+{
+ beginResetModel();
+ items.clear();
+ endResetModel();
+
+ hasGroups = false;
+}
+
+static bool enumItem(obs_scene_t*, obs_sceneitem_t *item, void *ptr)
+{
+ QVector &items =
+ *reinterpret_cast*>(ptr);
+
+ if (obs_sceneitem_is_group(item)) {
+ obs_data_t *data = obs_sceneitem_get_private_settings(item);
+
+ bool collapse = obs_data_get_bool(data, "collapsed");
+ if (!collapse) {
+ obs_scene_t *scene =
+ obs_sceneitem_group_get_scene(item);
+
+ obs_scene_enum_items(scene, enumItem, &items);
+ }
+
+ obs_data_release(data);
+ }
+
+ items.insert(0, item);
+ return true;
+}
+
+void SourceTreeModel::SceneChanged()
+{
+ OBSScene scene = GetCurrentScene();
+
+ beginResetModel();
+ items.clear();
+ obs_scene_enum_items(scene, enumItem, &items);
+ endResetModel();
+
+ UpdateGroupState(false);
+ st->ResetWidgets();
+
+ for (int i = 0; i < items.count(); i++) {
+ bool select = obs_sceneitem_selected(items[i]);
+ QModelIndex index = createIndex(i, 0);
+
+ st->selectionModel()->select(index, select
+ ? QItemSelectionModel::Select
+ : QItemSelectionModel::Deselect);
+ }
+}
+
+/* moves a scene item index (blame linux distros for using older Qt builds) */
+static inline void MoveItem(QVector &items, int oldIdx, int newIdx)
+{
+ OBSSceneItem item = items[oldIdx];
+ items.remove(oldIdx);
+ items.insert(newIdx, item);
+}
+
+/* reorders list optimally with model reorder funcs */
+void SourceTreeModel::ReorderItems()
+{
+ OBSScene scene = GetCurrentScene();
+
+ QVector newitems;
+ obs_scene_enum_items(scene, enumItem, &newitems);
+
+ /* if item list has changed size, do full reset */
+ if (newitems.count() != items.count()) {
+ SceneChanged();
+ return;
+ }
+
+ for (;;) {
+ int idx1Old = 0;
+ int idx1New = 0;
+ int count;
+ int i;
+
+ /* find first starting changed item index */
+ for (i = 0; i < newitems.count(); i++) {
+ obs_sceneitem_t *oldItem = items[i];
+ obs_sceneitem_t *newItem = newitems[i];
+ if (oldItem != newItem) {
+ idx1Old = i;
+ break;
+ }
+ }
+
+ /* if everything is the same, break */
+ if (i == newitems.count()) {
+ break;
+ }
+
+ /* find new starting index */
+ for (i = idx1Old + 1; i < newitems.count(); i++) {
+ obs_sceneitem_t *oldItem = items[idx1Old];
+ obs_sceneitem_t *newItem = newitems[i];
+
+ if (oldItem == newItem) {
+ idx1New = i;
+ break;
+ }
+ }
+
+ /* if item could not be found, do full reset */
+ if (i == newitems.count()) {
+ SceneChanged();
+ return;
+ }
+
+ /* get move count */
+ for (count = 1; (idx1New + count) < newitems.count(); count++) {
+ int oldIdx = idx1Old + count;
+ int newIdx = idx1New + count;
+
+ obs_sceneitem_t *oldItem = items[oldIdx];
+ obs_sceneitem_t *newItem = newitems[newIdx];
+
+ if (oldItem != newItem) {
+ break;
+ }
+ }
+
+ /* move items */
+ beginMoveRows(QModelIndex(), idx1Old, idx1Old + count - 1,
+ QModelIndex(), idx1New + count);
+ for (i = 0; i < count; i++) {
+ int to = idx1New + count;
+ if (to > idx1Old)
+ to--;
+ MoveItem(items, idx1Old, to);
+ }
+ endMoveRows();
+ }
+}
+
+void SourceTreeModel::Add(obs_sceneitem_t *item)
+{
+ if (obs_sceneitem_is_group(item)) {
+ SceneChanged();
+ } else {
+ beginInsertRows(QModelIndex(), 0, 0);
+ items.insert(0, item);
+ endInsertRows();
+
+ st->UpdateWidget(createIndex(0, 0, nullptr), item);
+ }
+}
+
+void SourceTreeModel::Remove(obs_sceneitem_t *item)
+{
+ int idx = -1;
+ for (int i = 0; i < items.count(); i++) {
+ if (items[i] == item) {
+ idx = i;
+ break;
+ }
+ }
+
+ if (idx == -1)
+ return;
+
+ int startIdx = idx;
+ int endIdx = idx;
+
+ bool is_group = obs_sceneitem_is_group(item);
+ if (is_group) {
+ obs_scene_t *scene = obs_sceneitem_group_get_scene(item);
+
+ for (int i = endIdx + 1; i < items.count(); i++) {
+ obs_sceneitem_t *subitem = items[i];
+ obs_scene_t *subscene =
+ obs_sceneitem_get_scene(subitem);
+
+ if (subscene == scene)
+ endIdx = i;
+ else
+ break;
+ }
+ }
+
+ beginRemoveRows(QModelIndex(), startIdx, endIdx);
+ items.remove(idx, endIdx - startIdx + 1);
+ endRemoveRows();
+
+ if (is_group)
+ UpdateGroupState(true);
+}
+
+OBSSceneItem SourceTreeModel::Get(int idx)
+{
+ if (idx == -1 || idx >= items.count())
+ return OBSSceneItem();
+ return items[idx];
+}
+
+SourceTreeModel::SourceTreeModel(SourceTree *st_)
+ : QAbstractListModel (st_),
+ st (st_)
+{
+ obs_frontend_add_event_callback(OBSFrontendEvent, this);
+}
+
+SourceTreeModel::~SourceTreeModel()
+{
+ obs_frontend_remove_event_callback(OBSFrontendEvent, this);
+}
+
+int SourceTreeModel::rowCount(const QModelIndex &parent) const
+{
+ return parent.isValid() ? 0 : items.count();
+}
+
+QVariant SourceTreeModel::data(const QModelIndex &, int) const
+{
+ return QVariant();
+}
+
+Qt::ItemFlags SourceTreeModel::flags(const QModelIndex &index) const
+{
+ if (!index.isValid())
+ return QAbstractListModel::flags(index) | Qt::ItemIsDropEnabled;
+
+ obs_sceneitem_t *item = items[index.row()];
+ bool is_group = obs_sceneitem_is_group(item);
+
+ return QAbstractListModel::flags(index) |
+ Qt::ItemIsEditable |
+ Qt::ItemIsDragEnabled |
+ (is_group ? Qt::ItemIsDropEnabled : Qt::NoItemFlags);
+}
+
+Qt::DropActions SourceTreeModel::supportedDropActions() const
+{
+ return QAbstractItemModel::supportedDropActions() | Qt::MoveAction;
+}
+
+QString SourceTreeModel::GetNewGroupName()
+{
+ OBSScene scene = GetCurrentScene();
+ QString name = QTStr("Group");
+
+ int i = 2;
+ for (;;) {
+ obs_source_t *group = obs_get_source_by_name(QT_TO_UTF8(name));
+ obs_source_release(group);
+ if (!group)
+ break;
+ name = QTStr("Basic.Main.Group").arg(QString::number(i++));
+ }
+
+ return name;
+}
+
+void SourceTreeModel::AddGroup()
+{
+ QString name = GetNewGroupName();
+ obs_sceneitem_t *group = obs_scene_add_group(GetCurrentScene(),
+ QT_TO_UTF8(name));
+ if (!group)
+ return;
+
+ beginInsertRows(QModelIndex(), 0, 0);
+ items.insert(0, group);
+ endInsertRows();
+
+ st->UpdateWidget(createIndex(0, 0, nullptr), group);
+ UpdateGroupState(true);
+
+ QMetaObject::invokeMethod(st, "Edit", Qt::QueuedConnection,
+ Q_ARG(int, 0));
+}
+
+void SourceTreeModel::GroupSelectedItems(QModelIndexList &indices)
+{
+ if (indices.count() == 0)
+ return;
+
+ OBSScene scene = GetCurrentScene();
+ QString name = GetNewGroupName();
+
+ QVector item_order;
+
+ for (int i = indices.count() - 1; i >= 0; i--) {
+ obs_sceneitem_t *item = items[indices[i].row()];
+ item_order << item;
+ }
+
+ obs_sceneitem_t *item = obs_scene_insert_group(
+ scene, QT_TO_UTF8(name),
+ item_order.data(), item_order.size());
+ if (!item) {
+ return;
+ }
+
+ for (obs_sceneitem_t *item : item_order)
+ obs_sceneitem_select(item, false);
+
+ int newIdx = indices[0].row();
+
+ beginInsertRows(QModelIndex(), newIdx, newIdx);
+ items.insert(newIdx, item);
+ endInsertRows();
+
+ for (int i = 0; i < indices.size(); i++) {
+ int fromIdx = indices[i].row() + 1;
+ int toIdx = newIdx + i + 1;
+ if (fromIdx != toIdx) {
+ beginMoveRows(QModelIndex(), fromIdx, fromIdx,
+ QModelIndex(), toIdx);
+ MoveItem(items, fromIdx, toIdx);
+ endMoveRows();
+ }
+ }
+
+ hasGroups = true;
+ st->UpdateWidgets(true);
+
+ obs_sceneitem_select(item, true);
+
+ QMetaObject::invokeMethod(st, "Edit", Qt::QueuedConnection,
+ Q_ARG(int, newIdx));
+}
+
+void SourceTreeModel::UngroupSelectedGroups(QModelIndexList &indices)
+{
+ if (indices.count() == 0)
+ return;
+
+ for (int i = indices.count() - 1; i >= 0; i--) {
+ obs_sceneitem_t *item = items[indices[i].row()];
+ obs_sceneitem_group_ungroup(item);
+ }
+
+ SceneChanged();
+}
+
+void SourceTreeModel::ExpandGroup(obs_sceneitem_t *item)
+{
+ int itemIdx = items.indexOf(item);
+ if (itemIdx == -1)
+ return;
+
+ itemIdx++;
+
+ obs_scene_t *scene = obs_sceneitem_group_get_scene(item);
+
+ QVector subItems;
+ obs_scene_enum_items(scene, enumItem, &subItems);
+
+ if (!subItems.size())
+ return;
+
+ beginInsertRows(QModelIndex(), itemIdx, itemIdx + subItems.size() - 1);
+ for (int i = 0; i < subItems.size(); i++)
+ items.insert(i + itemIdx, subItems[i]);
+ endInsertRows();
+
+ st->UpdateWidgets();
+}
+
+void SourceTreeModel::CollapseGroup(obs_sceneitem_t *item)
+{
+ int startIdx = -1;
+ int endIdx = -1;
+
+ obs_scene_t *scene = obs_sceneitem_group_get_scene(item);
+
+ for (int i = 0; i < items.size(); i++) {
+ obs_scene_t *itemScene = obs_sceneitem_get_scene(items[i]);
+
+ if (itemScene == scene) {
+ if (startIdx == -1)
+ startIdx = i;
+ endIdx = i;
+ }
+ }
+
+ if (startIdx == -1)
+ return;
+
+ beginRemoveRows(QModelIndex(), startIdx, endIdx);
+ items.remove(startIdx, endIdx - startIdx + 1);
+ endRemoveRows();
+}
+
+void SourceTreeModel::UpdateGroupState(bool update)
+{
+ bool nowHasGroups = false;
+ for (auto &item : items) {
+ if (obs_sceneitem_is_group(item)) {
+ nowHasGroups = true;
+ break;
+ }
+ }
+
+ if (nowHasGroups != hasGroups) {
+ hasGroups = nowHasGroups;
+ if (update) {
+ st->UpdateWidgets(true);
+ }
+ }
+}
+
+/* ========================================================================= */
+
+SourceTree::SourceTree(QWidget *parent_) : QListView(parent_)
+{
+ SourceTreeModel *stm_ = new SourceTreeModel(this);
+ setModel(stm_);
+ setStyleSheet(QString(
+ "*[bgColor=\"1\"]{background-color:rgba(255,68,68,33%);}" \
+ "*[bgColor=\"2\"]{background-color:rgba(255,255,68,33%);}" \
+ "*[bgColor=\"3\"]{background-color:rgba(68,255,68,33%);}" \
+ "*[bgColor=\"4\"]{background-color:rgba(68,255,255,33%);}" \
+ "*[bgColor=\"5\"]{background-color:rgba(68,68,255,33%);}" \
+ "*[bgColor=\"6\"]{background-color:rgba(255,68,255,33%);}" \
+ "*[bgColor=\"7\"]{background-color:rgba(68,68,68,33%);}" \
+ "*[bgColor=\"8\"]{background-color:rgba(255,255,255,33%);}"));
+}
+
+void SourceTree::ResetWidgets()
+{
+ OBSScene scene = GetCurrentScene();
+
+ SourceTreeModel *stm = GetStm();
+ stm->UpdateGroupState(false);
+
+ for (int i = 0; i < stm->items.count(); i++) {
+ QModelIndex index = stm->createIndex(i, 0, nullptr);
+ setIndexWidget(index, new SourceTreeItem(this, stm->items[i]));
+ }
+}
+
+void SourceTree::UpdateWidget(const QModelIndex &idx, obs_sceneitem_t *item)
+{
+ setIndexWidget(idx, new SourceTreeItem(this, item));
+}
+
+void SourceTree::UpdateWidgets(bool force)
+{
+ SourceTreeModel *stm = GetStm();
+
+ for (int i = 0; i < stm->items.size(); i++) {
+ obs_sceneitem_t *item = stm->items[i];
+ SourceTreeItem *widget = GetItemWidget(i);
+
+ if (!widget) {
+ UpdateWidget(stm->createIndex(i, 0), item);
+ } else {
+ widget->Update(force);
+ }
+ }
+}
+
+void SourceTree::SelectItem(obs_sceneitem_t *sceneitem, bool select)
+{
+ SourceTreeModel *stm = GetStm();
+ int i = 0;
+
+ for (; i < stm->items.count(); i++) {
+ if (stm->items[i] == sceneitem)
+ break;
+ }
+
+ if (i == stm->items.count())
+ return;
+
+ QModelIndex index = stm->createIndex(i, 0);
+ if (index.isValid())
+ selectionModel()->select(index, select
+ ? QItemSelectionModel::Select
+ : QItemSelectionModel::Deselect);
+}
+
+Q_DECLARE_METATYPE(OBSSceneItem);
+
+void SourceTree::mouseDoubleClickEvent(QMouseEvent *event)
+{
+ if (event->button() == Qt::LeftButton)
+ QListView::mouseDoubleClickEvent(event);
+}
+
+void SourceTree::dropEvent(QDropEvent *event)
+{
+ if (event->source() != this) {
+ QListView::dropEvent(event);
+ return;
+ }
+
+ OBSScene scene = GetCurrentScene();
+ SourceTreeModel *stm = GetStm();
+ auto &items = stm->items;
+ QModelIndexList indices = selectedIndexes();
+
+ DropIndicatorPosition indicator = dropIndicatorPosition();
+ int row = indexAt(event->pos()).row();
+ bool emptyDrop = row == -1;
+
+ if (emptyDrop) {
+ if (!items.size()) {
+ QListView::dropEvent(event);
+ return;
+ }
+
+ row = items.size() - 1;
+ indicator = QAbstractItemView::BelowItem;
+ }
+
+ /* --------------------------------------- */
+ /* store destination group if moving to a */
+ /* group */
+
+ obs_sceneitem_t *dropItem = items[row]; /* item being dropped on */
+ bool itemIsGroup = obs_sceneitem_is_group(dropItem);
+
+ obs_sceneitem_t *dropGroup = itemIsGroup
+ ? dropItem
+ : obs_sceneitem_get_group(scene, dropItem);
+
+ /* not a group if moving above the group */
+ if (indicator == QAbstractItemView::AboveItem && itemIsGroup)
+ dropGroup = nullptr;
+ if (emptyDrop)
+ dropGroup = nullptr;
+
+ /* --------------------------------------- */
+ /* remember to remove list items if */
+ /* dropping on collapsed group */
+
+ bool dropOnCollapsed = false;
+ if (dropGroup) {
+ obs_data_t *data = obs_sceneitem_get_private_settings(dropGroup);
+ dropOnCollapsed = obs_data_get_bool(data, "collapsed");
+ obs_data_release(data);
+ }
+
+ if (indicator == QAbstractItemView::BelowItem ||
+ indicator == QAbstractItemView::OnItem)
+ row++;
+
+ if (row < 0 || row > stm->items.count()) {
+ QListView::dropEvent(event);
+ return;
+ }
+
+ /* --------------------------------------- */
+ /* determine if any base group is selected */
+
+ bool hasGroups = false;
+ for (int i = 0; i < indices.size(); i++) {
+ obs_sceneitem_t *item = items[indices[i].row()];
+ if (obs_sceneitem_is_group(item)) {
+ hasGroups = true;
+ break;
+ }
+ }
+
+ /* --------------------------------------- */
+ /* if dropping a group, detect if it's */
+ /* below another group */
+
+ obs_sceneitem_t *itemBelow = row == stm->items.count()
+ ? nullptr
+ : stm->items[row];
+ if (hasGroups) {
+ if (!itemBelow ||
+ obs_sceneitem_get_group(scene, itemBelow) != dropGroup) {
+ indicator = QAbstractItemView::BelowItem;
+ dropGroup = nullptr;
+ dropOnCollapsed = false;
+ }
+ }
+
+ /* --------------------------------------- */
+ /* if dropping groups on other groups, */
+ /* disregard as invalid drag/drop */
+
+ if (dropGroup && hasGroups) {
+ QListView::dropEvent(event);
+ return;
+ }
+
+ /* --------------------------------------- */
+ /* if selection includes base group items, */
+ /* include all group sub-items and treat */
+ /* them all as one */
+
+ if (hasGroups) {
+ /* remove sub-items if selected */
+ for (int i = indices.size() - 1; i >= 0; i--) {
+ obs_sceneitem_t *item = items[indices[i].row()];
+ obs_scene_t *itemScene = obs_sceneitem_get_scene(item);
+
+ if (itemScene != scene) {
+ indices.removeAt(i);
+ }
+ }
+
+ /* add all sub-items of selected groups */
+ for (int i = indices.size() - 1; i >= 0; i--) {
+ obs_sceneitem_t *item = items[indices[i].row()];
+
+ if (obs_sceneitem_is_group(item)) {
+ for (int j = items.size() - 1; j >= 0; j--) {
+ obs_sceneitem_t *subitem = items[j];
+ obs_sceneitem_t *subitemGroup =
+ obs_sceneitem_get_group(scene,
+ subitem);
+
+ if (subitemGroup == item) {
+ QModelIndex idx =
+ stm->createIndex(j, 0);
+ indices.insert(i + 1, idx);
+ }
+ }
+ }
+ }
+ }
+
+ /* --------------------------------------- */
+ /* build persistent indices */
+
+ QList persistentIndices;
+ persistentIndices.reserve(indices.count());
+ for (QModelIndex &index : indices)
+ persistentIndices.append(index);
+ std::sort(persistentIndices.begin(), persistentIndices.end());
+
+ /* --------------------------------------- */
+ /* move all items to destination index */
+
+ int r = row;
+ for (auto &persistentIdx : persistentIndices) {
+ int from = persistentIdx.row();
+ int to = r;
+ int itemTo = to;
+
+ if (itemTo > from)
+ itemTo--;
+
+ if (itemTo != from) {
+ stm->beginMoveRows(QModelIndex(), from, from,
+ QModelIndex(), to);
+ MoveItem(items, from, itemTo);
+ stm->endMoveRows();
+ }
+
+ r = persistentIdx.row() + 1;
+ }
+
+ std::sort(persistentIndices.begin(), persistentIndices.end());
+ int firstIdx = persistentIndices.front().row();
+ int lastIdx = persistentIndices.back().row();
+
+ /* --------------------------------------- */
+ /* reorder scene items in back-end */
+
+ QVector orderList;
+ obs_sceneitem_t *lastGroup = nullptr;
+ int insertCollapsedIdx = 0;
+
+ auto insertCollapsed = [&] (obs_sceneitem_t *item)
+ {
+ struct obs_sceneitem_order_info info;
+ info.group = lastGroup;
+ info.item = item;
+
+ orderList.insert(insertCollapsedIdx++, info);
+ };
+
+ using insertCollapsed_t = decltype(insertCollapsed);
+
+ auto preInsertCollapsed = [] (obs_scene_t *, obs_sceneitem_t *item,
+ void *param)
+ {
+ (*reinterpret_cast(param))(item);
+ return true;
+ };
+
+ auto insertLastGroup = [&] ()
+ {
+ obs_data_t *data = obs_sceneitem_get_private_settings(lastGroup);
+ bool collapsed = obs_data_get_bool(data, "collapsed");
+ obs_data_release(data);
+
+ if (collapsed) {
+ insertCollapsedIdx = 0;
+ obs_sceneitem_group_enum_items(
+ lastGroup,
+ preInsertCollapsed,
+ &insertCollapsed);
+ }
+
+ struct obs_sceneitem_order_info info;
+ info.group = nullptr;
+ info.item = lastGroup;
+ orderList.insert(0, info);
+ };
+
+ auto updateScene = [&] ()
+ {
+ struct obs_sceneitem_order_info info;
+
+ for (int i = 0; i < items.size(); i++) {
+ obs_sceneitem_t *item = items[i];
+ obs_sceneitem_t *group;
+
+ if (obs_sceneitem_is_group(item)) {
+ if (lastGroup) {
+ insertLastGroup();
+ }
+ lastGroup = item;
+ continue;
+ }
+
+ if (!hasGroups && i >= firstIdx && i <= lastIdx)
+ group = dropGroup;
+ else
+ group = obs_sceneitem_get_group(scene, item);
+
+ if (lastGroup && lastGroup != group) {
+ insertLastGroup();
+ }
+
+ lastGroup = group;
+
+ info.group = group;
+ info.item = item;
+ orderList.insert(0, info);
+ }
+
+ if (lastGroup) {
+ insertLastGroup();
+ }
+
+ obs_scene_reorder_items2(scene,
+ orderList.data(), orderList.size());
+ };
+
+ using updateScene_t = decltype(updateScene);
+
+ auto preUpdateScene = [] (void *data, obs_scene_t *)
+ {
+ (*reinterpret_cast(data))();
+ };
+
+ ignoreReorder = true;
+ obs_scene_atomic_update(scene, preUpdateScene, &updateScene);
+ ignoreReorder = false;
+
+ /* --------------------------------------- */
+ /* remove items if dropped in to collapsed */
+ /* group */
+
+ if (dropOnCollapsed) {
+ stm->beginRemoveRows(QModelIndex(), firstIdx, lastIdx);
+ items.remove(firstIdx, lastIdx - firstIdx + 1);
+ stm->endRemoveRows();
+ }
+
+ /* --------------------------------------- */
+ /* update widgets and accept event */
+
+ UpdateWidgets(true);
+
+ event->accept();
+ event->setDropAction(Qt::CopyAction);
+
+ QListView::dropEvent(event);
+}
+
+void SourceTree::selectionChanged(
+ const QItemSelection &selected,
+ const QItemSelection &deselected)
+{
+ {
+ SignalBlocker sourcesSignalBlocker(this);
+ SourceTreeModel *stm = GetStm();
+
+ QModelIndexList selectedIdxs = selected.indexes();
+ QModelIndexList deselectedIdxs = deselected.indexes();
+
+ for (int i = 0; i < selectedIdxs.count(); i++) {
+ int idx = selectedIdxs[i].row();
+ obs_sceneitem_select(stm->items[idx], true);
+ }
+
+ for (int i = 0; i < deselectedIdxs.count(); i++) {
+ int idx = deselectedIdxs[i].row();
+ obs_sceneitem_select(stm->items[idx], false);
+ }
+ }
+ QListView::selectionChanged(selected, deselected);
+}
+
+void SourceTree::Edit(int row)
+{
+ SourceTreeModel *stm = GetStm();
+ if (row < 0 || row >= stm->items.count())
+ return;
+
+ QModelIndex index = stm->createIndex(row, 0);
+ QWidget *widget = indexWidget(index);
+ SourceTreeItem *itemWidget = reinterpret_cast(widget);
+ if (itemWidget->IsEditing())
+ return;
+
+ itemWidget->EnterEditMode();
+ edit(index);
+}
+
+bool SourceTree::MultipleBaseSelected() const
+{
+ SourceTreeModel *stm = GetStm();
+ QModelIndexList selectedIndices = selectedIndexes();
+
+ OBSScene scene = GetCurrentScene();
+
+ if (selectedIndices.size() < 1) {
+ return false;
+ }
+
+ for (auto &idx : selectedIndices) {
+ obs_sceneitem_t *item = stm->items[idx.row()];
+ if (obs_sceneitem_is_group(item)) {
+ return false;
+ }
+
+ obs_scene *itemScene = obs_sceneitem_get_scene(item);
+ if (itemScene != scene) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool SourceTree::GroupsSelected() const
+{
+ SourceTreeModel *stm = GetStm();
+ QModelIndexList selectedIndices = selectedIndexes();
+
+ OBSScene scene = GetCurrentScene();
+
+ if (selectedIndices.size() < 1) {
+ return false;
+ }
+
+ for (auto &idx : selectedIndices) {
+ obs_sceneitem_t *item = stm->items[idx.row()];
+ if (!obs_sceneitem_is_group(item)) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool SourceTree::GroupedItemsSelected() const
+{
+ SourceTreeModel *stm = GetStm();
+ QModelIndexList selectedIndices = selectedIndexes();
+ OBSScene scene = GetCurrentScene();
+
+ if (!selectedIndices.size()) {
+ return false;
+ }
+
+ for (auto &idx : selectedIndices) {
+ obs_sceneitem_t *item = stm->items[idx.row()];
+ obs_scene *itemScene = obs_sceneitem_get_scene(item);
+
+ if (itemScene != scene) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void SourceTree::Remove(OBSSceneItem item)
+{
+ OBSBasic *main = reinterpret_cast(App()->GetMainWindow());
+ GetStm()->Remove(item);
+ main->SaveProject();
+
+ if (!main->SavingDisabled()) {
+ obs_scene_t *scene = obs_sceneitem_get_scene(item);
+ obs_source_t *sceneSource = obs_scene_get_source(scene);
+ obs_source_t *itemSource = obs_sceneitem_get_source(item);
+ blog(LOG_INFO, "User Removed source '%s' (%s) from scene '%s'",
+ obs_source_get_name(itemSource),
+ obs_source_get_id(itemSource),
+ obs_source_get_name(sceneSource));
+ }
+}
+
+void SourceTree::GroupSelectedItems()
+{
+ QModelIndexList indices = selectedIndexes();
+ std::sort(indices.begin(), indices.end());
+ GetStm()->GroupSelectedItems(indices);
+}
+
+void SourceTree::UngroupSelectedGroups()
+{
+ QModelIndexList indices = selectedIndexes();
+ GetStm()->UngroupSelectedGroups(indices);
+}
+
+void SourceTree::AddGroup()
+{
+ GetStm()->AddGroup();
+}
diff --git a/UI/source-tree.hpp b/UI/source-tree.hpp
new file mode 100644
index 000000000..cacd950b8
--- /dev/null
+++ b/UI/source-tree.hpp
@@ -0,0 +1,178 @@
+#pragma once
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+class QLabel;
+class QCheckBox;
+class QLineEdit;
+class SourceTree;
+class QSpacerItem;
+class QHBoxLayout;
+class LockedCheckBox;
+class VisibilityCheckBox;
+class VisibilityItemWidget;
+
+class SourceTreeSubItemCheckBox : public QCheckBox {
+ Q_OBJECT
+};
+
+class SourceTreeItem : public QWidget {
+ Q_OBJECT
+
+ friend class SourceTree;
+ friend class SourceTreeModel;
+
+ void mouseDoubleClickEvent(QMouseEvent *event) override;
+
+ virtual bool eventFilter(QObject *object, QEvent *event) override;
+
+ void Update(bool force);
+
+ enum class Type {
+ Unknown,
+ Item,
+ Group,
+ SubItem,
+ };
+
+ void DisconnectSignals();
+ void ReconnectSignals();
+
+ Type type = Type::Unknown;
+
+public:
+ explicit SourceTreeItem(SourceTree *tree, OBSSceneItem sceneitem);
+ bool IsEditing();
+
+private:
+ QSpacerItem *spacer = nullptr;
+ QCheckBox *expand = nullptr;
+ VisibilityCheckBox *vis = nullptr;
+ LockedCheckBox *lock = nullptr;
+ QHBoxLayout *boxLayout = nullptr;
+ QLabel *label = nullptr;
+
+ QLineEdit *editor = nullptr;
+
+ SourceTree *tree;
+ OBSSceneItem sceneitem;
+ OBSSignal sceneRemoveSignal;
+ OBSSignal itemRemoveSignal;
+ OBSSignal groupReorderSignal;
+ OBSSignal deselectSignal;
+ OBSSignal visibleSignal;
+ OBSSignal renameSignal;
+ OBSSignal removeSignal;
+
+ virtual void paintEvent(QPaintEvent* event) override;
+
+private slots:
+ void EnterEditMode();
+ void ExitEditMode(bool save);
+
+ void VisibilityChanged(bool visible);
+ void Renamed(const QString &name);
+
+ void ExpandClicked(bool checked);
+
+ void Deselect();
+};
+
+class SourceTreeModel : public QAbstractListModel {
+ Q_OBJECT
+
+ friend class SourceTree;
+ friend class SourceTreeItem;
+
+ SourceTree *st;
+ QVector items;
+ bool hasGroups = false;
+
+ static void OBSFrontendEvent(enum obs_frontend_event event, void *ptr);
+ void Clear();
+ void SceneChanged();
+ void ReorderItems();
+
+ void Add(obs_sceneitem_t *item);
+ void Remove(obs_sceneitem_t *item);
+ OBSSceneItem Get(int idx);
+ QString GetNewGroupName();
+ void AddGroup();
+
+ void GroupSelectedItems(QModelIndexList &indices);
+ void UngroupSelectedGroups(QModelIndexList &indices);
+
+ void ExpandGroup(obs_sceneitem_t *item);
+ void CollapseGroup(obs_sceneitem_t *item);
+
+ void UpdateGroupState(bool update);
+
+public:
+ explicit SourceTreeModel(SourceTree *st);
+ ~SourceTreeModel();
+
+ virtual int rowCount(const QModelIndex &parent) const override;
+ virtual QVariant data(const QModelIndex &index, int role) const override;
+
+ virtual Qt::ItemFlags flags(const QModelIndex &index) const override;
+ virtual Qt::DropActions supportedDropActions() const override;
+};
+
+class SourceTree : public QListView {
+ Q_OBJECT
+
+ bool ignoreReorder = false;
+
+ friend class SourceTreeModel;
+ friend class SourceTreeItem;
+
+ void ResetWidgets();
+ void UpdateWidget(const QModelIndex &idx, obs_sceneitem_t *item);
+ void UpdateWidgets(bool force = false);
+
+ inline SourceTreeModel *GetStm() const
+ {
+ return reinterpret_cast(model());
+ }
+
+public:
+ inline SourceTreeItem *GetItemWidget(int idx)
+ {
+ QWidget *widget = indexWidget(GetStm()->createIndex(idx, 0));
+ return reinterpret_cast(widget);
+ }
+
+ explicit SourceTree(QWidget *parent = nullptr);
+
+ inline bool IgnoreReorder() const {return ignoreReorder;}
+ inline void Clear() {GetStm()->Clear();}
+
+ inline void Add(obs_sceneitem_t *item) {GetStm()->Add(item);}
+ inline OBSSceneItem Get(int idx) {return GetStm()->Get(idx);}
+ inline QString GetNewGroupName() {return GetStm()->GetNewGroupName();}
+
+ void SelectItem(obs_sceneitem_t *sceneitem, bool select);
+
+ bool MultipleBaseSelected() const;
+ bool GroupsSelected() const;
+ bool GroupedItemsSelected() const;
+
+public slots:
+ inline void ReorderItems() {GetStm()->ReorderItems();}
+ void Remove(OBSSceneItem item);
+ void GroupSelectedItems();
+ void UngroupSelectedGroups();
+ void AddGroup();
+ void Edit(int idx);
+
+protected:
+ virtual void mouseDoubleClickEvent(QMouseEvent *event) override;
+ virtual void dropEvent(QDropEvent *event) override;
+
+ virtual void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) override;
+};
diff --git a/UI/sparkle-updater.mm b/UI/sparkle-updater.mm
index 1baab8d18..75d2f8f3f 100644
--- a/UI/sparkle-updater.mm
+++ b/UI/sparkle-updater.mm
@@ -105,7 +105,7 @@ static inline bool bundle_matches(NSBundle *bundle)
return false;
NSRange r = [bundle.executablePath rangeOfString:@"Contents/MacOS/"];
- return [bundle.bundleIdentifier isEqual:@"com.obsproject.obs-studio"] &&
+ return [bundle.bundleIdentifier isEqual:@"com.evercast.ebs-studio"] &&
r.location != NSNotFound;
}
diff --git a/UI/visibility-checkbox.cpp b/UI/visibility-checkbox.cpp
index 5b73084e0..004a65c4d 100644
--- a/UI/visibility-checkbox.cpp
+++ b/UI/visibility-checkbox.cpp
@@ -7,10 +7,17 @@
VisibilityCheckBox::VisibilityCheckBox() : QCheckBox()
{
- checkedImage =
- QPixmap::fromImage(QImage(":/res/images/visible_mask.png"));
- uncheckedImage =
- QPixmap::fromImage(QImage(":/res/images/invisible_mask.png"));
+ QString checkedFile;
+ QString uncheckedFile;
+ if (devicePixelRatio() >= 2) {
+ checkedFile = ":/res/images/visible_mask@2x.png";
+ uncheckedFile = ":/res/images/invisible_mask@2x.png";
+ } else {
+ checkedFile = ":/res/images/visible_mask.png";
+ uncheckedFile = ":/res/images/invisible_mask.png";
+ }
+ checkedImage = QPixmap::fromImage(QImage(checkedFile));
+ uncheckedImage = QPixmap::fromImage(QImage(uncheckedFile));
setMinimumSize(16, 16);
setStyleSheet("outline: none;");
@@ -31,6 +38,5 @@ void VisibilityCheckBox::paintEvent(QPaintEvent *event)
palette().color(foregroundRole()));
QPainter p(this);
- p.drawPixmap(0, 0, image.width(), image.height(),
- QPixmap::fromImage(image));
+ p.drawPixmap(0, 0, 16, 16, QPixmap::fromImage(image));
}
diff --git a/UI/volume-control.cpp b/UI/volume-control.cpp
index 47019cc4a..80fbe1f6e 100644
--- a/UI/volume-control.cpp
+++ b/UI/volume-control.cpp
@@ -3,24 +3,17 @@
#include "obs-app.hpp"
#include "mute-checkbox.hpp"
#include "slider-absoluteset-style.hpp"
-#include
-#include
-#include
#include
#include
-#include
#include
-#include
#include
#include
#include
-#include
-#include
-#include
+#include
using namespace std;
-#define CLAMP(x, min, max) ((x) < min ? min : ((x) > max ? max : (x)))
+#define CLAMP(x, min, max) ((x) < (min) ? (min) : ((x) > (max) ? (max) : (x)))
QWeakPointer VolumeMeter::updateTimer;
@@ -33,9 +26,9 @@ void VolControl::OBSVolumeChanged(void *data, float db)
}
void VolControl::OBSVolumeLevel(void *data,
- const float magnitude[MAX_AUDIO_CHANNELS],
- const float peak[MAX_AUDIO_CHANNELS],
- const float inputPeak[MAX_AUDIO_CHANNELS])
+ const float magnitude[MAX_AUDIO_CHANNELS],
+ const float peak[MAX_AUDIO_CHANNELS],
+ const float inputPeak[MAX_AUDIO_CHANNELS])
{
VolControl *volControl = static_cast(data);
@@ -114,55 +107,24 @@ void VolControl::SetMeterDecayRate(qreal q)
volMeter->setPeakDecayRate(q);
}
-VolControl::VolControl(OBSSource source_, bool showConfig)
- : source (source_),
- levelTotal (0.0f),
- levelCount (0.0f),
- obs_fader (obs_fader_create(OBS_FADER_CUBIC)),
- obs_volmeter (obs_volmeter_create(OBS_FADER_LOG))
+void VolControl::setPeakMeterType(enum obs_peak_meter_type peakMeterType)
{
- QHBoxLayout *volLayout = new QHBoxLayout();
- QVBoxLayout *mainLayout = new QVBoxLayout();
- QHBoxLayout *textLayout = new QHBoxLayout();
- QHBoxLayout *botLayout = new QHBoxLayout();
+ volMeter->setPeakMeterType(peakMeterType);
+}
+VolControl::VolControl(OBSSource source_, bool showConfig, bool vertical)
+ : source (std::move(source_)),
+ levelTotal (0.0f),
+ levelCount (0.0f),
+ obs_fader (obs_fader_create(OBS_FADER_CUBIC)),
+ obs_volmeter (obs_volmeter_create(OBS_FADER_LOG)),
+ vertical (vertical)
+{
nameLabel = new QLabel();
volLabel = new QLabel();
- volMeter = new VolumeMeter(0, obs_volmeter);
mute = new MuteCheckBox();
- slider = new QSlider(Qt::Horizontal);
-
- QFont font = nameLabel->font();
- font.setPointSize(font.pointSize()-1);
-
QString sourceName = obs_source_get_name(source);
-
- nameLabel->setText(sourceName);
- nameLabel->setFont(font);
- volLabel->setFont(font);
- slider->setMinimum(0);
- slider->setMaximum(100);
-
-// slider->setMaximumHeight(13);
-
- textLayout->setContentsMargins(0, 0, 0, 0);
- textLayout->addWidget(nameLabel);
- textLayout->addWidget(volLabel);
- textLayout->setAlignment(nameLabel, Qt::AlignLeft);
- textLayout->setAlignment(volLabel, Qt::AlignRight);
-
- bool muted = obs_source_muted(source);
- mute->setChecked(muted);
- mute->setAccessibleName(
- QTStr("VolControl.Mute").arg(sourceName));
-
- volLayout->addWidget(slider);
- volLayout->addWidget(mute);
- volLayout->setSpacing(5);
-
- botLayout->setContentsMargins(0, 0, 0, 0);
- botLayout->setSpacing(0);
- botLayout->addLayout(volLayout);
+ setObjectName(sourceName);
if (showConfig) {
config = new QPushButton(this);
@@ -178,18 +140,99 @@ VolControl::VolControl(OBSSource source_, bool showConfig)
connect(config, &QAbstractButton::clicked,
this, &VolControl::EmitConfigClicked);
-
- botLayout->addWidget(config);
}
+ QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->setContentsMargins(4, 4, 4, 4);
mainLayout->setSpacing(2);
- mainLayout->addItem(textLayout);
- mainLayout->addWidget(volMeter);
- mainLayout->addItem(botLayout);
+
+ if (vertical) {
+ QHBoxLayout *nameLayout = new QHBoxLayout;
+ QHBoxLayout *controlLayout = new QHBoxLayout;
+ QHBoxLayout *volLayout = new QHBoxLayout;
+ QHBoxLayout *meterLayout = new QHBoxLayout;
+
+ volMeter = new VolumeMeter(nullptr, obs_volmeter, true);
+ slider = new QSlider(Qt::Vertical);
+
+ nameLayout->setAlignment(Qt::AlignCenter);
+ meterLayout->setAlignment(Qt::AlignCenter);
+ controlLayout->setAlignment(Qt::AlignCenter);
+ volLayout->setAlignment(Qt::AlignCenter);
+
+ nameLayout->setContentsMargins(0, 0, 0, 0);
+ nameLayout->setSpacing(0);
+ nameLayout->addWidget(nameLabel);
+
+ controlLayout->setContentsMargins(0, 0, 0, 0);
+ controlLayout->setSpacing(0);
+
+ if (showConfig)
+ controlLayout->addWidget(config);
+
+ controlLayout->addItem(new QSpacerItem(3, 0));
+ // Add Headphone (audio monitoring) widget here
+ controlLayout->addWidget(mute);
+
+ meterLayout->setContentsMargins(0, 0, 0, 0);
+ meterLayout->setSpacing(0);
+ meterLayout->addWidget(volMeter);
+ meterLayout->addWidget(slider);
+
+ volLayout->setContentsMargins(0, 0, 0, 0);
+ volLayout->setSpacing(0);
+ volLayout->addWidget(volLabel);
+
+ mainLayout->addItem(nameLayout);
+ mainLayout->addItem(volLayout);
+ mainLayout->addItem(meterLayout);
+ mainLayout->addItem(controlLayout);
+
+ setMaximumWidth(110);
+ } else {
+ QHBoxLayout *volLayout = new QHBoxLayout;
+ QHBoxLayout *textLayout = new QHBoxLayout;
+ QHBoxLayout *botLayout = new QHBoxLayout;
+
+ volMeter = new VolumeMeter(nullptr, obs_volmeter, false);
+ slider = new QSlider(Qt::Horizontal);
+
+ textLayout->setContentsMargins(0, 0, 0, 0);
+ textLayout->addWidget(nameLabel);
+ textLayout->addWidget(volLabel);
+ textLayout->setAlignment(nameLabel, Qt::AlignLeft);
+ textLayout->setAlignment(volLabel, Qt::AlignRight);
+
+ volLayout->addWidget(slider);
+ volLayout->addWidget(mute);
+ volLayout->setSpacing(5);
+
+ botLayout->setContentsMargins(0, 0, 0, 0);
+ botLayout->setSpacing(0);
+ botLayout->addLayout(volLayout);
+
+ if (showConfig)
+ botLayout->addWidget(config);
+
+ mainLayout->addItem(textLayout);
+ mainLayout->addWidget(volMeter);
+ mainLayout->addItem(botLayout);
+ }
setLayout(mainLayout);
+ QFont font = nameLabel->font();
+ font.setPointSize(font.pointSize()-1);
+
+ nameLabel->setText(sourceName);
+ nameLabel->setFont(font);
+ volLabel->setFont(font);
+ slider->setMinimum(0);
+ slider->setMaximum(100);
+
+ bool muted = obs_source_muted(source);
+ mute->setChecked(muted);
+ mute->setAccessibleName(QTStr("VolControl.Mute").arg(sourceName));
obs_fader_add_callback(obs_fader, OBSVolumeChanged, this);
obs_volmeter_add_callback(obs_volmeter, OBSVolumeLevel, this);
@@ -204,7 +247,17 @@ VolControl::VolControl(OBSSource source_, bool showConfig)
obs_fader_attach_source(obs_fader, source);
obs_volmeter_attach_source(obs_volmeter, source);
- slider->setStyle(new SliderAbsoluteSetStyle(slider->style()));
+ QString styleName = slider->style()->objectName();
+ QStyle *style;
+ style = QStyleFactory::create(styleName);
+ if (!style) {
+ style = new SliderAbsoluteSetStyle();
+ } else {
+ style = new SliderAbsoluteSetStyle(style);
+ }
+
+ style->setParent(slider);
+ slider->setStyle(style);
/* Call volume changed once to init the slider position and label */
VolumeChanged();
@@ -229,7 +282,7 @@ QColor VolumeMeter::getBackgroundNominalColor() const
void VolumeMeter::setBackgroundNominalColor(QColor c)
{
- backgroundNominalColor = c;
+ backgroundNominalColor = std::move(c);
}
QColor VolumeMeter::getBackgroundWarningColor() const
@@ -239,7 +292,7 @@ QColor VolumeMeter::getBackgroundWarningColor() const
void VolumeMeter::setBackgroundWarningColor(QColor c)
{
- backgroundWarningColor = c;
+ backgroundWarningColor = std::move(c);
}
QColor VolumeMeter::getBackgroundErrorColor() const
@@ -249,7 +302,7 @@ QColor VolumeMeter::getBackgroundErrorColor() const
void VolumeMeter::setBackgroundErrorColor(QColor c)
{
- backgroundErrorColor = c;
+ backgroundErrorColor = std::move(c);
}
QColor VolumeMeter::getForegroundNominalColor() const
@@ -259,7 +312,7 @@ QColor VolumeMeter::getForegroundNominalColor() const
void VolumeMeter::setForegroundNominalColor(QColor c)
{
- foregroundNominalColor = c;
+ foregroundNominalColor = std::move(c);
}
QColor VolumeMeter::getForegroundWarningColor() const
@@ -269,7 +322,7 @@ QColor VolumeMeter::getForegroundWarningColor() const
void VolumeMeter::setForegroundWarningColor(QColor c)
{
- foregroundWarningColor = c;
+ foregroundWarningColor = std::move(c);
}
QColor VolumeMeter::getForegroundErrorColor() const
@@ -279,7 +332,7 @@ QColor VolumeMeter::getForegroundErrorColor() const
void VolumeMeter::setForegroundErrorColor(QColor c)
{
- foregroundErrorColor = c;
+ foregroundErrorColor = std::move(c);
}
QColor VolumeMeter::getClipColor() const
@@ -289,7 +342,7 @@ QColor VolumeMeter::getClipColor() const
void VolumeMeter::setClipColor(QColor c)
{
- clipColor = c;
+ clipColor = std::move(c);
}
QColor VolumeMeter::getMagnitudeColor() const
@@ -299,7 +352,7 @@ QColor VolumeMeter::getMagnitudeColor() const
void VolumeMeter::setMagnitudeColor(QColor c)
{
- magnitudeColor = c;
+ magnitudeColor = std::move(c);
}
QColor VolumeMeter::getMajorTickColor() const
@@ -309,7 +362,7 @@ QColor VolumeMeter::getMajorTickColor() const
void VolumeMeter::setMajorTickColor(QColor c)
{
- majorTickColor = c;
+ majorTickColor = std::move(c);
}
QColor VolumeMeter::getMinorTickColor() const
@@ -319,7 +372,7 @@ QColor VolumeMeter::getMinorTickColor() const
void VolumeMeter::setMinorTickColor(QColor c)
{
- minorTickColor = c;
+ minorTickColor = std::move(c);
}
qreal VolumeMeter::getMinimumLevel() const
@@ -412,8 +465,43 @@ void VolumeMeter::setInputPeakHoldDuration(qreal v)
inputPeakHoldDuration = v;
}
-VolumeMeter::VolumeMeter(QWidget *parent, obs_volmeter_t *obs_volmeter)
- : QWidget(parent), obs_volmeter(obs_volmeter)
+void VolumeMeter::setPeakMeterType(enum obs_peak_meter_type peakMeterType)
+{
+ obs_volmeter_set_peak_meter_type(obs_volmeter, peakMeterType);
+ switch (peakMeterType) {
+ case TRUE_PEAK_METER:
+ // For true-peak meters EBU has defined the Permitted Maximum,
+ // taking into account the accuracy of the meter and further
+ // processing required by lossy audio compression.
+ //
+ // The alignment level was not specified, but I've adjusted
+ // it compared to a sample-peak meter. Incidently Youtube
+ // uses this new Alignment Level as the maximum integrated
+ // loudness of a video.
+ //
+ // * Permitted Maximum Level (PML) = -2.0 dBTP
+ // * Alignment Level (AL) = -13 dBTP
+ setErrorLevel(-2.0);
+ setWarningLevel(-13.0);
+ break;
+
+ case SAMPLE_PEAK_METER:
+ default:
+ // For a sample Peak Meter EBU has the following level
+ // definitions, taking into account inaccuracies of this meter:
+ //
+ // * Permitted Maximum Level (PML) = -9.0 dBFS
+ // * Alignment Level (AL) = -20.0 dBFS
+ setErrorLevel(-9.0);
+ setWarningLevel(-20.0);
+ break;
+ }
+}
+
+VolumeMeter::VolumeMeter(QWidget *parent, obs_volmeter_t *obs_volmeter,
+ bool vertical)
+ : QWidget(parent), obs_volmeter(obs_volmeter),
+ vertical(vertical)
{
// Use a font that can be rendered small.
tickFont = QFont("Arial");
@@ -454,12 +542,12 @@ VolumeMeter::VolumeMeter(QWidget *parent, obs_volmeter_t *obs_volmeter)
VolumeMeter::~VolumeMeter()
{
updateTimerRef->RemoveVolControl(this);
+ delete tickPaintCache;
}
-void VolumeMeter::setLevels(
- const float magnitude[MAX_AUDIO_CHANNELS],
- const float peak[MAX_AUDIO_CHANNELS],
- const float inputPeak[MAX_AUDIO_CHANNELS])
+void VolumeMeter::setLevels(const float magnitude[MAX_AUDIO_CHANNELS],
+ const float peak[MAX_AUDIO_CHANNELS],
+ const float inputPeak[MAX_AUDIO_CHANNELS])
{
uint64_t ts = os_gettime_ns();
QMutexLocker locker(&dataMutex);
@@ -502,9 +590,12 @@ inline void VolumeMeter::handleChannelCofigurationChange()
if (displayNrAudioChannels != currentNrAudioChannels) {
displayNrAudioChannels = currentNrAudioChannels;
- // Make room for 3 pixels high meter, with one pixel between
- // each. Then 9 pixels below it for ticks and numbers.
- setMinimumSize(130, displayNrAudioChannels * 4 + 8);
+ // Make room for 3 pixels meter, with one pixel between each.
+ // Then 9/13 pixels for ticks and numbers.
+ if (vertical)
+ setMinimumSize(displayNrAudioChannels * 4 + 14, 130);
+ else
+ setMinimumSize(130, displayNrAudioChannels * 4 + 8);
resetLevels();
}
@@ -512,7 +603,7 @@ inline void VolumeMeter::handleChannelCofigurationChange()
inline bool VolumeMeter::detectIdle(uint64_t ts)
{
- float timeSinceLastUpdate = (ts - currentLastUpdateTime) * 0.000000001;
+ double timeSinceLastUpdate = (ts - currentLastUpdateTime) * 0.000000001;
if (timeSinceLastUpdate > 0.5) {
resetLevels();
return true;
@@ -522,7 +613,7 @@ inline bool VolumeMeter::detectIdle(uint64_t ts)
}
inline void VolumeMeter::calculateBallisticsForChannel(int channelNr,
- uint64_t ts, qreal timeSinceLastRedraw)
+ uint64_t ts, qreal timeSinceLastRedraw)
{
if (currentPeak[channelNr] >= displayPeak[channelNr] ||
isnan(displayPeak[channelNr])) {
@@ -532,7 +623,7 @@ inline void VolumeMeter::calculateBallisticsForChannel(int channelNr,
// Decay of peak is 40 dB / 1.7 seconds for Fast Profile
// 20 dB / 1.7 seconds for Medium Profile (Type I PPM)
// 24 dB / 2.8 seconds for Slow Profile (Type II PPM)
- qreal decay = peakDecayRate * timeSinceLastRedraw;
+ float decay = float(peakDecayRate * timeSinceLastRedraw);
displayPeak[channelNr] = CLAMP(displayPeak[channelNr] - decay,
currentPeak[channelNr], 0);
}
@@ -576,53 +667,52 @@ inline void VolumeMeter::calculateBallisticsForChannel(int channelNr,
if (!isfinite(displayMagnitude[channelNr])) {
// The statements in the else-leg do not work with
// NaN and infinite displayMagnitude.
- displayMagnitude[channelNr] =
- currentMagnitude[channelNr];
+ displayMagnitude[channelNr] = currentMagnitude[channelNr];
} else {
// A VU meter will integrate to the new value to 99% in 300 ms.
// The calculation here is very simplified and is more accurate
// with higher frame-rate.
- qreal attack = (currentMagnitude[channelNr] -
+ float attack = float((currentMagnitude[channelNr] -
displayMagnitude[channelNr]) *
(timeSinceLastRedraw /
- magnitudeIntegrationTime) * 0.99;
- displayMagnitude[channelNr] = CLAMP(
- displayMagnitude[channelNr] + attack,
- minimumLevel, 0);
+ magnitudeIntegrationTime) * 0.99);
+ displayMagnitude[channelNr] = CLAMP(displayMagnitude[channelNr]
+ + attack, (float)minimumLevel, 0);
}
}
inline void VolumeMeter::calculateBallistics(uint64_t ts,
- qreal timeSinceLastRedraw)
+ qreal timeSinceLastRedraw)
{
QMutexLocker locker(&dataMutex);
- for (int channelNr = 0; channelNr < MAX_AUDIO_CHANNELS; channelNr++) {
+ for (int channelNr = 0; channelNr < MAX_AUDIO_CHANNELS; channelNr++)
calculateBallisticsForChannel(channelNr, ts,
- timeSinceLastRedraw);
- }
+ timeSinceLastRedraw);
}
-void VolumeMeter::paintInputMeter(QPainter &painter, int x, int y,
- int width, int height, float peakHold)
+void VolumeMeter::paintInputMeter(QPainter &painter, int x, int y, int width,
+ int height, float peakHold)
{
QMutexLocker locker(&dataMutex);
+ QColor color;
- if (peakHold < minimumInputLevel) {
- painter.fillRect(x, y, width, height, backgroundNominalColor);
- } else if (peakHold < warningLevel) {
- painter.fillRect(x, y, width, height, foregroundNominalColor);
- } else if (peakHold < errorLevel) {
- painter.fillRect(x, y, width, height, foregroundWarningColor);
- } else if (peakHold <= clipLevel) {
- painter.fillRect(x, y, width, height, foregroundErrorColor);
- } else {
- painter.fillRect(x, y, width, height, clipColor);
- }
+ if (peakHold < minimumInputLevel)
+ color = backgroundNominalColor;
+ else if (peakHold < warningLevel)
+ color = foregroundNominalColor;
+ else if (peakHold < errorLevel)
+ color = foregroundWarningColor;
+ else if (peakHold <= clipLevel)
+ color = foregroundErrorColor;
+ else
+ color = clipColor;
+
+ painter.fillRect(x, y, width, height, color);
}
-void VolumeMeter::paintTicks(QPainter &painter, int x, int y,
- int width, int height)
+void VolumeMeter::paintHTicks(QPainter &painter, int x, int y, int width,
+ int height)
{
qreal scale = width / minimumLevel;
@@ -631,184 +721,257 @@ void VolumeMeter::paintTicks(QPainter &painter, int x, int y,
// Draw major tick lines and numeric indicators.
for (int i = 0; i >= minimumLevel; i-= 5) {
- int position = x + width - (i * scale) - 1;
+ int position = int(x + width - (i * scale) - 1);
QString str = QString::number(i);
- if (i == 0 || i == -5) {
+ if (i == 0 || i == -5)
painter.drawText(position - 3, height, str);
- } else {
+ else
painter.drawText(position - 5, height, str);
- }
painter.drawLine(position, y, position, y + 2);
}
// Draw minor tick lines.
painter.setPen(minorTickColor);
for (int i = 0; i >= minimumLevel; i--) {
- int position = x + width - (i * scale) - 1;
-
- if (i % 5 != 0) {
+ int position = int(x + width - (i * scale) - 1);
+ if (i % 5 != 0)
painter.drawLine(position, y, position, y + 1);
- }
}
}
-void VolumeMeter::paintMeter(QPainter &painter, int x, int y,
- int width, int height, float magnitude, float peak, float peakHold)
+void VolumeMeter::paintVTicks(QPainter &painter, int x, int y, int height)
+{
+ qreal scale = height / minimumLevel;
+
+ painter.setFont(tickFont);
+ painter.setPen(majorTickColor);
+
+ // Draw major tick lines and numeric indicators.
+ for (int i = 0; i >= minimumLevel; i-= 5) {
+ int position = y + int((i * scale) - 1);
+ QString str = QString::number(i);
+
+ if (i == 0)
+ painter.drawText(x + 5, position + 4, str);
+ else if (i == -60)
+ painter.drawText(x + 4, position, str);
+ else
+ painter.drawText(x + 4, position + 2, str);
+ painter.drawLine(x, position, x + 2, position);
+ }
+
+ // Draw minor tick lines.
+ painter.setPen(minorTickColor);
+ for (int i = 0; i >= minimumLevel; i--) {
+ int position = y + int((i * scale) - 1);
+ if (i % 5 != 0)
+ painter.drawLine(x, position, x + 1, position);
+ }
+}
+
+#define CLIP_FLASH_DURATION_MS 1000
+
+void VolumeMeter::ClipEnding()
+{
+ clipping = false;
+}
+
+void VolumeMeter::paintHMeter(QPainter &painter, int x, int y, int width,
+ int height, float magnitude, float peak, float peakHold)
{
qreal scale = width / minimumLevel;
QMutexLocker locker(&dataMutex);
int minimumPosition = x + 0;
int maximumPosition = x + width;
- int magnitudePosition = x + width - (magnitude * scale);
- int peakPosition = x + width - (peak * scale);
- int peakHoldPosition = x + width - (peakHold * scale);
- int warningPosition = x + width - (warningLevel * scale);
- int errorPosition = x + width - (errorLevel * scale);
+ int magnitudePosition = int(x + width - (magnitude * scale));
+ int peakPosition = int(x + width - (peak * scale));
+ int peakHoldPosition = int(x + width - (peakHold * scale));
+ int warningPosition = int(x + width - (warningLevel * scale));
+ int errorPosition = int(x + width - (errorLevel * scale));
int nominalLength = warningPosition - minimumPosition;
int warningLength = errorPosition - warningPosition;
int errorLength = maximumPosition - errorPosition;
locker.unlock();
- if (peakPosition < minimumPosition) {
- painter.fillRect(
- minimumPosition, y,
- nominalLength, height,
- backgroundNominalColor);
- painter.fillRect(
- warningPosition, y,
- warningLength, height,
- backgroundWarningColor);
- painter.fillRect(
- errorPosition, y,
- errorLength, height,
- backgroundErrorColor);
+ if (clipping) {
+ peakPosition = maximumPosition;
+ }
+ if (peakPosition < minimumPosition) {
+ painter.fillRect(minimumPosition, y, nominalLength, height,
+ backgroundNominalColor);
+ painter.fillRect(warningPosition, y, warningLength, height,
+ backgroundWarningColor);
+ painter.fillRect(errorPosition, y, errorLength, height,
+ backgroundErrorColor);
} else if (peakPosition < warningPosition) {
- painter.fillRect(
- minimumPosition, y,
- peakPosition - minimumPosition, height,
- foregroundNominalColor);
- painter.fillRect(
- peakPosition, y,
- warningPosition - peakPosition, height,
- backgroundNominalColor);
- painter.fillRect(
- warningPosition, y,
- warningLength, height,
- backgroundWarningColor);
- painter.fillRect(errorPosition, y,
- errorLength, height,
- backgroundErrorColor);
-
+ painter.fillRect(minimumPosition, y, peakPosition -
+ minimumPosition, height,
+ foregroundNominalColor);
+ painter.fillRect(peakPosition, y, warningPosition -
+ peakPosition, height, backgroundNominalColor);
+ painter.fillRect(warningPosition, y, warningLength, height,
+ backgroundWarningColor);
+ painter.fillRect(errorPosition, y, errorLength, height,
+ backgroundErrorColor);
} else if (peakPosition < errorPosition) {
- painter.fillRect(
- minimumPosition, y,
- nominalLength, height,
- foregroundNominalColor);
- painter.fillRect(
- warningPosition, y,
- peakPosition - warningPosition, height,
- foregroundWarningColor);
- painter.fillRect(
- peakPosition, y,
- errorPosition - peakPosition, height,
- backgroundWarningColor);
- painter.fillRect(
- errorPosition, y,
- errorLength, height,
- backgroundErrorColor);
-
+ painter.fillRect(minimumPosition, y, nominalLength, height,
+ foregroundNominalColor);
+ painter.fillRect(warningPosition, y,
+ peakPosition - warningPosition, height,
+ foregroundWarningColor);
+ painter.fillRect(peakPosition, y, errorPosition -
+ peakPosition, height, backgroundWarningColor);
+ painter.fillRect(errorPosition, y, errorLength, height,
+ backgroundErrorColor);
} else if (peakPosition < maximumPosition) {
- painter.fillRect(
- minimumPosition, y,
- nominalLength, height,
- foregroundNominalColor);
- painter.fillRect(
- warningPosition, y,
- warningLength, height,
- foregroundWarningColor);
- painter.fillRect(
- errorPosition, y,
- peakPosition - errorPosition, height,
- foregroundErrorColor);
- painter.fillRect(
- peakPosition, y,
- maximumPosition - peakPosition, height,
- backgroundErrorColor);
-
+ painter.fillRect(minimumPosition, y, nominalLength, height,
+ foregroundNominalColor);
+ painter.fillRect(warningPosition, y, warningLength, height,
+ foregroundWarningColor);
+ painter.fillRect(errorPosition, y, peakPosition - errorPosition,
+ height, foregroundErrorColor);
+ painter.fillRect(peakPosition, y,
+ maximumPosition - peakPosition, height,
+ backgroundErrorColor);
} else {
- qreal end = errorLength + warningLength + nominalLength;
- painter.fillRect(
- minimumPosition, y,
- end, height,
- QBrush(foregroundErrorColor));
- }
+ if (!clipping) {
+ QTimer::singleShot(CLIP_FLASH_DURATION_MS, this,
+ SLOT(ClipEnding()));
+ clipping = true;
+ }
- if (peakHoldPosition - 3 < minimumPosition) {
- // Peak-hold below minimum, no drawing.
+ int end = errorLength + warningLength + nominalLength;
+ painter.fillRect(minimumPosition, y, end, height,
+ QBrush(foregroundErrorColor));
+ }
- } else if (peakHoldPosition < warningPosition) {
- painter.fillRect(
- peakHoldPosition - 3, y,
- 3, height,
- foregroundNominalColor);
+ if (peakHoldPosition - 3 < minimumPosition)
+ ;// Peak-hold below minimum, no drawing.
+ else if (peakHoldPosition < warningPosition)
+ painter.fillRect(peakHoldPosition - 3, y, 3, height,
+ foregroundNominalColor);
+ else if (peakHoldPosition < errorPosition)
+ painter.fillRect(peakHoldPosition - 3, y, 3, height,
+ foregroundWarningColor);
+ else
+ painter.fillRect(peakHoldPosition - 3, y, 3, height,
+ foregroundErrorColor);
- } else if (peakHoldPosition < errorPosition) {
- painter.fillRect(
- peakHoldPosition - 3, y,
- 3, height,
- foregroundWarningColor);
+ if (magnitudePosition - 3 >= minimumPosition)
+ painter.fillRect(magnitudePosition - 3, y, 3, height,
+ magnitudeColor);
+}
- } else {
- painter.fillRect(
- peakHoldPosition - 3, y,
- 3, height,
- foregroundErrorColor);
- }
+void VolumeMeter::paintVMeter(QPainter &painter, int x, int y, int width,
+ int height, float magnitude, float peak, float peakHold)
+{
+ qreal scale = height / minimumLevel;
- if (magnitudePosition - 3 < minimumPosition) {
- // Magnitude below minimum, no drawing.
+ QMutexLocker locker(&dataMutex);
+ int minimumPosition = y + 0;
+ int maximumPosition = y + height;
+ int magnitudePosition = int(y + height - (magnitude * scale));
+ int peakPosition = int(y + height - (peak * scale));
+ int peakHoldPosition = int(y + height - (peakHold * scale));
+ int warningPosition = int(y + height - (warningLevel * scale));
+ int errorPosition = int(y + height - (errorLevel * scale));
- } else if (magnitudePosition < warningPosition) {
- painter.fillRect(
- magnitudePosition - 3, y,
- 3, height,
- magnitudeColor);
+ int nominalLength = warningPosition - minimumPosition;
+ int warningLength = errorPosition - warningPosition;
+ int errorLength = maximumPosition - errorPosition;
+ locker.unlock();
- } else if (magnitudePosition < errorPosition) {
- painter.fillRect(
- magnitudePosition - 3, y,
- 3, height,
- magnitudeColor);
+ if (clipping) {
+ peakPosition = maximumPosition;
+ }
+ if (peakPosition < minimumPosition) {
+ painter.fillRect(x, minimumPosition, width, nominalLength,
+ backgroundNominalColor);
+ painter.fillRect(x, warningPosition, width, warningLength,
+ backgroundWarningColor);
+ painter.fillRect(x, errorPosition, width, errorLength,
+ backgroundErrorColor);
+ } else if (peakPosition < warningPosition) {
+ painter.fillRect(x, minimumPosition, width, peakPosition -
+ minimumPosition, foregroundNominalColor);
+ painter.fillRect(x, peakPosition, width, warningPosition -
+ peakPosition, backgroundNominalColor);
+ painter.fillRect(x, warningPosition, width, warningLength,
+ backgroundWarningColor);
+ painter.fillRect(x, errorPosition, width, errorLength,
+ backgroundErrorColor);
+ } else if (peakPosition < errorPosition) {
+ painter.fillRect(x,minimumPosition, width, nominalLength,
+ foregroundNominalColor);
+ painter.fillRect(x, warningPosition, width, peakPosition -
+ warningPosition, foregroundWarningColor);
+ painter.fillRect(x, peakPosition, width, errorPosition -
+ peakPosition, backgroundWarningColor);
+ painter.fillRect(x, errorPosition, width, errorLength,
+ backgroundErrorColor);
+ } else if (peakPosition < maximumPosition) {
+ painter.fillRect(x, minimumPosition, width, nominalLength,
+ foregroundNominalColor);
+ painter.fillRect(x, warningPosition, width, warningLength,
+ foregroundWarningColor);
+ painter.fillRect(x, errorPosition, width, peakPosition -
+ errorPosition, foregroundErrorColor);
+ painter.fillRect(x, peakPosition, width, maximumPosition -
+ peakPosition, backgroundErrorColor);
} else {
- painter.fillRect(
- magnitudePosition - 3, y,
- 3, height,
- magnitudeColor);
+ if (!clipping) {
+ QTimer::singleShot(CLIP_FLASH_DURATION_MS, this,
+ SLOT(ClipEnding()));
+ clipping = true;
+ }
+
+ int end = errorLength + warningLength + nominalLength;
+ painter.fillRect(x, minimumPosition, width, end,
+ QBrush(foregroundErrorColor));
}
+
+ if (peakHoldPosition - 3 < minimumPosition)
+ ;// Peak-hold below minimum, no drawing.
+ else if (peakHoldPosition < warningPosition)
+ painter.fillRect(x, peakHoldPosition - 3, width, 3,
+ foregroundNominalColor);
+ else if (peakHoldPosition < errorPosition)
+ painter.fillRect(x, peakHoldPosition - 3, width, 3,
+ foregroundWarningColor);
+ else
+ painter.fillRect(x, peakHoldPosition - 3, width, 3,
+ foregroundErrorColor);
+
+ if (magnitudePosition - 3 >= minimumPosition)
+ painter.fillRect(x, magnitudePosition - 3, width, 3,
+ magnitudeColor);
}
void VolumeMeter::paintEvent(QPaintEvent *event)
{
- UNUSED_PARAMETER(event);
-
uint64_t ts = os_gettime_ns();
qreal timeSinceLastRedraw = (ts - lastRedrawTime) * 0.000000001;
- int width = size().width();
- int height = size().height();
+ const QRect rect = event->region().boundingRect();
+ int width = rect.width();
+ int height = rect.height();
handleChannelCofigurationChange();
calculateBallistics(ts, timeSinceLastRedraw);
bool idle = detectIdle(ts);
// Draw the ticks in a off-screen buffer when the widget changes size.
- QSize tickPaintCacheSize = QSize(width, 9);
- if (tickPaintCache == NULL ||
+ QSize tickPaintCacheSize;
+ if (vertical)
+ tickPaintCacheSize = QSize(14, height);
+ else
+ tickPaintCacheSize = QSize(width, 9);
+ if (tickPaintCache == nullptr ||
tickPaintCache->size() != tickPaintCacheSize) {
delete tickPaintCache;
tickPaintCache = new QPixmap(tickPaintCacheSize);
@@ -817,30 +980,56 @@ void VolumeMeter::paintEvent(QPaintEvent *event)
tickPaintCache->fill(clearColor);
QPainter tickPainter(tickPaintCache);
- paintTicks(tickPainter, 6, 0, tickPaintCacheSize.width() - 6,
- tickPaintCacheSize.height());
+ if (vertical) {
+ tickPainter.translate(0, height);
+ tickPainter.scale(1, -1);
+ paintVTicks(tickPainter, 0, 11,
+ tickPaintCacheSize.height() - 11);
+ } else {
+ paintHTicks(tickPainter, 6, 0,
+ tickPaintCacheSize.width() - 6,
+ tickPaintCacheSize.height());
+ }
tickPainter.end();
}
// Actual painting of the widget starts here.
QPainter painter(this);
- painter.drawPixmap(0, height - 9, *tickPaintCache);
+ if (vertical) {
+ // Invert the Y axis to ease the math
+ painter.translate(0, height);
+ painter.scale(1, -1);
+ painter.drawPixmap(displayNrAudioChannels * 4 - 1, 7,
+ *tickPaintCache);
+ } else {
+ painter.drawPixmap(0, height - 9, *tickPaintCache);
+ }
for (int channelNr = 0; channelNr < displayNrAudioChannels;
channelNr++) {
- paintMeter(painter,
- 5, channelNr * 4, width - 5, 3,
- displayMagnitude[channelNr], displayPeak[channelNr],
- displayPeakHold[channelNr]);
-
- if (!idle) {
- // By not drawing the input meter boxes the user can
- // see that the audio stream has been stopped, without
- // having too much visual impact.
- paintInputMeter(painter,
- 0, channelNr * 4, 3, 3,
- displayInputPeakHold[channelNr]);
- }
+ if (vertical)
+ paintVMeter(painter, channelNr * 4, 8, 3, height - 10,
+ displayMagnitude[channelNr],
+ displayPeak[channelNr],
+ displayPeakHold[channelNr]);
+ else
+ paintHMeter(painter, 5, channelNr * 4, width - 5, 3,
+ displayMagnitude[channelNr],
+ displayPeak[channelNr],
+ displayPeakHold[channelNr]);
+
+ if (idle)
+ continue;
+
+ // By not drawing the input meter boxes the user can
+ // see that the audio stream has been stopped, without
+ // having too much visual impact.
+ if (vertical)
+ paintInputMeter(painter, channelNr * 4, 3, 3, 3,
+ displayInputPeakHold[channelNr]);
+ else
+ paintInputMeter(painter, 0, channelNr * 4, 3, 3,
+ displayInputPeakHold[channelNr]);
}
lastRedrawTime = ts;
diff --git a/UI/volume-control.hpp b/UI/volume-control.hpp
index 390e684dc..fde0d12f4 100644
--- a/UI/volume-control.hpp
+++ b/UI/volume-control.hpp
@@ -2,6 +2,7 @@
#include
#include
+#include
#include
#include
#include
@@ -79,6 +80,9 @@ class VolumeMeter : public QWidget
READ getInputPeakHoldDuration
WRITE setInputPeakHoldDuration DESIGNABLE true)
+private slots:
+ void ClipEnding();
+
private:
obs_volmeter_t *obs_volmeter;
static QWeakPointer updateTimer;
@@ -92,12 +96,15 @@ class VolumeMeter : public QWidget
inline void calculateBallisticsForChannel(int channelNr,
uint64_t ts, qreal timeSinceLastRedraw);
- void paintInputMeter(QPainter &painter, int x, int y,
- int width, int height, float peakHold);
- void paintMeter(QPainter &painter, int x, int y,
- int width, int height,
- float magnitude, float peak, float peakHold);
- void paintTicks(QPainter &painter, int x, int y, int width, int height);
+ void paintInputMeter(QPainter &painter, int x, int y, int width,
+ int height, float peakHold);
+ void paintHMeter(QPainter &painter, int x, int y, int width, int height,
+ float magnitude, float peak, float peakHold);
+ void paintHTicks(QPainter &painter, int x, int y, int width,
+ int height);
+ void paintVMeter(QPainter &painter, int x, int y, int width, int height,
+ float magnitude, float peak, float peakHold);
+ void paintVTicks(QPainter &painter, int x, int y, int height);
QMutex dataMutex;
@@ -106,7 +113,7 @@ class VolumeMeter : public QWidget
float currentPeak[MAX_AUDIO_CHANNELS];
float currentInputPeak[MAX_AUDIO_CHANNELS];
- QPixmap *tickPaintCache = NULL;
+ QPixmap *tickPaintCache = nullptr;
int displayNrAudioChannels = 0;
float displayMagnitude[MAX_AUDIO_CHANNELS];
float displayPeak[MAX_AUDIO_CHANNELS];
@@ -137,10 +144,13 @@ class VolumeMeter : public QWidget
qreal inputPeakHoldDuration;
uint64_t lastRedrawTime = 0;
+ bool clipping = false;
+ bool vertical;
public:
- explicit VolumeMeter(QWidget *parent = 0,
- obs_volmeter_t *obs_volmeter = 0);
+ explicit VolumeMeter(QWidget *parent = nullptr,
+ obs_volmeter_t *obs_volmeter = nullptr,
+ bool vertical = false);
~VolumeMeter();
void setLevels(
@@ -186,9 +196,10 @@ class VolumeMeter : public QWidget
void setPeakHoldDuration(qreal v);
qreal getInputPeakHoldDuration() const;
void setInputPeakHoldDuration(qreal v);
+ void setPeakMeterType(enum obs_peak_meter_type peakMeterType);
protected:
- void paintEvent(QPaintEvent *event);
+ void paintEvent(QPaintEvent *event) override;
};
class VolumeMeterTimer : public QTimer {
@@ -201,7 +212,7 @@ class VolumeMeterTimer : public QTimer {
void RemoveVolControl(VolumeMeter *meter);
protected:
- virtual void timerEvent(QTimerEvent *event) override;
+ void timerEvent(QTimerEvent *event) override;
QList volumeMeters;
};
@@ -224,6 +235,7 @@ class VolControl : public QWidget {
float levelCount;
obs_fader_t *obs_fader;
obs_volmeter_t *obs_volmeter;
+ bool vertical;
static void OBSVolumeChanged(void *param, float db);
static void OBSVolumeLevel(void *data,
@@ -246,7 +258,8 @@ private slots:
void ConfigClicked();
public:
- VolControl(OBSSource source, bool showConfig = false);
+ explicit VolControl(OBSSource source, bool showConfig = false,
+ bool vertical = false);
~VolControl();
inline obs_source_t *GetSource() const {return source;}
@@ -255,4 +268,5 @@ private slots:
void SetName(const QString &newName);
void SetMeterDecayRate(qreal q);
+ void setPeakMeterType(enum obs_peak_meter_type peakMeterType);
};
diff --git a/UI/win-update/updater/CMakeLists.txt b/UI/win-update/updater/CMakeLists.txt
index 7d0e45c9c..a22ed8375 100644
--- a/UI/win-update/updater/CMakeLists.txt
+++ b/UI/win-update/updater/CMakeLists.txt
@@ -1,4 +1,4 @@
-if(NOT ENABLE_WIN_UPDATER)
+if(DISABLE_UPDATE_MODULE)
return()
endif()
@@ -36,7 +36,7 @@ set(updater_SOURCES
add_definitions(-DNOMINMAX -DUNICODE -D_UNICODE)
if(MSVC)
- add_compile_options("$<$:/MT>")
+ add_compile_options($,/MTd,/MT>)
endif()
add_executable(updater WIN32
diff --git a/UI/win-update/updater/hash.cpp b/UI/win-update/updater/hash.cpp
index 69033b036..73863a5b8 100644
--- a/UI/win-update/updater/hash.cpp
+++ b/UI/win-update/updater/hash.cpp
@@ -1,3 +1,19 @@
+/*
+ * Copyright (c) 2017-2018 Hugh Bailey
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
#include "updater.hpp"
#include
diff --git a/UI/win-update/updater/http.cpp b/UI/win-update/updater/http.cpp
index 13d0d9d89..04ef58a28 100644
--- a/UI/win-update/updater/http.cpp
+++ b/UI/win-update/updater/http.cpp
@@ -1,3 +1,19 @@
+/*
+ * Copyright (c) 2017-2018 Hugh Bailey
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
#include "Updater.hpp"
#include
diff --git a/UI/win-update/updater/patch.cpp b/UI/win-update/updater/patch.cpp
index a80116855..0593e04e0 100644
--- a/UI/win-update/updater/patch.cpp
+++ b/UI/win-update/updater/patch.cpp
@@ -1,9 +1,31 @@
+/*
+ * Copyright (c) 2017-2018 Hugh Bailey
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
#include "updater.hpp"
#include
#include
-#include
+#ifdef _MSC_VER
+# define restrict __restrict
+# include
+# undef restrict
+#else
+# include
+#endif
using namespace std;
@@ -234,7 +256,7 @@ try {
vector newData;
try {
- newData.resize(newsize);
+ newData.resize((size_t)newsize);
} catch (...) {
throw int(-1);
}
diff --git a/UI/win-update/updater/updater.cpp b/UI/win-update/updater/updater.cpp
index 443c7fe0f..93df309c5 100644
--- a/UI/win-update/updater/updater.cpp
+++ b/UI/win-update/updater/updater.cpp
@@ -1,20 +1,18 @@
-/******************************************************************************
- Copyright (C) 2017 Hugh Bailey
-
- This program 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 2 of the License, or
- (at your option) any later version.
-
- This program 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 this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
-******************************************************************************/
+/*
+ * Copyright (c) 2017-2018 Hugh Bailey
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
#include "updater.hpp"
@@ -59,50 +57,48 @@ void FreeWinHttpHandle(HINTERNET handle)
/* ----------------------------------------------------------------------- */
-// http://www.codeproject.com/Articles/320748/Haephrati-Elevating-during-runtime
-static bool IsAppRunningAsAdminMode()
+static inline bool is_64bit_windows(void);
+
+static inline bool HasVS2017Redist2()
{
- BOOL fIsRunAsAdmin = FALSE;
- DWORD dwError = ERROR_SUCCESS;
- PSID pAdministratorsGroup = nullptr;
-
- /* Allocate and initialize a SID of the administrators group. */
- SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
- if (!AllocateAndInitializeSid(&NtAuthority,
- 2,
- SECURITY_BUILTIN_DOMAIN_RID,
- DOMAIN_ALIAS_RID_ADMINS,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- &pAdministratorsGroup)) {
- dwError = GetLastError();
- goto Cleanup;
- }
+ wchar_t base[MAX_PATH];
+ wchar_t path[MAX_PATH];
+ WIN32_FIND_DATAW wfd;
+ HANDLE handle;
+ int folder = (is32bit && is_64bit_windows())
+ ? CSIDL_SYSTEMX86
+ : CSIDL_SYSTEM;
- /* Determine whether the SID of administrators group is enabled in the
- * primary access token of the process. */
- if (!CheckTokenMembership(nullptr, pAdministratorsGroup,
- &fIsRunAsAdmin)) {
- dwError = GetLastError();
- goto Cleanup;
- }
+ SHGetFolderPathW(NULL, folder, NULL, SHGFP_TYPE_CURRENT, base);
-Cleanup:
- /* Centralized cleanup for all allocated resources. */
- if (pAdministratorsGroup) {
- FreeSid(pAdministratorsGroup);
- pAdministratorsGroup = nullptr;
+ StringCbCopyW(path, sizeof(path), base);
+ StringCbCatW(path, sizeof(path), L"\\msvcp140.dll");
+ handle = FindFirstFileW(path, &wfd);
+ if (handle == INVALID_HANDLE_VALUE) {
+ return false;
+ } else {
+ FindClose(handle);
}
- /* Throw the error if something failed in the function. */
- if (ERROR_SUCCESS != dwError)
+ StringCbCopyW(path, sizeof(path), base);
+ StringCbCatW(path, sizeof(path), L"\\vcruntime140.dll");
+ handle = FindFirstFileW(path, &wfd);
+ if (handle == INVALID_HANDLE_VALUE) {
return false;
+ } else {
+ FindClose(handle);
+ }
+
+ return true;
+}
- return !!fIsRunAsAdmin;
+static bool HasVS2017Redist()
+{
+ PVOID old = nullptr;
+ bool redirect = !!Wow64DisableWow64FsRedirection(&old);
+ bool success = HasVS2017Redist2();
+ if (redirect) Wow64RevertWow64FsRedirection(old);
+ return success;
}
static void Status(const wchar_t *fmt, ...)
@@ -328,6 +324,8 @@ struct update_t {
memcpy(hash, from.hash, sizeof(hash));
memcpy(downloadhash, from.downloadhash, sizeof(downloadhash));
memcpy(my_hash, from.my_hash, sizeof(my_hash));
+
+ return *this;
}
};
@@ -360,11 +358,11 @@ bool DownloadWorkerThread()
WinHttpSetOption(hSession, WINHTTP_OPTION_SECURE_PROTOCOLS,
(LPVOID)&tlsProtocols, sizeof(tlsProtocols));
- HttpHandle hConnect = WinHttpConnect(hSession, L"obsproject.com",
+ HttpHandle hConnect = WinHttpConnect(hSession, L"cdn-fastly.obsproject.com",
INTERNET_DEFAULT_HTTPS_PORT, 0);
if (!hConnect) {
downloadThreadFailure = true;
- Status(L"Update failed: Couldn't connect to obsproject.com");
+ Status(L"Update failed: Couldn't connect to cdn-fastly.obsproject.com");
return false;
}
@@ -578,10 +576,18 @@ static inline bool FileExists(const wchar_t *path)
static bool NonCorePackageInstalled(const char *name)
{
- if (strcmp(name, "obs-browser") == 0) {
- return FileExists(L"obs-plugins\\32bit\\obs-browser.dll");
- } else if (strcmp(name, "realsense") == 0) {
- return FileExists(L"obs-plugins\\32bit\\win-ivcam.dll");
+ if (is32bit) {
+ if (strcmp(name, "obs-browser") == 0) {
+ return FileExists(L"obs-plugins\\32bit\\obs-browser.dll");
+ } else if (strcmp(name, "realsense") == 0) {
+ return FileExists(L"obs-plugins\\32bit\\win-ivcam.dll");
+ }
+ } else {
+ if (strcmp(name, "obs-browser") == 0) {
+ return FileExists(L"obs-plugins\\64bit\\obs-browser.dll");
+ } else if (strcmp(name, "realsense") == 0) {
+ return FileExists(L"obs-plugins\\64bit\\win-ivcam.dll");
+ }
}
return false;
@@ -608,10 +614,15 @@ static inline bool is_64bit_file(const char *file)
strstr(file, "64.exe") != nullptr;
}
+static inline bool has_str(const char *file, const char *str)
+{
+ return (file && str) ? (strstr(file, str) != nullptr) : false;
+}
+
#define UTF8ToWideBuf(wide, utf8) UTF8ToWide(wide, _countof(wide), utf8)
#define WideToUTF8Buf(utf8, wide) WideToUTF8(utf8, _countof(utf8), wide)
-#define UPDATE_URL L"https://obsproject.com/update_studio"
+#define UPDATE_URL L"https://cdn-fastly.obsproject.com/update_studio"
static bool AddPackageUpdateFiles(json_t *root, size_t idx,
const wchar_t *tempPath)
@@ -661,6 +672,12 @@ static bool AddPackageUpdateFiles(json_t *root, size_t idx,
if (!isWin64 && is_64bit_file(fileUTF8))
continue;
+ /* ignore update files of opposite arch to reduce download */
+
+ if (( is32bit && has_str(fileUTF8, "/64bit/")) ||
+ (!is32bit && has_str(fileUTF8, "/32bit/")))
+ continue;
+
/* convert strings to wide */
wchar_t sourceURL[1024];
@@ -741,7 +758,7 @@ static void UpdateWithPatchIfAvailable(const char *name, const char *hash,
wchar_t sourceURL[1024];
wchar_t patchHashStr[BLAKE2_HASH_STR_LENGTH];
- if (strncmp(source, "https://obsproject.com/", 23) != 0)
+ if (strncmp(source, "https://cdn-fastly.obsproject.com/", 34) != 0)
return;
string patchPackageName = name;
@@ -930,6 +947,156 @@ static wchar_t tempPath[MAX_PATH] = {};
#define HASH_NULL \
L"0000000000000000000000000000000000000000"
+static bool UpdateVS2017Redists(json_t *root)
+{
+ /* ------------------------------------------ *
+ * Initialize session */
+
+ const DWORD tlsProtocols = WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2;
+
+ HttpHandle hSession = WinHttpOpen(L"OBS Studio Updater/2.1",
+ WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
+ WINHTTP_NO_PROXY_NAME,
+ WINHTTP_NO_PROXY_BYPASS,
+ 0);
+ if (!hSession) {
+ Status(L"Update failed: Couldn't open obsproject.com");
+ return false;
+ }
+
+ WinHttpSetOption(hSession, WINHTTP_OPTION_SECURE_PROTOCOLS,
+ (LPVOID)&tlsProtocols, sizeof(tlsProtocols));
+
+ HttpHandle hConnect = WinHttpConnect(hSession, L"cdn-fastly.obsproject.com",
+ INTERNET_DEFAULT_HTTPS_PORT, 0);
+ if (!hConnect) {
+ Status(L"Update failed: Couldn't connect to cdn-fastly.obsproject.com");
+ return false;
+ }
+
+ int responseCode;
+
+ DWORD waitResult = WaitForSingleObject(cancelRequested, 0);
+ if (waitResult == WAIT_OBJECT_0) {
+ return false;
+ }
+
+ /* ------------------------------------------ *
+ * Download redist */
+
+ Status(L"Downloading %s", L"Visual C++ 2017 Redistributable");
+
+ const wchar_t *file = (is32bit)
+ ? L"vc2017redist_x86.exe"
+ : L"vc2017redist_x64.exe";
+
+ wstring sourceURL;
+ sourceURL += L"https://cdn-fastly.obsproject.com/downloads/";
+ sourceURL += file;
+
+ wstring destPath;
+ destPath += tempPath;
+ destPath += L"\\";
+ destPath += file;
+
+ if (!HTTPGetFile(hConnect,
+ sourceURL.c_str(),
+ destPath.c_str(),
+ L"Accept-Encoding: gzip",
+ &responseCode)) {
+
+ DeleteFile(destPath.c_str());
+ Status(L"Update failed: Could not download "
+ L"%s (error code %d)",
+ L"Visual C++ 2017 Redistributable",
+ responseCode);
+ return false;
+ }
+
+ /* ------------------------------------------ *
+ * Get expected hash */
+
+ json_t *redistJson = json_object_get(root, is32bit
+ ? "vc2017_redist_x86"
+ : "vc2017_redist_x64");
+ if (!redistJson) {
+ Status(L"Update failed: Could not parse VC2017 redist json");
+ return false;
+ }
+
+ const char *expectedHashUTF8 = json_string_value(redistJson);
+ wchar_t expectedHashWide[BLAKE2_HASH_STR_LENGTH];
+ BYTE expectedHash[BLAKE2_HASH_LENGTH];
+
+ if (!UTF8ToWideBuf(expectedHashWide, expectedHashUTF8)) {
+ DeleteFile(destPath.c_str());
+ Status(L"Update failed: Couldn't convert Json for redist hash");
+ return false;
+ }
+
+ StringToHash(expectedHashWide, expectedHash);
+
+ wchar_t downloadHashWide[BLAKE2_HASH_STR_LENGTH];
+ BYTE downloadHash[BLAKE2_HASH_LENGTH];
+
+ /* ------------------------------------------ *
+ * Get download hash */
+
+ if (!CalculateFileHash(destPath.c_str(), downloadHash)) {
+ DeleteFile(destPath.c_str());
+ Status(L"Update failed: Couldn't verify integrity of %s",
+ L"Visual C++ 2017 Redistributable");
+ return false;
+ }
+
+ /* ------------------------------------------ *
+ * If hashes do not match, integrity failed */
+
+ HashToString(downloadHash, downloadHashWide);
+ if (wcscmp(expectedHashWide, downloadHashWide) != 0) {
+ DeleteFile(destPath.c_str());
+ Status(L"Update failed: Couldn't verify integrity of %s",
+ L"Visual C++ 2017 Redistributable");
+ return false;
+ }
+
+ /* ------------------------------------------ *
+ * If hashes match, install redist */
+
+ wchar_t commandline[MAX_PATH + MAX_PATH];
+ StringCbPrintf(commandline, sizeof(commandline),
+ L"%s /install /quiet /norestart", destPath.c_str());
+
+ PROCESS_INFORMATION pi = {};
+ STARTUPINFO si = {};
+ si.cb = sizeof(si);
+
+ bool success = !!CreateProcessW(destPath.c_str(), commandline,
+ nullptr, nullptr, false, CREATE_NO_WINDOW,
+ nullptr, nullptr, &si, &pi);
+ if (success) {
+ Status(L"Installing %s...", L"Visual C++ 2017 Redistributable");
+
+ CloseHandle(pi.hThread);
+ WaitForSingleObject(pi.hProcess, INFINITE);
+ CloseHandle(pi.hProcess);
+ } else {
+ Status(L"Update failed: Could not execute "
+ L"%s (error code %d)",
+ L"Visual C++ 2017 Redistributable",
+ (int)GetLastError());
+ }
+
+ DeleteFile(destPath.c_str());
+
+ waitResult = WaitForSingleObject(cancelRequested, 0);
+ if (waitResult == WAIT_OBJECT_0) {
+ return false;
+ }
+
+ return success;
+}
+
static bool Update(wchar_t *cmdLine)
{
/* ------------------------------------- *
@@ -1035,7 +1202,7 @@ static bool Update(wchar_t *cmdLine)
GetLastError());
return false;
}
- if (!GetTempFileNameW(tempDirName, L"obs-studio", 0, tempPath)) {
+ if (!GetTempFileNameW(tempDirName, L"ebs-studio", 0, tempPath)) {
Status(L"Update failed: Failed to create temp dir name: %ld",
GetLastError());
return false;
@@ -1091,6 +1258,15 @@ static bool Update(wchar_t *cmdLine)
return true;
}
+ /* ------------------------------------- *
+ * Check for VS2017 redistributables */
+
+ if (!HasVS2017Redist()) {
+ if (!UpdateVS2017Redists(root)) {
+ return false;
+ }
+ }
+
/* ------------------------------------- *
* Generate file hash json */
@@ -1219,7 +1395,7 @@ static bool Update(wchar_t *cmdLine)
if (!RunDownloadWorkers(2))
return false;
- if (completedUpdates != updates.size()) {
+ if ((size_t)completedUpdates != updates.size()) {
Status(L"Update failed to download all files.");
return false;
}
@@ -1431,11 +1607,28 @@ static void RestartAsAdmin(LPWSTR lpCmdLine)
}
}
+static bool HasElevation()
+{
+ SID_IDENTIFIER_AUTHORITY sia = SECURITY_NT_AUTHORITY;
+ PSID sid = nullptr;
+ BOOL elevated = false;
+ BOOL success;
+
+ success = AllocateAndInitializeSid(&sia, 2, SECURITY_BUILTIN_DOMAIN_RID,
+ DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &sid);
+ if (success && sid) {
+ CheckTokenMembership(nullptr, sid, &elevated);
+ FreeSid(sid);
+ }
+
+ return elevated;
+}
+
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR lpCmdLine, int)
{
INITCOMMONCONTROLSEX icce;
- if (!IsAppRunningAsAdminMode()) {
+ if (!HasElevation()) {
HANDLE hLowMutex = CreateMutexW(nullptr, true,
L"OBSUpdaterRunningAsNonAdminUser");
diff --git a/UI/win-update/updater/updater.hpp b/UI/win-update/updater/updater.hpp
index 5f1abd773..cc5a59c94 100644
--- a/UI/win-update/updater/updater.hpp
+++ b/UI/win-update/updater/updater.hpp
@@ -1,3 +1,19 @@
+/*
+ * Copyright (c) 2017-2018 Hugh Bailey
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
#pragma once
#define WINVER 0x0600
diff --git a/UI/win-update/updater/updater.rc b/UI/win-update/updater/updater.rc
index c099f5c0b..a9e9d25b2 100644
--- a/UI/win-update/updater/updater.rc
+++ b/UI/win-update/updater/updater.rc
@@ -7,7 +7,7 @@
//
// Generated from the TEXTINCLUDE 2 resource.
//
-#include "afxres.h"
+#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
diff --git a/UI/win-update/win-update.cpp b/UI/win-update/win-update.cpp
index 23251ae86..418b554c3 100644
--- a/UI/win-update/win-update.cpp
+++ b/UI/win-update/win-update.cpp
@@ -1,12 +1,14 @@
#include "win-update-helpers.hpp"
#include "update-window.hpp"
#include "remote-text.hpp"
+#include "qt-wrappers.hpp"
#include "win-update.hpp"
#include "obs-app.hpp"
#include
#include
+#include
#include
#include
@@ -26,11 +28,15 @@ using namespace std;
#define WIN_MANIFEST_URL "https://obsproject.com/update_studio/manifest.json"
#endif
+#ifndef WIN_WHATSNEW_URL
+#define WIN_WHATSNEW_URL "https://obsproject.com/update_studio/whatsnew.json"
+#endif
+
#ifndef WIN_UPDATER_URL
#define WIN_UPDATER_URL "https://obsproject.com/update_studio/updater.exe"
#endif
-static HCRYPTPROV provider = 0;
+static __declspec(thread) HCRYPTPROV provider = 0;
#pragma pack(push, r1, 1)
@@ -373,7 +379,7 @@ try {
vector extraHeaders;
BPtr updateFilePath = GetConfigPathPtr(
- "obs-studio\\updates\\updater.exe");
+ "ebs-studio\\updates\\updater.exe");
if (CalculateFileHash(updateFilePath, updateFileHash)) {
char hashString[BLAKE2_HASH_STR_LENGTH];
@@ -477,9 +483,35 @@ void GenerateGUID(string &guid)
HashToString(junk, &guid[0]);
}
+string GetProgramGUID()
+{
+ static mutex m;
+ lock_guard lock(m);
+
+ /* NOTE: this is an arbitrary random number that we use to count the
+ * number of unique OBS installations and is not associated with any
+ * kind of identifiable information */
+ const char *pguid = config_get_string(GetGlobalConfig(),
+ "General", "InstallGUID");
+ string guid;
+ if (pguid)
+ guid = pguid;
+
+ if (guid.empty()) {
+ GenerateGUID(guid);
+
+ if (!guid.empty())
+ config_set_string(GetGlobalConfig(),
+ "General", "InstallGUID",
+ guid.c_str());
+ }
+
+ return guid;
+}
+
void AutoUpdateThread::infoMsg(const QString &title, const QString &text)
{
- QMessageBox::information(App()->GetMainWindow(), title, text);
+ OBSMessageBox::information(App()->GetMainWindow(), title, text);
}
void AutoUpdateThread::info(const QString &title, const QString &text)
@@ -490,20 +522,20 @@ void AutoUpdateThread::info(const QString &title, const QString &text)
Q_ARG(QString, text));
}
-int AutoUpdateThread::queryUpdateSlot(bool manualUpdate, const QString &text)
+int AutoUpdateThread::queryUpdateSlot(bool localManualUpdate, const QString &text)
{
- OBSUpdate updateDlg(App()->GetMainWindow(), manualUpdate, text);
+ OBSUpdate updateDlg(App()->GetMainWindow(), localManualUpdate, text);
return updateDlg.exec();
}
-int AutoUpdateThread::queryUpdate(bool manualUpdate, const char *text_utf8)
+int AutoUpdateThread::queryUpdate(bool localManualUpdate, const char *text_utf8)
{
int ret = OBSUpdate::No;
QString text = text_utf8;
QMetaObject::invokeMethod(this, "queryUpdateSlot",
Qt::BlockingQueuedConnection,
Q_RETURN_ARG(int, ret),
- Q_ARG(bool, manualUpdate),
+ Q_ARG(bool, localManualUpdate),
Q_ARG(QString, text));
return ret;
}
@@ -536,7 +568,7 @@ try {
string text;
string error;
string signature;
- CryptProvider provider;
+ CryptProvider localProvider;
BYTE manifestHash[BLAKE2_HASH_LENGTH];
bool updatesAvailable = false;
bool success;
@@ -550,7 +582,7 @@ try {
} finishedTrigger;
BPtr manifestPath = GetConfigPathPtr(
- "obs-studio\\updates\\manifest.json");
+ "ebs-studio\\updates\\manifest.json");
auto ActiveOrGameCaptureLocked = [this] ()
{
@@ -579,7 +611,7 @@ try {
/* ----------------------------------- *
* create signature provider */
- if (!CryptAcquireContext(&provider,
+ if (!CryptAcquireContext(&localProvider,
nullptr,
MS_ENH_RSA_AES_PROV,
PROV_RSA_AES,
@@ -587,7 +619,7 @@ try {
throw strprintf("CryptAcquireContext failed: %lu",
GetLastError());
- ::provider = provider;
+ provider = localProvider;
/* ----------------------------------- *
* avoid downloading manifest again */
@@ -604,24 +636,7 @@ try {
/* ----------------------------------- *
* get current install GUID */
- /* NOTE: this is an arbitrary random number that we use to count the
- * number of unique OBS installations and is not associated with any
- * kind of identifiable information */
- const char *pguid = config_get_string(GetGlobalConfig(),
- "General", "InstallGUID");
- string guid;
- if (pguid)
- guid = pguid;
-
- if (guid.empty()) {
- GenerateGUID(guid);
-
- if (!guid.empty())
- config_set_string(GetGlobalConfig(),
- "General", "InstallGUID",
- guid.c_str());
- }
-
+ string guid = GetProgramGUID();
if (!guid.empty()) {
string header = "X-OBS2-GUID: ";
header += guid;
@@ -638,7 +653,7 @@ try {
if (responseCode == 404)
return;
- throw strprintf("Failed to fetch manifest file: %s", error);
+ throw strprintf("Failed to fetch manifest file: %s", error.c_str());
}
/* ----------------------------------- *
@@ -658,11 +673,11 @@ try {
if (responseCode == 200) {
if (!QuickWriteFile(manifestPath, text.data(), text.size()))
throw strprintf("Could not write file '%s'",
- std::string(manifestPath));
+ manifestPath.Get());
} else {
if (!QuickReadFile(manifestPath, text))
throw strprintf("Could not read file '%s'",
- std::string(manifestPath));
+ manifestPath.Get());
}
/* ----------------------------------- *
@@ -735,7 +750,7 @@ try {
* execute updater */
BPtr updateFilePath = GetConfigPathPtr(
- "obs-studio\\updates\\updater.exe");
+ "ebs-studio\\updates\\updater.exe");
BPtr wUpdateFilePath;
size_t size = os_utf8_to_wcs_ptr(updateFilePath, 0, &wUpdateFilePath);
@@ -764,7 +779,7 @@ try {
QString msg = QTStr("Updater.FailedToLaunch");
info(msg, msg);
throw strprintf("Can't launch updater '%s': %d",
- std::string(updateFilePath), GetLastError());
+ updateFilePath.Get(), GetLastError());
}
/* force OBS to perform another update check immediately after updating
@@ -779,3 +794,101 @@ try {
} catch (string text) {
blog(LOG_WARNING, "%s: %s", __FUNCTION__, text.c_str());
}
+
+/* ------------------------------------------------------------------------ */
+
+void WhatsNewInfoThread::run()
+try {
+ long responseCode;
+ vector extraHeaders;
+ string text;
+ string error;
+ string signature;
+ CryptProvider localProvider;
+ BYTE whatsnewHash[BLAKE2_HASH_LENGTH];
+ bool success;
+
+ BPtr whatsnewPath = GetConfigPathPtr(
+ "obs-studio\\updates\\whatsnew.json");
+
+ /* ----------------------------------- *
+ * create signature provider */
+
+ if (!CryptAcquireContext(&localProvider,
+ nullptr,
+ MS_ENH_RSA_AES_PROV,
+ PROV_RSA_AES,
+ CRYPT_VERIFYCONTEXT))
+ throw strprintf("CryptAcquireContext failed: %lu",
+ GetLastError());
+
+ provider = localProvider;
+
+ /* ----------------------------------- *
+ * avoid downloading json again */
+
+ if (CalculateFileHash(whatsnewPath, whatsnewHash)) {
+ char hashString[BLAKE2_HASH_STR_LENGTH];
+ HashToString(whatsnewHash, hashString);
+
+ string header = "If-None-Match: ";
+ header += hashString;
+ extraHeaders.push_back(move(header));
+ }
+
+ /* ----------------------------------- *
+ * get current install GUID */
+
+ string guid = GetProgramGUID();
+
+ if (!guid.empty()) {
+ string header = "X-OBS2-GUID: ";
+ header += guid;
+ extraHeaders.push_back(move(header));
+ }
+
+ /* ----------------------------------- *
+ * get json from server */
+
+ success = GetRemoteFile(WIN_WHATSNEW_URL, text, error, &responseCode,
+ nullptr, nullptr, extraHeaders, &signature);
+
+ if (!success || (responseCode != 200 && responseCode != 304)) {
+ if (responseCode == 404)
+ return;
+
+ throw strprintf("Failed to fetch whatsnew file: %s",
+ error.c_str());
+ }
+
+ /* ----------------------------------- *
+ * verify file signature */
+
+ if (responseCode == 200) {
+ success = CheckDataSignature(text, "whatsnew",
+ signature.data(), signature.size());
+ if (!success)
+ throw string("Invalid whatsnew signature");
+ }
+
+ /* ----------------------------------- *
+ * write or load json */
+
+ if (responseCode == 200) {
+ if (!QuickWriteFile(whatsnewPath, text.data(), text.size()))
+ throw strprintf("Could not write file '%s'",
+ whatsnewPath.Get());
+ } else {
+ if (!QuickReadFile(whatsnewPath, text))
+ throw strprintf("Could not read file '%s'",
+ whatsnewPath.Get());
+ }
+
+ /* ----------------------------------- *
+ * success */
+
+ emit Result(QString::fromUtf8(text.c_str()));
+
+} catch (string text) {
+ blog(LOG_WARNING, "%s: %s", __FUNCTION__, text.c_str());
+}
diff --git a/UI/win-update/win-update.hpp b/UI/win-update/win-update.hpp
index 47bdd03be..c1bd8fb8b 100644
--- a/UI/win-update/win-update.hpp
+++ b/UI/win-update/win-update.hpp
@@ -21,3 +21,15 @@ private slots:
public:
AutoUpdateThread(bool manualUpdate_) : manualUpdate(manualUpdate_) {}
};
+
+class WhatsNewInfoThread : public QThread {
+ Q_OBJECT
+
+ virtual void run() override;
+
+signals:
+ void Result(const QString &text);
+
+public:
+ inline WhatsNewInfoThread() {}
+};
diff --git a/UI/window-basic-about.cpp b/UI/window-basic-about.cpp
new file mode 100644
index 000000000..e07fe1b6a
--- /dev/null
+++ b/UI/window-basic-about.cpp
@@ -0,0 +1,122 @@
+#include "window-basic-about.hpp"
+#include "window-basic-main.hpp"
+#include "qt-wrappers.hpp"
+#include
+#include
+#include
+#include
+
+OBSAbout::OBSAbout(QWidget *parent)
+ : QDialog(parent),
+ ui(new Ui::OBSAbout)
+{
+ ui->setupUi(this);
+
+ setFixedSize(size());
+
+ QString bitness;
+
+ if(sizeof(void*) == 4)
+ bitness = " (32 bit)";
+ else if(sizeof(void*) == 8)
+ bitness = " (64 bit)";
+
+ ui->version->setText(
+ QString::number(LIBOBS_API_MAJOR_VER) + "." +
+ QString::number(LIBOBS_API_MINOR_VER) + "." +
+ QString::number(LIBOBS_API_PATCH_VER) +
+ bitness);
+
+ ui->contribute->setText(QTStr("About.Contribute"));
+ ui->donate->setText("" +
+ QTStr("About.Donate") + "");
+ ui->donate->setTextInteractionFlags(Qt::TextBrowserInteraction);
+ ui->donate->setOpenExternalLinks(true);
+
+ ui->getInvolved->setText("" +
+ QTStr("About.GetInvolved") + "");
+ ui->getInvolved->setTextInteractionFlags(Qt::TextBrowserInteraction);
+ ui->getInvolved->setOpenExternalLinks(true);
+
+ ui->about->setText("" + QTStr("About") + "");
+ ui->authors->setText("" + QTStr("About.Authors") + "");
+ ui->license->setText("" + QTStr("About.License") + "");
+
+ ui->textBrowser->hide();
+
+ ui->name->setProperty("themeID", "aboutName");
+ ui->version->setProperty("themeID", "aboutVersion");
+ ui->about->setProperty("themeID", "aboutHLayout");
+ ui->authors->setProperty("themeID", "aboutHLayout");
+ ui->license->setProperty("themeID", "aboutHLayout");
+ ui->info->setProperty("themeID", "aboutInfo");
+
+ connect(ui->about, SIGNAL(clicked()), this, SLOT(ShowAbout()));
+ connect(ui->authors, SIGNAL(clicked()), this, SLOT(ShowAuthors()));
+ connect(ui->license, SIGNAL(clicked()), this, SLOT(ShowLicense()));
+}
+
+void OBSAbout::ShowAbout()
+{
+ ui->textBrowser->hide();
+ ui->info->show();
+ ui->contribute->show();
+ ui->donate->show();
+ ui->getInvolved->show();
+}
+
+void OBSAbout::ShowAuthors()
+{
+ std::string path;
+ QString error = "Error! File could not be read.\n\n \
+ Go to: https://github.com/obsproject/obs-studio/blob/master/AUTHORS";
+
+ if (!GetDataFilePath("authors/AUTHORS", path)) {
+ ui->textBrowser->setPlainText(error);
+ return;
+ }
+
+ ui->textBrowser->setPlainText(QString::fromStdString(path));
+
+ BPtr text = os_quick_read_utf8_file(path.c_str());
+
+ if (!text || !*text) {
+ ui->textBrowser->setPlainText(error);
+ return;
+ }
+
+ ui->textBrowser->setPlainText(QT_UTF8(text));
+
+ ui->info->hide();
+ ui->contribute->hide();
+ ui->donate->hide();
+ ui->getInvolved->hide();
+ ui->textBrowser->show();
+}
+
+void OBSAbout::ShowLicense()
+{
+ std::string path;
+ QString error = "Error! File could not be read.\n\n \
+ Go to: https://github.com/obsproject/obs-studio/blob/master/COPYING";
+
+ if (!GetDataFilePath("license/gplv2.txt", path)) {
+ ui->textBrowser->setPlainText(error);
+ return;
+ }
+
+ BPtr text = os_quick_read_utf8_file(path.c_str());
+
+ if (!text || !*text) {
+ ui->textBrowser->setPlainText(error);
+ return;
+ }
+
+ ui->textBrowser->setPlainText(QT_UTF8(text));
+
+ ui->info->hide();
+ ui->contribute->hide();
+ ui->donate->hide();
+ ui->getInvolved->hide();
+ ui->textBrowser->show();
+}
diff --git a/UI/window-basic-about.hpp b/UI/window-basic-about.hpp
new file mode 100644
index 000000000..3a21bbe67
--- /dev/null
+++ b/UI/window-basic-about.hpp
@@ -0,0 +1,21 @@
+#pragma once
+
+#include
+#include
+
+#include "ui_OBSAbout.h"
+
+class OBSAbout : public QDialog {
+ Q_OBJECT
+
+public:
+ explicit OBSAbout(QWidget *parent = 0);
+
+private:
+ std::unique_ptr ui;
+
+private slots:
+ void ShowAbout();
+ void ShowAuthors();
+ void ShowLicense();
+};
diff --git a/UI/window-basic-adv-audio.cpp b/UI/window-basic-adv-audio.cpp
index 2894f6bf2..312401901 100644
--- a/UI/window-basic-adv-audio.cpp
+++ b/UI/window-basic-adv-audio.cpp
@@ -6,6 +6,7 @@
#include
#include "window-basic-adv-audio.hpp"
#include "window-basic-main.hpp"
+#include "item-widget-helpers.hpp"
#include "adv-audio-control.hpp"
#include "obs-app.hpp"
#include "qt-wrappers.hpp"
@@ -36,7 +37,7 @@ OBSBasicAdvAudio::OBSBasicAdvAudio(QWidget *parent)
label = new QLabel(QTStr("Basic.AdvAudio.Mono"));
label->setAlignment(Qt::AlignHCenter);
mainLayout->addWidget(label, 0, idx++);
- label = new QLabel(QTStr("Basic.AdvAudio.Panning"));
+ label = new QLabel(QTStr("Basic.AdvAudio.Balance"));
label->setAlignment(Qt::AlignHCenter);
mainLayout->addWidget(label, 0, idx++);
label = new QLabel(QTStr("Basic.AdvAudio.SyncOffset"));
@@ -133,7 +134,12 @@ void OBSBasicAdvAudio::OBSSourceRemoved(void *param, calldata_t *calldata)
inline void OBSBasicAdvAudio::AddAudioSource(obs_source_t *source)
{
OBSAdvAudioCtrl *control = new OBSAdvAudioCtrl(mainLayout, source);
- controls.push_back(control);
+
+ InsertQObjectByName(controls, control);
+
+ for (auto control : controls) {
+ control->ShowAudioControl(mainLayout);
+ }
}
void OBSBasicAdvAudio::SourceAdded(OBSSource source)
diff --git a/UI/window-basic-auto-config.cpp b/UI/window-basic-auto-config.cpp
index 86990c4b9..5ad489694 100644
--- a/UI/window-basic-auto-config.cpp
+++ b/UI/window-basic-auto-config.cpp
@@ -218,11 +218,11 @@ AutoConfigStreamPage::AutoConfigStreamPage(QWidget *parent)
ui->bitrateLabel->setVisible(false);
ui->bitrate->setVisible(false);
- ui->streamType->addItem(obs_service_get_display_name("rtmp_common"));
- ui->streamType->addItem(obs_service_get_display_name("rtmp_custom"));
+// ui->streamType->addItem(obs_service_get_display_name("rtmp_common"));
+// ui->streamType->addItem(obs_service_get_display_name("rtmp_custom"));
ui->streamType->addItem(obs_service_get_display_name("webrtc_janus"));
- ui->streamType->addItem(obs_service_get_display_name("webrtc_spankchain"));
- ui->streamType->addItem(obs_service_get_display_name("webrtc_millicast"));
+// ui->streamType->addItem(obs_service_get_display_name("webrtc_spankchain"));
+// ui->streamType->addItem(obs_service_get_display_name("webrtc_millicast"));
setTitle(QTStr("Basic.AutoConfig.StreamPage"));
setSubTitle(QTStr("Basic.AutoConfig.StreamPage.SubTitle"));
diff --git a/UI/window-basic-filters.cpp b/UI/window-basic-filters.cpp
index d792b1e1d..51d5d867e 100644
--- a/UI/window-basic-filters.cpp
+++ b/UI/window-basic-filters.cpp
@@ -56,7 +56,8 @@ OBSBasicFilters::OBSBasicFilters(QWidget *parent, OBSSource source_)
OBSBasicFilters::SourceRemoved, this),
renameSourceSignal (obs_source_get_signal_handler(source),
"rename",
- OBSBasicFilters::SourceRenamed, this)
+ OBSBasicFilters::SourceRenamed, this),
+ noPreviewMargin (13)
{
main = reinterpret_cast(parent);
@@ -71,6 +72,14 @@ OBSBasicFilters::OBSBasicFilters(QWidget *parent, OBSSource source_)
const char *name = obs_source_get_name(source);
setWindowTitle(QTStr("Basic.Filters.Title").arg(QT_UTF8(name)));
+#ifndef QT_NO_SHORTCUT
+ ui->actionRemoveFilter->setShortcut(QApplication::translate("OBSBasicFilters", "Del", nullptr));
+#endif // QT_NO_SHORTCUT
+
+ addAction(ui->actionRemoveFilter);
+ addAction(ui->actionMoveUp);
+ addAction(ui->actionMoveDown);
+
installEventFilter(CreateShortcutFilter());
connect(ui->asyncFilters->itemDelegate(),
@@ -97,10 +106,10 @@ OBSBasicFilters::OBSBasicFilters(QWidget *parent, OBSSource source_)
connect(ui->buttonBox->button(QDialogButtonBox::Reset),
SIGNAL(clicked()), this, SLOT(ResetFilters()));
- uint32_t flags = obs_source_get_output_flags(source);
- bool audio = (flags & OBS_SOURCE_AUDIO) != 0;
- bool audioOnly = (flags & OBS_SOURCE_VIDEO) == 0;
- bool async = (flags & OBS_SOURCE_ASYNC) != 0;
+ uint32_t caps = obs_source_get_output_flags(source);
+ bool audio = (caps & OBS_SOURCE_AUDIO) != 0;
+ bool audioOnly = (caps & OBS_SOURCE_VIDEO) == 0;
+ bool async = (caps & OBS_SOURCE_ASYNC) != 0;
if (!async && !audio) {
ui->asyncWidget->setVisible(false);
@@ -121,13 +130,20 @@ OBSBasicFilters::OBSBasicFilters(QWidget *parent, OBSSource source_)
};
enum obs_source_type type = obs_source_get_type(source);
- uint32_t caps = obs_source_get_output_flags(source);
bool drawable_type = type == OBS_SOURCE_TYPE_INPUT ||
type == OBS_SOURCE_TYPE_SCENE;
- if (drawable_type && (caps & OBS_SOURCE_VIDEO) != 0)
- connect(ui->preview, &OBSQTDisplay::DisplayCreated,
- addDrawCallback);
+ if ((caps & OBS_SOURCE_VIDEO) != 0) {
+ ui->rightLayout->setContentsMargins(0, 0, 0, 0);
+ ui->preview->show();
+ if (drawable_type)
+ connect(ui->preview, &OBSQTDisplay::DisplayCreated,
+ addDrawCallback);
+ } else {
+ ui->rightLayout->setContentsMargins(0, noPreviewMargin, 0, 0);
+ ui->rightContainerLayout->insertStretch(1);
+ ui->preview->hide();
+ }
}
OBSBasicFilters::~OBSBasicFilters()
@@ -499,20 +515,20 @@ void OBSBasicFilters::OBSSourceReordered(void *param, calldata_t *data)
UNUSED_PARAMETER(data);
}
-void OBSBasicFilters::SourceRemoved(void *data, calldata_t *params)
+void OBSBasicFilters::SourceRemoved(void *param, calldata_t *data)
{
- UNUSED_PARAMETER(params);
+ UNUSED_PARAMETER(data);
- QMetaObject::invokeMethod(static_cast(data),
+ QMetaObject::invokeMethod(static_cast(param),
"close");
}
-void OBSBasicFilters::SourceRenamed(void *data, calldata_t *params)
+void OBSBasicFilters::SourceRenamed(void *param, calldata_t *data)
{
- const char *name = calldata_string(params, "new_name");
+ const char *name = calldata_string(data, "new_name");
QString title = QTStr("Basic.Filters.Title").arg(QT_UTF8(name));
- QMetaObject::invokeMethod(static_cast(data),
+ QMetaObject::invokeMethod(static_cast(param),
"setWindowTitle", Q_ARG(QString, title));
}
@@ -569,7 +585,7 @@ static bool QueryRemove(QWidget *parent, obs_source_t *source)
void OBSBasicFilters::on_addAsyncFilter_clicked()
{
- QPointer popup = CreateAddFilterPopupMenu(true);
+ QScopedPointer popup(CreateAddFilterPopupMenu(true));
if (popup)
popup->exec(QCursor::pos());
}
@@ -611,7 +627,7 @@ void OBSBasicFilters::on_asyncFilters_currentRowChanged(int row)
void OBSBasicFilters::on_addEffectFilter_clicked()
{
- QPointer popup = CreateAddFilterPopupMenu(false);
+ QScopedPointer popup(CreateAddFilterPopupMenu(false));
if (popup)
popup->exec(QCursor::pos());
}
@@ -651,6 +667,30 @@ void OBSBasicFilters::on_effectFilters_currentRowChanged(int row)
UpdatePropertiesView(row, false);
}
+void OBSBasicFilters::on_actionRemoveFilter_triggered()
+{
+ if (ui->asyncFilters->hasFocus())
+ on_removeAsyncFilter_clicked();
+ else if (ui->effectFilters->hasFocus())
+ on_removeEffectFilter_clicked();
+}
+
+void OBSBasicFilters::on_actionMoveUp_triggered()
+{
+ if (ui->asyncFilters->hasFocus())
+ on_moveAsyncFilterUp_clicked();
+ else if (ui->effectFilters->hasFocus())
+ on_moveEffectFilterUp_clicked();
+}
+
+void OBSBasicFilters::on_actionMoveDown_triggered()
+{
+ if (ui->asyncFilters->hasFocus())
+ on_moveAsyncFilterDown_clicked();
+ else if (ui->effectFilters->hasFocus())
+ on_moveEffectFilterDown_clicked();
+}
+
void OBSBasicFilters::CustomContextMenu(const QPoint &pos, bool async)
{
QListWidget *list = async ? ui->asyncFilters : ui->effectFilters;
diff --git a/UI/window-basic-filters.hpp b/UI/window-basic-filters.hpp
index cc655a408..5ab28a09d 100644
--- a/UI/window-basic-filters.hpp
+++ b/UI/window-basic-filters.hpp
@@ -72,6 +72,8 @@ class OBSBasicFilters : public QDialog {
bool isAsync;
+ int noPreviewMargin;
+
private slots:
void AddFilter(OBSSource filter);
void RemoveFilter(OBSSource filter);
@@ -98,6 +100,10 @@ private slots:
void on_effectFilters_customContextMenuRequested(const QPoint &pos);
void on_effectFilters_GotFocus();
+ void on_actionRemoveFilter_triggered();
+ void on_actionMoveUp_triggered();
+ void on_actionMoveDown_triggered();
+
void AsyncFilterNameEdited(QWidget *editor,
QAbstractItemDelegate::EndEditHint endHint);
void EffectFilterNameEdited(QWidget *editor,
diff --git a/UI/window-basic-main-dropfiles.cpp b/UI/window-basic-main-dropfiles.cpp
index 2622ab19d..cd5c48116 100644
--- a/UI/window-basic-main-dropfiles.cpp
+++ b/UI/window-basic-main-dropfiles.cpp
@@ -107,8 +107,10 @@ void OBSBasic::AddDropSource(const char *data, DropType image)
break;
}
- if (!obs_source_get_display_name(type))
+ if (!obs_source_get_display_name(type)) {
+ obs_data_release(settings);
return;
+ }
if (name.isEmpty())
name = obs_source_get_display_name(type);
diff --git a/UI/window-basic-main-outputs.cpp b/UI/window-basic-main-outputs.cpp
index 0c92abfb4..d7d3a2eb0 100644
--- a/UI/window-basic-main-outputs.cpp
+++ b/UI/window-basic-main-outputs.cpp
@@ -906,6 +906,7 @@ bool SimpleOutput::ConfigureRecording(bool updateReplayBuffer)
obs_data_set_string(settings, "directory", path);
obs_data_set_string(settings, "format", f.c_str());
obs_data_set_string(settings, "extension", format);
+ obs_data_set_bool(settings, "allow_spaces", !noSpace);
obs_data_set_int(settings, "max_time_sec", rbTime);
obs_data_set_int(settings, "max_size_mb",
usingRecordingPreset ? rbSize : 0);
@@ -1043,19 +1044,32 @@ struct AdvancedOutput : BasicOutputHandler {
static OBSData GetDataFromJsonFile(const char *jsonFile)
{
char fullPath[512];
+ obs_data_t *data = nullptr;
int ret = GetProfilePath(fullPath, sizeof(fullPath), jsonFile);
if (ret > 0) {
BPtr jsonData = os_quick_read_utf8_file(fullPath);
if (!!jsonData) {
- obs_data_t *data = obs_data_create_from_json(jsonData);
- OBSData dataRet(data);
- obs_data_release(data);
- return dataRet;
+ data = obs_data_create_from_json(jsonData);
}
}
- return nullptr;
+ if (!data)
+ data = obs_data_create();
+ OBSData dataRet(data);
+ obs_data_release(data);
+ return dataRet;
+}
+
+static void ApplyEncoderDefaults(OBSData &settings,
+ const obs_encoder_t *encoder)
+{
+ OBSData dataRet = obs_encoder_get_defaults(encoder);
+ obs_data_release(dataRet);
+
+ if (!!settings)
+ obs_data_apply(dataRet, settings);
+ settings = std::move(dataRet);
}
AdvancedOutput::AdvancedOutput(OBSBasic *main_) : BasicOutputHandler(main_)
@@ -1168,6 +1182,7 @@ void AdvancedOutput::UpdateStreamSettings()
"ApplyServiceSettings");
OBSData settings = GetDataFromJsonFile("streamEncoder.json");
+ ApplyEncoderDefaults(settings, h264Streaming);
if (applyServiceSettings)
obs_service_apply_encoder_settings(main->GetService(),
@@ -1741,6 +1756,7 @@ bool AdvancedOutput::StartReplayBuffer()
obs_data_set_string(settings, "directory", path);
obs_data_set_string(settings, "format", f.c_str());
obs_data_set_string(settings, "extension", recFormat);
+ obs_data_set_bool(settings, "allow_spaces", !noSpace);
obs_data_set_int(settings, "max_time_sec", rbTime);
obs_data_set_int(settings, "max_size_mb",
usesBitrate ? 0 : rbSize);
diff --git a/UI/window-basic-main-profiles.cpp b/UI/window-basic-main-profiles.cpp
index 160e13c7f..60b6a08e4 100644
--- a/UI/window-basic-main-profiles.cpp
+++ b/UI/window-basic-main-profiles.cpp
@@ -31,7 +31,7 @@ void EnumProfiles(std::function &&cb)
os_glob_t *glob;
int ret = GetConfigPath(path, sizeof(path),
- "obs-studio/basic/profiles/*");
+ "ebs-studio/basic/profiles/*");
if (ret <= 0) {
blog(LOG_WARNING, "Failed to get profiles config path");
return;
@@ -122,7 +122,7 @@ static bool GetProfileName(QWidget *parent, std::string &name,
return false;
}
- ret = GetConfigPath(path, sizeof(path), "obs-studio/basic/profiles/");
+ ret = GetConfigPath(path, sizeof(path), "ebs-studio/basic/profiles/");
if (ret <= 0) {
blog(LOG_WARNING, "Failed to get profiles config path");
return false;
@@ -143,11 +143,11 @@ static bool GetProfileName(QWidget *parent, std::string &name,
static bool CopyProfile(const char *fromPartial, const char *to)
{
os_glob_t *glob;
- char path[512];
+ char path[514];
char dir[512];
int ret;
- ret = GetConfigPath(dir, sizeof(dir), "obs-studio/basic/profiles/");
+ ret = GetConfigPath(dir, sizeof(dir), "ebs-studio/basic/profiles/");
if (ret <= 0) {
blog(LOG_WARNING, "Failed to get profiles config path");
return false;
@@ -197,7 +197,7 @@ bool OBSBasic::AddProfile(bool create_new, const char *title, const char *text,
char baseDir[512];
int ret = GetConfigPath(baseDir, sizeof(baseDir),
- "obs-studio/basic/profiles/");
+ "ebs-studio/basic/profiles/");
if (ret <= 0) {
blog(LOG_WARNING, "Failed to get profiles config path");
return false;
@@ -256,7 +256,7 @@ void OBSBasic::DeleteProfile(const char *profileName, const char *profileDir)
char profilePath[512];
char basePath[512];
- int ret = GetConfigPath(basePath, 512, "obs-studio/basic/profiles");
+ int ret = GetConfigPath(basePath, 512, "ebs-studio/basic/profiles");
if (ret <= 0) {
blog(LOG_WARNING, "Failed to get profiles config path");
return;
@@ -346,6 +346,19 @@ void OBSBasic::ResetProfileData()
ResetOutputs();
ClearHotkeys();
CreateHotkeys();
+
+ /* load audio monitoring */
+#if defined(_WIN32) || defined(__APPLE__) || HAVE_PULSEAUDIO
+ const char *device_name = config_get_string(basicConfig, "Audio",
+ "MonitoringDeviceName");
+ const char *device_id = config_get_string(basicConfig, "Audio",
+ "MonitoringDeviceId");
+
+ obs_set_audio_monitoring_device(device_name, device_id);
+
+ blog(LOG_INFO, "Audio monitoring device:\n\tname: %s\n\tid: %s",
+ device_name, device_id);
+#endif
}
void OBSBasic::on_actionNewProfile_triggered()
@@ -458,7 +471,7 @@ void OBSBasic::on_actionImportProfile_triggered()
QString home = QDir::homePath();
- int ret = GetConfigPath(path, 512, "obs-studio/basic/profiles/");
+ int ret = GetConfigPath(path, 512, "ebs-studio/basic/profiles/");
if (ret <= 0) {
blog(LOG_WARNING, "Failed to get profile config path");
return;
@@ -507,7 +520,7 @@ void OBSBasic::on_actionExportProfile_triggered()
QString::fromUtf8(config_get_string(App()->GlobalConfig(),
"Basic", "ProfileDir"));
- int ret = GetConfigPath(path, 512, "obs-studio/basic/profiles/");
+ int ret = GetConfigPath(path, 512, "ebs-studio/basic/profiles/");
if (ret <= 0) {
blog(LOG_WARNING, "Failed to get profile config path");
return;
diff --git a/UI/window-basic-main-scene-collections.cpp b/UI/window-basic-main-scene-collections.cpp
index 113f84803..19f7da5c5 100644
--- a/UI/window-basic-main-scene-collections.cpp
+++ b/UI/window-basic-main-scene-collections.cpp
@@ -34,7 +34,7 @@ void EnumSceneCollections(std::function &&cb)
os_glob_t *glob;
int ret = GetConfigPath(path, sizeof(path),
- "obs-studio/basic/scenes/*.json");
+ "ebs-studio/basic/scenes/*.json");
if (ret <= 0) {
blog(LOG_WARNING, "Failed to get config path for scene "
"collections");
@@ -134,7 +134,7 @@ static bool GetSceneCollectionName(QWidget *parent, std::string &name,
return false;
}
- ret = GetConfigPath(path, sizeof(path), "obs-studio/basic/scenes/");
+ ret = GetConfigPath(path, sizeof(path), "ebs-studio/basic/scenes/");
if (ret <= 0) {
blog(LOG_WARNING, "Failed to get scene collection config path");
return false;
@@ -154,13 +154,19 @@ static bool GetSceneCollectionName(QWidget *parent, std::string &name,
return true;
}
-void OBSBasic::AddSceneCollection(bool create_new)
+bool OBSBasic::AddSceneCollection(bool create_new, const QString &qname)
{
std::string name;
std::string file;
- if (!GetSceneCollectionName(this, name, file))
- return;
+ if (qname.isEmpty()) {
+ if (!GetSceneCollectionName(this, name, file))
+ return false;
+ } else {
+ name = QT_TO_UTF8(qname);
+ if (SceneCollectionExists(name.c_str()))
+ return false;
+ }
SaveProjectNow();
@@ -185,6 +191,8 @@ void OBSBasic::AddSceneCollection(bool create_new)
api->on_event(OBS_FRONTEND_EVENT_SCENE_COLLECTION_LIST_CHANGED);
api->on_event(OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGED);
}
+
+ return true;
}
void OBSBasic::RefreshSceneCollections()
@@ -237,7 +245,6 @@ void OBSBasic::RefreshSceneCollections()
OBSBasic *main = reinterpret_cast(App()->GetMainWindow());
- main->OpenSavedProjectors();
main->ui->actionPasteFilters->setEnabled(false);
main->ui->actionPasteRef->setEnabled(false);
main->ui->actionPasteDup->setEnabled(false);
@@ -274,7 +281,7 @@ void OBSBasic::on_actionRenameSceneCollection_triggered()
SaveProjectNow();
char path[512];
- int ret = GetConfigPath(path, 512, "obs-studio/basic/scenes/");
+ int ret = GetConfigPath(path, 512, "ebs-studio/basic/scenes/");
if (ret <= 0) {
blog(LOG_WARNING, "Failed to get scene collection config path");
return;
@@ -336,7 +343,7 @@ void OBSBasic::on_actionRemoveSceneCollection_triggered()
return;
char path[512];
- int ret = GetConfigPath(path, 512, "obs-studio/basic/scenes/");
+ int ret = GetConfigPath(path, 512, "ebs-studio/basic/scenes/");
if (ret <= 0) {
blog(LOG_WARNING, "Failed to get scene collection config path");
return;
@@ -374,7 +381,7 @@ void OBSBasic::on_actionImportSceneCollection_triggered()
QString qhome = QDir::homePath();
- int ret = GetConfigPath(path, 512, "obs-studio/basic/scenes/");
+ int ret = GetConfigPath(path, 512, "ebs-studio/basic/scenes/");
if (ret <= 0) {
blog(LOG_WARNING, "Failed to get scene collection config path");
return;
@@ -439,7 +446,7 @@ void OBSBasic::on_actionExportSceneCollection_triggered()
QString currentFile = QT_UTF8(config_get_string(App()->GlobalConfig(),
"Basic", "SceneCollectionFile"));
- int ret = GetConfigPath(path, 512, "obs-studio/basic/scenes/");
+ int ret = GetConfigPath(path, 512, "ebs-studio/basic/scenes/");
if (ret <= 0) {
blog(LOG_WARNING, "Failed to get scene collection config path");
return;
diff --git a/UI/window-basic-main-transitions.cpp b/UI/window-basic-main-transitions.cpp
index 726eea134..952f5d4d2 100644
--- a/UI/window-basic-main-transitions.cpp
+++ b/UI/window-basic-main-transitions.cpp
@@ -26,6 +26,8 @@
#include "menu-button.hpp"
#include "qt-wrappers.hpp"
+#include "obs-hotkey.h"
+
using namespace std;
Q_DECLARE_METATYPE(OBSScene);
@@ -98,6 +100,18 @@ void OBSBasic::AddQuickTransitionHotkey(QuickTransition *qt)
(void*)(uintptr_t)qt->id);
}
+void QuickTransition::SourceRenamed(void *param, calldata_t *data)
+{
+ QuickTransition *qt = reinterpret_cast(param);
+
+ QString hotkeyName = QTStr("QuickTransitions.HotkeyName")
+ .arg(MakeQuickTransitionText(qt));
+
+ obs_hotkey_set_description(qt->hotkey, QT_TO_UTF8(hotkeyName));
+
+ UNUSED_PARAMETER(data);
+}
+
void OBSBasic::TriggerQuickTransition(int id)
{
QuickTransition *qt = GetQuickTransition(id);
@@ -545,6 +559,10 @@ void OBSBasic::RenameTransition()
int idx = ui->transitions->findData(variant);
if (idx != -1) {
ui->transitions->setItemText(idx, QT_UTF8(name.c_str()));
+
+ if (api)
+ api->on_event(OBS_FRONTEND_EVENT_TRANSITION_LIST_CHANGED);
+
ClearQuickTransitionWidgets();
RefreshQuickTransitions();
}
@@ -639,12 +657,11 @@ void OBSBasic::SetCurrentScene(OBSSource scene, bool force, bool direct)
ui->scenes->blockSignals(true);
ui->scenes->setCurrentItem(item);
ui->scenes->blockSignals(false);
+ if (api)
+ api->on_event(OBS_FRONTEND_EVENT_PREVIEW_SCENE_CHANGED);
break;
}
}
-
- if (api && IsPreviewProgramMode())
- api->on_event(OBS_FRONTEND_EVENT_PREVIEW_SCENE_CHANGED);
}
UpdateSceneSelection(scene);
@@ -733,7 +750,7 @@ void OBSBasic::CreateProgramOptions()
programOptions->setLayout(layout);
auto onAdd = [this] () {
- QPointer menu = CreateTransitionMenu(this, nullptr);
+ QScopedPointer menu(CreateTransitionMenu(this, nullptr));
menu->exec(QCursor::pos());
};
diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp
index da9ddfcb2..b94e5b1cf 100644
--- a/UI/window-basic-main.cpp
+++ b/UI/window-basic-main.cpp
@@ -17,7 +17,7 @@
along with this program. If not, see .
******************************************************************************/
-#include
+#include
#include
#include
#include
@@ -25,15 +25,16 @@
#include
#include
#include
-#include
#include
+#include
+#include
+#include
#include
#include
#include
#include
#include
-#include
#include "obs-app.hpp"
#include "platform.hpp"
@@ -46,7 +47,6 @@
#include "window-basic-main.hpp"
#include "window-basic-stats.hpp"
#include "window-basic-main-outputs.hpp"
-#include "window-basic-properties.hpp"
#include "window-log-reply.hpp"
#include "window-projector.hpp"
#include "window-remux.hpp"
@@ -54,12 +54,15 @@
#include "display-helpers.hpp"
#include "volume-control.hpp"
#include "remote-text.hpp"
+#include
+#include
-#if defined(_WIN32) && defined(ENABLE_WIN_UPDATER)
+#ifdef _WIN32
#include "win-update/win-update.hpp"
#endif
#include "ui_OBSBasic.h"
+#include "ui_ColorSelect.h"
#include
#include
@@ -67,8 +70,16 @@
#include
#include
+#include
+
+using namespace json11;
using namespace std;
+#if defined(_WIN32) && defined(BROWSER_AVAILABLE)
+#include
+static CREATE_BROWSER_WIDGET_PROC create_browser_widget = nullptr;
+#endif
+
namespace {
template
@@ -103,10 +114,10 @@ static void AddExtraModulePaths()
char base_module_dir[512];
#if defined(_WIN32) || defined(__APPLE__)
int ret = GetProgramDataPath(base_module_dir, sizeof(base_module_dir),
- "obs-studio/plugins/%module%");
+ "ebs-studio/plugins/%module%");
#else
int ret = GetConfigPath(base_module_dir, sizeof(base_module_dir),
- "obs-studio/plugins/%module%");
+ "ebs-studio/plugins/%module%");
#endif
if (ret <= 0)
@@ -116,8 +127,8 @@ static void AddExtraModulePaths()
#if defined(__APPLE__)
obs_add_module_path((path + "/bin").c_str(), (path + "/data").c_str());
- BPtr config_bin = os_get_config_path_ptr("obs-studio/plugins/%module%/bin");
- BPtr config_data = os_get_config_path_ptr("obs-studio/plugins/%module%/data");
+ BPtr config_bin = os_get_config_path_ptr("ebs-studio/plugins/%module%/bin");
+ BPtr config_data = os_get_config_path_ptr("ebs-studio/plugins/%module%/data");
obs_add_module_path(config_bin, config_data);
#elif ARCH_BITS == 64
@@ -129,7 +140,27 @@ static void AddExtraModulePaths()
#endif
}
-static QList DeleteKeys;
+extern obs_frontend_callbacks *InitializeAPIInterface(OBSBasic *main);
+
+static int CountVideoSources()
+{
+ int count = 0;
+
+ auto countSources = [] (void *param, obs_source_t *source)
+ {
+ if (!source)
+ return true;
+
+ uint32_t flags = obs_source_get_output_flags(source);
+ if ((flags & OBS_SOURCE_VIDEO) != 0)
+ (*reinterpret_cast(param))++;
+
+ return true;
+ };
+
+ obs_enum_sources(countSources, &count);
+ return count;
+}
OBSBasic::OBSBasic(QWidget *parent)
: OBSMainWindow (parent),
@@ -137,21 +168,25 @@ OBSBasic::OBSBasic(QWidget *parent)
{
setAttribute(Qt::WA_NativeWindow);
- projectorArray.resize(10, "");
- previewProjectorArray.resize(10, 0);
- multiviewProjectorArray.resize(10, 0);
- studioProgramProjectorArray.resize(10, 0);
-
setAcceptDrops(true);
+ api = InitializeAPIInterface(this);
+
ui->setupUi(this);
ui->previewDisabledLabel->setVisible(false);
startingDockLayout = saveState();
- copyActionsDynamicProperties();
+ statsDock = new QDockWidget();
+ statsDock->setObjectName(QStringLiteral("statsDock"));
+ statsDock->setFeatures(QDockWidget::AllDockWidgetFeatures);
+ statsDock->setWindowTitle(QTStr("Basic.Stats"));
+ addDockWidget(Qt::BottomDockWidgetArea, statsDock);
+ statsDock->setVisible(false);
+ statsDock->setFloating(true);
+ statsDock->resize(700, 200);
- ui->sources->setItemDelegate(new VisibilityItemDelegate(ui->sources));
+ copyActionsDynamicProperties();
char styleSheetPath[512];
int ret = GetProfilePath(styleSheetPath, sizeof(styleSheetPath),
@@ -191,7 +226,7 @@ OBSBasic::OBSBasic(QWidget *parent)
installEventFilter(CreateShortcutFilter());
stringstream name;
- name << "OBS " << App()->GetVersionString();
+ name << "EBS " << App()->GetVersionString();
blog(LOG_INFO, "%s", name.str().c_str());
blog(LOG_INFO, "---------------------------------");
@@ -204,31 +239,35 @@ OBSBasic::OBSBasic(QWidget *parent)
SLOT(SceneNameEdited(QWidget*,
QAbstractItemDelegate::EndEditHint)));
- connect(ui->sources->itemDelegate(),
- SIGNAL(closeEditor(QWidget*,
- QAbstractItemDelegate::EndEditHint)),
- this,
- SLOT(SceneItemNameEdited(QWidget*,
- QAbstractItemDelegate::EndEditHint)));
-
cpuUsageInfo = os_cpu_usage_info_start();
cpuUsageTimer = new QTimer(this);
- connect(cpuUsageTimer, SIGNAL(timeout()),
+ connect(cpuUsageTimer.data(), SIGNAL(timeout()),
ui->statusbar, SLOT(UpdateCPUUsage()));
cpuUsageTimer->start(3000);
- DeleteKeys =
-#ifdef __APPLE__
- QList{{Qt::Key_Backspace}} <<
-#endif
- QKeySequence::keyBindings(QKeySequence::Delete);
+ QAction *renameScene = new QAction(ui->scenesDock);
+ renameScene->setShortcutContext(Qt::WidgetWithChildrenShortcut);
+ connect(renameScene, SIGNAL(triggered()), this, SLOT(EditSceneName()));
+ ui->scenesDock->addAction(renameScene);
+
+ QAction *renameSource = new QAction(ui->sourcesDock);
+ renameSource->setShortcutContext(Qt::WidgetWithChildrenShortcut);
+ connect(renameSource, SIGNAL(triggered()), this,
+ SLOT(EditSceneItemName()));
+ ui->sourcesDock->addAction(renameSource);
#ifdef __APPLE__
- ui->actionRemoveSource->setShortcuts(DeleteKeys);
- ui->actionRemoveScene->setShortcuts(DeleteKeys);
+ renameScene->setShortcut({Qt::Key_Return});
+ renameSource->setShortcut({Qt::Key_Return});
+
+ ui->actionRemoveSource->setShortcuts({Qt::Key_Backspace});
+ ui->actionRemoveScene->setShortcuts({Qt::Key_Backspace});
ui->action_Settings->setMenuRole(QAction::PreferencesRole);
ui->actionE_xit->setMenuRole(QAction::QuitRole);
+#else
+ renameScene->setShortcut({Qt::Key_F2});
+ renameSource->setShortcut({Qt::Key_F2});
#endif
auto addNudge = [this](const QKeySequence &seq, const char *s)
@@ -245,7 +284,7 @@ OBSBasic::OBSBasic(QWidget *parent)
addNudge(Qt::Key_Left, SLOT(NudgeLeft()));
addNudge(Qt::Key_Right, SLOT(NudgeRight()));
- auto assignDockToggle = [this](QDockWidget *dock, QAction *action)
+ auto assignDockToggle = [] (QDockWidget *dock, QAction *action)
{
auto handleWindowToggle = [action] (bool vis)
{
@@ -271,6 +310,7 @@ OBSBasic::OBSBasic(QWidget *parent)
assignDockToggle(ui->mixerDock, ui->toggleMixer);
assignDockToggle(ui->transitionsDock, ui->toggleTransitions);
assignDockToggle(ui->controlsDock, ui->toggleControls);
+ assignDockToggle(statsDock, ui->toggleStats);
//hide all docking panes
ui->toggleScenes->setChecked(false);
@@ -278,6 +318,9 @@ OBSBasic::OBSBasic(QWidget *parent)
ui->toggleMixer->setChecked(false);
ui->toggleTransitions->setChecked(false);
ui->toggleControls->setChecked(false);
+ ui->toggleStats->setChecked(false);
+
+ QPoint curPos;
//restore parent window geometry
const char *geometry = config_get_string(App()->GlobalConfig(),
@@ -295,7 +338,19 @@ OBSBasic::OBSBasic(QWidget *parent)
Qt::AlignCenter,
size(), rect));
}
+
+ curPos = pos();
+ } else {
+ QRect desktopRect = QGuiApplication::primaryScreen()->geometry();
+ QSize adjSize = desktopRect.size() / 2 - size() / 2;
+ curPos = QPoint(adjSize.width(), adjSize.height());
}
+
+ QPoint curSize(width(), height());
+ QPoint statsDockSize(statsDock->width(), statsDock->height());
+ QPoint statsDockPos = curSize / 2 - statsDockSize / 2;
+ QPoint newPos = curPos + statsDockPos;
+ statsDock->move(newPos);
}
static void SaveAudioDevice(const char *name, int channel, obs_data_t *parent,
@@ -319,10 +374,7 @@ static obs_data_t *GenerateSaveData(obs_data_array_t *sceneOrder,
obs_data_array_t *quickTransitionData, int transitionDuration,
obs_data_array_t *transitions,
OBSScene &scene, OBSSource &curProgramScene,
- obs_data_array_t *savedProjectorList,
- obs_data_array_t *savedPreviewProjectorList,
- obs_data_array_t *savedStudioProgramProjectorList,
- obs_data_array_t *savedMultiviewProjectorList)
+ obs_data_array_t *savedProjectorList)
{
obs_data_t *saveData = obs_data_create();
@@ -334,9 +386,16 @@ static obs_data_t *GenerateSaveData(obs_data_array_t *sceneOrder,
SaveAudioDevice(AUX_AUDIO_1, 3, saveData, audioSources);
SaveAudioDevice(AUX_AUDIO_2, 4, saveData, audioSources);
SaveAudioDevice(AUX_AUDIO_3, 5, saveData, audioSources);
+ SaveAudioDevice(AUX_AUDIO_4, 6, saveData, audioSources);
+
+ /* -------------------------------- */
+ /* save non-group sources */
auto FilterAudioSources = [&](obs_source_t *source)
{
+ if (obs_source_is_group(source))
+ return false;
+
return find(begin(audioSources), end(audioSources), source) ==
end(audioSources);
};
@@ -348,6 +407,18 @@ static obs_data_t *GenerateSaveData(obs_data_array_t *sceneOrder,
return (*static_cast(data))(source);
}, static_cast(&FilterAudioSources));
+ /* -------------------------------- */
+ /* save group sources separately */
+
+ /* saving separately ensures they won't be loaded in older versions */
+ obs_data_array_t *groupsArray = obs_save_sources_filtered(
+ [](void*, obs_source_t *source)
+ {
+ return obs_source_is_group(source);
+ }, nullptr);
+
+ /* -------------------------------- */
+
obs_source_t *transition = obs_get_output_source(0);
obs_source_t *currentScene = obs_scene_get_source(scene);
const char *sceneName = obs_source_get_name(currentScene);
@@ -361,16 +432,12 @@ static obs_data_t *GenerateSaveData(obs_data_array_t *sceneOrder,
obs_data_set_array(saveData, "scene_order", sceneOrder);
obs_data_set_string(saveData, "name", sceneCollection);
obs_data_set_array(saveData, "sources", sourcesArray);
+ obs_data_set_array(saveData, "groups", groupsArray);
obs_data_set_array(saveData, "quick_transitions", quickTransitionData);
obs_data_set_array(saveData, "transitions", transitions);
obs_data_set_array(saveData, "saved_projectors", savedProjectorList);
- obs_data_set_array(saveData, "saved_preview_projectors",
- savedPreviewProjectorList);
- obs_data_set_array(saveData, "saved_studio_preview_projectors",
- savedStudioProgramProjectorList);
- obs_data_set_array(saveData, "saved_multiview_projectors",
- savedMultiviewProjectorList);
obs_data_array_release(sourcesArray);
+ obs_data_array_release(groupsArray);
obs_data_set_string(saveData, "current_transition",
obs_source_get_name(transition));
@@ -410,14 +477,33 @@ void OBSBasic::UpdateVolumeControlsDecayRate()
}
}
-void OBSBasic::ClearVolumeControls()
+void OBSBasic::UpdateVolumeControlsPeakMeterType()
{
- VolControl *control;
+ uint32_t peakMeterTypeIdx = config_get_uint(basicConfig, "Audio",
+ "PeakMeterType");
+
+ enum obs_peak_meter_type peakMeterType;
+ switch (peakMeterTypeIdx) {
+ case 0:
+ peakMeterType = SAMPLE_PEAK_METER;
+ break;
+ case 1:
+ peakMeterType = TRUE_PEAK_METER;
+ break;
+ default:
+ peakMeterType = SAMPLE_PEAK_METER;
+ break;
+ }
for (size_t i = 0; i < volumes.size(); i++) {
- control = volumes[i];
- delete control;
+ volumes[i]->setPeakMeterType(peakMeterType);
}
+}
+
+void OBSBasic::ClearVolumeControls()
+{
+ for (VolControl *vol : volumes)
+ delete vol;
volumes.clear();
}
@@ -439,62 +525,41 @@ obs_data_array_t *OBSBasic::SaveSceneListOrder()
obs_data_array_t *OBSBasic::SaveProjectors()
{
- obs_data_array_t *saveProjector = obs_data_array_create();
-
- for (size_t i = 0; i < projectorArray.size(); i++) {
- obs_data_t *data = obs_data_create();
- obs_data_set_string(data, "saved_projectors",
- projectorArray.at(i).c_str());
- obs_data_array_push_back(saveProjector, data);
- obs_data_release(data);
- }
-
- return saveProjector;
-}
-
-obs_data_array_t *OBSBasic::SavePreviewProjectors()
-{
- obs_data_array_t *saveProjector = obs_data_array_create();
+ obs_data_array_t *savedProjectors = obs_data_array_create();
- for (size_t i = 0; i < previewProjectorArray.size(); i++) {
- obs_data_t *data = obs_data_create();
- obs_data_set_int(data, "saved_preview_projectors",
- previewProjectorArray.at(i));
- obs_data_array_push_back(saveProjector, data);
- obs_data_release(data);
- }
-
- return saveProjector;
-}
-
-obs_data_array_t *OBSBasic::SaveStudioProgramProjectors()
-{
- obs_data_array_t *saveProjector = obs_data_array_create();
+ auto saveProjector = [savedProjectors](OBSProjector *projector) {
+ if (!projector)
+ return;
- for (size_t i = 0; i < studioProgramProjectorArray.size(); i++) {
obs_data_t *data = obs_data_create();
- obs_data_set_int(data, "saved_studio_preview_projectors",
- studioProgramProjectorArray.at(i));
- obs_data_array_push_back(saveProjector, data);
+ ProjectorType type = projector->GetProjectorType();
+ switch (type) {
+ case ProjectorType::Scene:
+ case ProjectorType::Source: {
+ obs_source_t *source = projector->GetSource();
+ const char *name = obs_source_get_name(source);
+ obs_data_set_string(data, "name", name);
+ break;
+ }
+ default:
+ break;
+ }
+ obs_data_set_int(data, "monitor", projector->GetMonitor());
+ obs_data_set_int(data, "type", static_cast(type));
+ obs_data_set_string(data, "geometry",
+ projector->saveGeometry().toBase64()
+ .constData());
+ obs_data_array_push_back(savedProjectors, data);
obs_data_release(data);
- }
-
- return saveProjector;
-}
+ };
-obs_data_array_t *OBSBasic::SaveMultiviewProjectors()
-{
- obs_data_array_t *saveProjector = obs_data_array_create();
+ for (QPointer &proj : projectors)
+ saveProjector(static_cast(proj.data()));
- for (size_t i = 0; i < multiviewProjectorArray.size(); i++) {
- obs_data_t *data = obs_data_create();
- obs_data_set_int(data, "saved_multiview_projectors",
- multiviewProjectorArray.at(i));
- obs_data_array_push_back(saveProjector, data);
- obs_data_release(data);
- }
+ for (QPointer &proj : windowProjectors)
+ saveProjector(static_cast(proj.data()));
- return saveProjector;
+ return savedProjectors;
}
void OBSBasic::Save(const char *file)
@@ -508,17 +573,9 @@ void OBSBasic::Save(const char *file)
obs_data_array_t *transitions = SaveTransitions();
obs_data_array_t *quickTrData = SaveQuickTransitions();
obs_data_array_t *savedProjectorList = SaveProjectors();
- obs_data_array_t *savedPreviewProjectorList = SavePreviewProjectors();
- obs_data_array_t *savedStudioProgramProjectorList =
- SaveStudioProgramProjectors();
- obs_data_array_t *savedMultiviewProjectorList =
- SaveMultiviewProjectors();
obs_data_t *saveData = GenerateSaveData(sceneOrder, quickTrData,
ui->transitionDuration->value(), transitions,
- scene, curProgramScene, savedProjectorList,
- savedPreviewProjectorList,
- savedStudioProgramProjectorList,
- savedMultiviewProjectorList);
+ scene, curProgramScene, savedProjectorList);
obs_data_set_bool(saveData, "preview_locked", ui->preview->Locked());
obs_data_set_bool(saveData, "scaling_enabled",
@@ -545,9 +602,19 @@ void OBSBasic::Save(const char *file)
obs_data_array_release(quickTrData);
obs_data_array_release(transitions);
obs_data_array_release(savedProjectorList);
- obs_data_array_release(savedPreviewProjectorList);
- obs_data_array_release(savedStudioProgramProjectorList);
- obs_data_array_release(savedMultiviewProjectorList);
+}
+
+void OBSBasic::DeferSaveBegin()
+{
+ os_atomic_inc_long(&disableSaving);
+}
+
+void OBSBasic::DeferSaveEnd()
+{
+ long result = os_atomic_dec_long(&disableSaving);
+ if (result == 0) {
+ SaveProject();
+ }
}
static void LoadAudioDevice(const char *name, int channel, obs_data_t *parent)
@@ -611,7 +678,6 @@ void OBSBasic::CreateDefaultScene(bool firstStart)
if (firstStart)
CreateFirstRunSources();
- AddScene(obs_scene_get_source(scene));
SetCurrentScene(scene, true);
obs_scene_release(scene);
@@ -653,47 +719,15 @@ void OBSBasic::LoadSavedProjectors(obs_data_array_t *array)
for (size_t i = 0; i < num; i++) {
obs_data_t *data = obs_data_array_item(array, i);
- projectorArray.at(i) = obs_data_get_string(data,
- "saved_projectors");
-
- obs_data_release(data);
- }
-}
-
-void OBSBasic::LoadSavedPreviewProjectors(obs_data_array_t *array)
-{
- size_t num = obs_data_array_count(array);
-
- for (size_t i = 0; i < num; i++) {
- obs_data_t *data = obs_data_array_item(array, i);
- previewProjectorArray.at(i) = obs_data_get_int(data,
- "saved_preview_projectors");
-
- obs_data_release(data);
- }
-}
-
-void OBSBasic::LoadSavedStudioProgramProjectors(obs_data_array_t *array)
-{
- size_t num = obs_data_array_count(array);
-
- for (size_t i = 0; i < num; i++) {
- obs_data_t *data = obs_data_array_item(array, i);
- studioProgramProjectorArray.at(i) = obs_data_get_int(data,
- "saved_studio_preview_projectors");
-
- obs_data_release(data);
- }
-}
-
-void OBSBasic::LoadSavedMultiviewProjectors(obs_data_array_t *array)
-{
- size_t num = obs_data_array_count(array);
- for (size_t i = 0; i < num; i++) {
- obs_data_t *data = obs_data_array_item(array, i);
- multiviewProjectorArray.at(i) = obs_data_get_int(data,
- "saved_multiview_projectors");
+ SavedProjectorInfo *info = new SavedProjectorInfo();
+ info->monitor = obs_data_get_int(data, "monitor");
+ info->type = static_cast(obs_data_get_int(data,
+ "type"));
+ info->geometry = std::string(
+ obs_data_get_string(data, "geometry"));
+ info->name = std::string(obs_data_get_string(data, "name"));
+ savedProjectorsArray.emplace_back(info);
obs_data_release(data);
}
@@ -778,6 +812,7 @@ void OBSBasic::Load(const char *file)
obs_data_array_t *sceneOrder = obs_data_get_array(data, "scene_order");
obs_data_array_t *sources = obs_data_get_array(data, "sources");
+ obs_data_array_t *groups = obs_data_get_array(data, "groups");
obs_data_array_t *transitions= obs_data_get_array(data, "transitions");
const char *sceneName = obs_data_get_string(data,
"current_scene");
@@ -817,8 +852,16 @@ void OBSBasic::Load(const char *file)
LoadAudioDevice(AUX_AUDIO_1, 3, data);
LoadAudioDevice(AUX_AUDIO_2, 4, data);
LoadAudioDevice(AUX_AUDIO_3, 5, data);
+ LoadAudioDevice(AUX_AUDIO_4, 6, data);
+
+ if (!sources) {
+ sources = groups;
+ groups = nullptr;
+ } else {
+ obs_data_array_push_back_array(sources, groups);
+ }
- obs_load_sources(sources, OBSBasic::SourceLoaded, this);
+ obs_load_sources(sources, nullptr, nullptr);
if (transitions)
LoadTransitions(transitions);
@@ -834,47 +877,6 @@ void OBSBasic::Load(const char *file)
ui->transitionDuration->setValue(newDuration);
SetTransition(curTransition);
- /* ------------------- */
-
- obs_data_array_t *savedProjectors = obs_data_get_array(data,
- "saved_projectors");
-
- if (savedProjectors)
- LoadSavedProjectors(savedProjectors);
-
- obs_data_array_release(savedProjectors);
-
- /* ------------------- */
-
- obs_data_array_t *savedPreviewProjectors = obs_data_get_array(data,
- "saved_preview_projectors");
-
- if (savedPreviewProjectors)
- LoadSavedPreviewProjectors(savedPreviewProjectors);
-
- obs_data_array_release(savedPreviewProjectors);
-
- /* ------------------- */
-
- obs_data_array_t *savedStudioProgramProjectors = obs_data_get_array(data,
- "saved_studio_preview_projectors");
-
- if (savedStudioProgramProjectors)
- LoadSavedStudioProgramProjectors(savedStudioProgramProjectors);
-
- obs_data_array_release(savedStudioProgramProjectors);
-
- /* ------------------- */
-
- obs_data_array_t *savedMultiviewProjectors = obs_data_get_array(data,
- "saved_multiview_projectors");
-
- if (savedMultiviewProjectors)
- LoadSavedMultiviewProjectors(savedMultiviewProjectors);
-
- obs_data_array_release(savedMultiviewProjectors);
-
-
retryScene:
curScene = obs_get_source_by_name(sceneName);
curProgramScene = obs_get_source_by_name(programSceneName);
@@ -903,8 +905,29 @@ void OBSBasic::Load(const char *file)
obs_source_release(curProgramScene);
obs_data_array_release(sources);
+ obs_data_array_release(groups);
obs_data_array_release(sceneOrder);
+ /* ------------------- */
+
+ bool projectorSave = config_get_bool(GetGlobalConfig(), "BasicWindow",
+ "SaveProjectors");
+
+ if (projectorSave) {
+ obs_data_array_t *savedProjectors = obs_data_get_array(data,
+ "saved_projectors");
+
+ if (savedProjectors) {
+ LoadSavedProjectors(savedProjectors);
+ OpenSavedProjectors();
+ activateWindow();
+ }
+
+ obs_data_array_release(savedProjectors);
+ }
+
+ /* ------------------- */
+
std::string file_base = strrchr(file, '/') + 1;
file_base.erase(file_base.size() - 5, 5);
@@ -955,12 +978,12 @@ void OBSBasic::Load(const char *file)
opt_start_streaming = false;
}
- if (opt_start_recording) {
- blog(LOG_INFO, "Starting recording due to command line parameter");
- QMetaObject::invokeMethod(this, "StartRecording",
- Qt::QueuedConnection);
- opt_start_recording = false;
- }
+// if (opt_start_recording) {
+// blog(LOG_INFO, "Starting recording due to command line parameter");
+// QMetaObject::invokeMethod(this, "StartRecording",
+// Qt::QueuedConnection);
+// opt_start_recording = false;
+// }
if (opt_start_replaybuffer) {
QMetaObject::invokeMethod(this, "StartReplayBuffer",
@@ -972,8 +995,10 @@ void OBSBasic::Load(const char *file)
disableSaving--;
- if (api)
+ if (api) {
api->on_event(OBS_FRONTEND_EVENT_SCENE_CHANGED);
+ api->on_event(OBS_FRONTEND_EVENT_PREVIEW_SCENE_CHANGED);
+ }
}
#define SERVICE_PATH "service.json"
@@ -1015,7 +1040,7 @@ bool OBSBasic::LoadService()
obs_data_t *data = obs_data_create_from_json_file_safe(serviceJsonPath,
"bak");
- obs_data_set_default_string(data, "type", "rtmp_common");
+ obs_data_set_default_string(data, "type", "webrtc_janus");
type = obs_data_get_string(data, "type");
obs_data_t *settings = obs_data_get_obj(data, "settings");
@@ -1039,7 +1064,7 @@ bool OBSBasic::InitService()
if (LoadService())
return true;
- service = obs_service_create("rtmp_common", "default_service", nullptr,
+ service = obs_service_create("webrtc_janus", "default_service", nullptr,
nullptr);
if (!service)
return false;
@@ -1247,6 +1272,7 @@ bool OBSBasic::InitBasicConfigDefaults()
"Stereo");
config_set_default_double(basicConfig, "Audio", "MeterDecayRate",
VOLUME_METER_DECAY_FAST);
+ config_set_default_uint (basicConfig, "Audio", "PeakMeterType", 0);
return true;
}
@@ -1296,6 +1322,8 @@ void OBSBasic::InitOBSCallbacks()
ProfileScope("OBSBasic::InitOBSCallbacks");
signalHandlers.reserve(signalHandlers.size() + 6);
+ signalHandlers.emplace_back(obs_get_signal_handler(), "source_create",
+ OBSBasic::SourceCreated, this);
signalHandlers.emplace_back(obs_get_signal_handler(), "source_remove",
OBSBasic::SourceRemoved, this);
signalHandlers.emplace_back(obs_get_signal_handler(), "source_activate",
@@ -1377,6 +1405,7 @@ void OBSBasic::ResetOutputs()
replayBufferButton = new QPushButton(
QTStr("Basic.Main.StartReplayBuffer"),
this);
+ replayBufferButton->setCheckable(true);
connect(replayBufferButton.data(),
&QPushButton::clicked,
this,
@@ -1402,8 +1431,6 @@ static void AddProjectorMenuMonitors(QMenu *parent, QObject *target,
#define SHUTDOWN_SEPARATOR \
"==== Shutting down =================================================="
-extern obs_frontend_callbacks *InitializeAPIInterface(OBSBasic *main);
-
#define UNSUPPORTED_ERROR \
"Failed to initialize video:\n\nRequired graphics API functionality " \
"not found. Your GPU may not be supported."
@@ -1425,7 +1452,7 @@ void OBSBasic::OBSInit()
if (!sceneCollection)
throw "Failed to get scene collection name";
- ret = snprintf(fileName, 512, "obs-studio/basic/scenes/%s.json",
+ ret = snprintf(fileName, 512, "ebs-studio/basic/scenes/%s.json",
sceneCollection);
if (ret <= 0)
throw "Failed to create scene collection file name";
@@ -1469,8 +1496,6 @@ void OBSBasic::OBSInit()
InitOBSCallbacks();
InitHotkeys();
- api = InitializeAPIInterface(this);
-
AddExtraModulePaths();
blog(LOG_INFO, "---------------------------------");
obs_load_all_modules();
@@ -1479,6 +1504,10 @@ void OBSBasic::OBSInit()
blog(LOG_INFO, "---------------------------------");
obs_post_load_modules();
+#if defined(_WIN32) && defined(BROWSER_AVAILABLE)
+ create_browser_widget = obs_browser_init_panel();
+#endif
+
CheckForSimpleModeX264Fallback();
blog(LOG_INFO, STARTUP_SEPARATOR);
@@ -1520,12 +1549,14 @@ void OBSBasic::OBSInit()
SET_VISIBILITY("ShowStatusBar", toggleStatusBar);
#undef SET_VISIBILITY
+#ifndef __APPLE__
{
ProfileScope("OBSBasic::Load");
disableSaving--;
Load(savePath);
disableSaving++;
}
+#endif
TimedCheckForUpdates();
loaded = true;
@@ -1547,7 +1578,9 @@ void OBSBasic::OBSInit()
}
#endif
+#ifndef __APPLE__
RefreshSceneCollections();
+#endif
RefreshProfiles();
disableSaving--;
@@ -1579,6 +1612,10 @@ void OBSBasic::OBSInit()
show();
#endif
+ /* setup stats dock */
+ OBSBasicStats *statsDlg = new OBSBasicStats(statsDock, false);
+ statsDock->setWidget(statsDlg);
+
const char *dockStateStr = config_get_string(App()->GlobalConfig(),
"BasicWindow", "DockState");
if (!dockStateStr) {
@@ -1600,9 +1637,9 @@ void OBSBasic::OBSInit()
ui->lockUI->setChecked(docksLocked);
ui->lockUI->blockSignals(false);
+#ifndef __APPLE__
SystemTray(true);
-
- OpenSavedProjectors();
+#endif
if (windowState().testFlag(Qt::WindowFullScreen))
fullscreenInterface = true;
@@ -1618,24 +1655,25 @@ void OBSBasic::OBSInit()
config_save_safe(App()->GlobalConfig(), "tmp", nullptr);
}
- if (!first_run && !has_last_version && !Active()) {
- QString msg;
- msg = QTStr("Basic.FirstStartup.RunWizard");
- msg += "\n\n";
- msg += QTStr("Basic.FirstStartup.RunWizard.BetaWarning");
-
- QMessageBox::StandardButton button =
- OBSMessageBox::question(this, QTStr("Basic.AutoConfig"),
- msg);
-
- if (button == QMessageBox::Yes) {
- on_autoConfigure_triggered();
- } else {
- msg = QTStr("Basic.FirstStartup.RunWizard.NoClicked");
- OBSMessageBox::information(this,
- QTStr("Basic.AutoConfig"), msg);
- }
- }
+// if (!first_run && !has_last_version && !Active()) {
+// QString msg;
+// msg = QTStr("Basic.FirstStartup.RunWizard");
+//
+// QMessageBox::StandardButton button =
+// OBSMessageBox::question(this, QTStr("Basic.AutoConfig"),
+// msg);
+//
+// if (button == QMessageBox::Yes) {
+// on_autoConfigure_triggered();
+// } else {
+// msg = QTStr("Basic.FirstStartup.RunWizard.NoClicked");
+// OBSMessageBox::information(this,
+// QTStr("Basic.AutoConfig"), msg);
+// }
+// }
+
+ ToggleMixerLayout(config_get_bool(App()->GlobalConfig(), "BasicWindow",
+ "VerticalVolControl"));
if (config_get_bool(basicConfig, "General", "OpenStatsOnStartup"))
on_stats_triggered();
@@ -1647,80 +1685,271 @@ void OBSBasic::OBSInit()
ui->viewMenu->addSeparator();
- QMenu *multiviewProjectorMenu = new QMenu(QTStr("MultiviewProjector"));
+ multiviewProjectorMenu = new QMenu(QTStr("MultiviewProjector"));
+ ui->viewMenu->addMenu(multiviewProjectorMenu);
AddProjectorMenuMonitors(multiviewProjectorMenu, this,
SLOT(OpenMultiviewProjector()));
- ui->viewMenu->addMenu(multiviewProjectorMenu);
-
+ connect(ui->viewMenu->menuAction(), &QAction::hovered, this,
+ &OBSBasic::UpdateMultiviewProjectorMenu);
ui->viewMenu->addAction(QTStr("MultiviewWindowed"),
this, SLOT(OpenMultiviewWindow()));
-}
-void OBSBasic::InitHotkeys()
-{
- ProfileScope("OBSBasic::InitHotkeys");
+#if !defined(_WIN32) && !defined(__APPLE__)
+ delete ui->actionShowCrashLogs;
+ delete ui->actionUploadLastCrashLog;
+ delete ui->menuCrashLogs;
+ delete ui->actionCheckForUpdates;
+ ui->actionShowCrashLogs = nullptr;
+ ui->actionUploadLastCrashLog = nullptr;
+ ui->menuCrashLogs = nullptr;
+ ui->actionCheckForUpdates = nullptr;
+#endif
- struct obs_hotkeys_translations t = {};
- t.insert = Str("Hotkeys.Insert");
- t.del = Str("Hotkeys.Delete");
- t.home = Str("Hotkeys.Home");
- t.end = Str("Hotkeys.End");
- t.page_up = Str("Hotkeys.PageUp");
- t.page_down = Str("Hotkeys.PageDown");
- t.num_lock = Str("Hotkeys.NumLock");
- t.scroll_lock = Str("Hotkeys.ScrollLock");
- t.caps_lock = Str("Hotkeys.CapsLock");
- t.backspace = Str("Hotkeys.Backspace");
- t.tab = Str("Hotkeys.Tab");
- t.print = Str("Hotkeys.Print");
- t.pause = Str("Hotkeys.Pause");
- t.left = Str("Hotkeys.Left");
- t.right = Str("Hotkeys.Right");
- t.up = Str("Hotkeys.Up");
- t.down = Str("Hotkeys.Down");
-#ifdef _WIN32
- t.meta = Str("Hotkeys.Windows");
+#ifdef __APPLE__
+ /* This is an incredibly unpleasant hack for macOS to isolate CEF
+ * initialization until after all tasks related to Qt startup and main
+ * window initialization have completed. There is a macOS-specific bug
+ * within either CEF and/or Qt that can cause a crash if both Qt and
+ * CEF are loading at the same time.
+ *
+ * CEF will typically load fine after about two iterations from this
+ * point, and all Qt tasks are typically fully completed after about
+ * four or five iterations, but to be "ultra" safe, an arbitrarily
+ * large number such as 10 is used. This hack is extremely unpleasant,
+ * but is worth doing instead of being forced to isolate the entire
+ * browser plugin in to a separate process as before.
+ *
+ * Again, this hack is specific to macOS only. Fortunately, on other
+ * operating systems, such issues do not occur. */
+ QMetaObject::invokeMethod(this, "DeferredLoad",
+ Qt::QueuedConnection,
+ Q_ARG(QString, QT_UTF8(savePath)),
+ Q_ARG(int, 10));
#else
- t.meta = Str("Hotkeys.Super");
+ OnFirstLoad();
#endif
- t.menu = Str("Hotkeys.Menu");
- t.space = Str("Hotkeys.Space");
- t.numpad_num = Str("Hotkeys.NumpadNum");
- t.numpad_multiply = Str("Hotkeys.NumpadMultiply");
- t.numpad_divide = Str("Hotkeys.NumpadDivide");
- t.numpad_plus = Str("Hotkeys.NumpadAdd");
- t.numpad_minus = Str("Hotkeys.NumpadSubtract");
- t.numpad_decimal = Str("Hotkeys.NumpadDecimal");
- t.apple_keypad_num = Str("Hotkeys.AppleKeypadNum");
- t.apple_keypad_multiply = Str("Hotkeys.AppleKeypadMultiply");
- t.apple_keypad_divide = Str("Hotkeys.AppleKeypadDivide");
- t.apple_keypad_plus = Str("Hotkeys.AppleKeypadAdd");
- t.apple_keypad_minus = Str("Hotkeys.AppleKeypadSubtract");
- t.apple_keypad_decimal = Str("Hotkeys.AppleKeypadDecimal");
- t.apple_keypad_equal = Str("Hotkeys.AppleKeypadEqual");
- t.mouse_num = Str("Hotkeys.MouseButton");
- obs_hotkeys_set_translations(&t);
-
- obs_hotkeys_set_audio_hotkeys_translations(Str("Mute"), Str("Unmute"),
- Str("Push-to-mute"), Str("Push-to-talk"));
-
- obs_hotkeys_set_sceneitem_hotkeys_translations(
- Str("SceneItemShow"), Str("SceneItemHide"));
-
- obs_hotkey_enable_callback_rerouting(true);
- obs_hotkey_set_callback_routing_func(OBSBasic::HotkeyTriggered, this);
}
-void OBSBasic::ProcessHotkey(obs_hotkey_id id, bool pressed)
+void OBSBasic::OnFirstLoad()
{
- obs_hotkey_trigger_routed_callback(id, pressed);
+ if (api)
+ api->on_event(OBS_FRONTEND_EVENT_FINISHED_LOADING);
+
+#if defined(_WIN32) && defined(BROWSER_AVAILABLE)
+ /* Attempt to load init screen if available */
+ if (create_browser_widget) {
+ WhatsNewInfoThread *wnit = new WhatsNewInfoThread();
+ if (wnit) {
+ connect(wnit, &WhatsNewInfoThread::Result,
+ this, &OBSBasic::ReceivedIntroJson);
+ }
+ if (wnit) {
+ introCheckThread.reset(wnit);
+ introCheckThread->start();
+ }
+ }
+#endif
}
-void OBSBasic::HotkeyTriggered(void *data, obs_hotkey_id id, bool pressed)
+void OBSBasic::DeferredLoad(const QString &file, int requeueCount)
{
- OBSBasic &basic = *static_cast(data);
- QMetaObject::invokeMethod(&basic, "ProcessHotkey",
- Q_ARG(obs_hotkey_id, id), Q_ARG(bool, pressed));
+ if (--requeueCount > 0) {
+ QMetaObject::invokeMethod(this, "DeferredLoad",
+ Qt::QueuedConnection,
+ Q_ARG(QString, file),
+ Q_ARG(int, requeueCount));
+ return;
+ }
+
+ Load(QT_TO_UTF8(file));
+ RefreshSceneCollections();
+ OnFirstLoad();
+
+ /* Minimizng to tray on initial startup does not work on mac
+ * unless it is done in the deferred load */
+ SystemTray(true);
+}
+
+/* shows a "what's new" page on startup of new versions using CEF */
+void OBSBasic::ReceivedIntroJson(const QString &text)
+{
+#ifdef BROWSER_AVAILABLE
+#ifdef _WIN32
+ std::string err;
+ Json json = Json::parse(QT_TO_UTF8(text), err);
+ if (!err.empty())
+ return;
+
+ std::string info_url;
+ int info_increment = -1;
+
+ /* check to see if there's an info page for this version */
+ const Json::array &items = json.array_items();
+ for (const Json &item : items) {
+ const std::string &version = item["version"].string_value();
+ const std::string &url = item["url"].string_value();
+ int increment = item["increment"].int_value();
+ int rc = item["RC"].int_value();
+
+ int major = 0;
+ int minor = 0;
+
+ sscanf(version.c_str(), "%d.%d", &major, &minor);
+#if OBS_RELEASE_CANDIDATE > 0
+ if (major == OBS_RELEASE_CANDIDATE_MAJOR &&
+ minor == OBS_RELEASE_CANDIDATE_MINOR &&
+ rc == OBS_RELEASE_CANDIDATE) {
+#else
+ if (major == LIBOBS_API_MAJOR_VER &&
+ minor == LIBOBS_API_MINOR_VER &&
+ rc == 0) {
+#endif
+ info_url = url;
+ info_increment = increment;
+ }
+ }
+
+ /* this version was not found, or no info for this version */
+ if (info_increment == -1) {
+ return;
+ }
+
+#if OBS_RELEASE_CANDIDATE > 0
+ uint32_t lastVersion = config_get_int(App()->GlobalConfig(), "General",
+ "LastRCVersion");
+#else
+ uint32_t lastVersion = config_get_int(App()->GlobalConfig(), "General",
+ "LastVersion");
+#endif
+
+ int current_version_increment = -1;
+
+#if OBS_RELEASE_CANDIDATE > 0
+ if (lastVersion < OBS_RELEASE_CANDIDATE_VER) {
+#else
+ if (lastVersion < LIBOBS_API_VER) {
+#endif
+ config_set_int(App()->GlobalConfig(), "General",
+ "InfoIncrement", -1);
+ } else {
+ current_version_increment = config_get_int(
+ App()->GlobalConfig(), "General",
+ "InfoIncrement");
+ }
+
+ if (info_increment <= current_version_increment) {
+ return;
+ }
+
+ config_set_int(App()->GlobalConfig(), "General",
+ "InfoIncrement", info_increment);
+
+ QDialog dlg(this);
+ dlg.setWindowTitle("What's New");
+ dlg.resize(700, 600);
+
+ QCefWidget *cefWidget = create_browser_widget(nullptr, info_url);
+ if (!cefWidget) {
+ return;
+ }
+
+ connect(cefWidget, SIGNAL(titleChanged(const QString &)),
+ &dlg, SLOT(setWindowTitle(const QString &)));
+
+ QPushButton *close = new QPushButton(QTStr("Close"));
+ connect(close, &QAbstractButton::clicked,
+ &dlg, &QDialog::accept);
+
+ QHBoxLayout *bottomLayout = new QHBoxLayout();
+ bottomLayout->addStretch();
+ bottomLayout->addWidget(close);
+ bottomLayout->addStretch();
+
+ QVBoxLayout *topLayout = new QVBoxLayout(&dlg);
+ topLayout->addWidget(cefWidget);
+ topLayout->addLayout(bottomLayout);
+
+ dlg.exec();
+#else
+ UNUSED_PARAMETER(text);
+#endif
+#else
+ UNUSED_PARAMETER(text);
+#endif
+}
+
+void OBSBasic::UpdateMultiviewProjectorMenu()
+{
+ multiviewProjectorMenu->clear();
+ AddProjectorMenuMonitors(multiviewProjectorMenu, this,
+ SLOT(OpenMultiviewProjector()));
+}
+
+void OBSBasic::InitHotkeys()
+{
+ ProfileScope("OBSBasic::InitHotkeys");
+
+ struct obs_hotkeys_translations t = {};
+ t.insert = Str("Hotkeys.Insert");
+ t.del = Str("Hotkeys.Delete");
+ t.home = Str("Hotkeys.Home");
+ t.end = Str("Hotkeys.End");
+ t.page_up = Str("Hotkeys.PageUp");
+ t.page_down = Str("Hotkeys.PageDown");
+ t.num_lock = Str("Hotkeys.NumLock");
+ t.scroll_lock = Str("Hotkeys.ScrollLock");
+ t.caps_lock = Str("Hotkeys.CapsLock");
+ t.backspace = Str("Hotkeys.Backspace");
+ t.tab = Str("Hotkeys.Tab");
+ t.print = Str("Hotkeys.Print");
+ t.pause = Str("Hotkeys.Pause");
+ t.left = Str("Hotkeys.Left");
+ t.right = Str("Hotkeys.Right");
+ t.up = Str("Hotkeys.Up");
+ t.down = Str("Hotkeys.Down");
+#ifdef _WIN32
+ t.meta = Str("Hotkeys.Windows");
+#else
+ t.meta = Str("Hotkeys.Super");
+#endif
+ t.menu = Str("Hotkeys.Menu");
+ t.space = Str("Hotkeys.Space");
+ t.numpad_num = Str("Hotkeys.NumpadNum");
+ t.numpad_multiply = Str("Hotkeys.NumpadMultiply");
+ t.numpad_divide = Str("Hotkeys.NumpadDivide");
+ t.numpad_plus = Str("Hotkeys.NumpadAdd");
+ t.numpad_minus = Str("Hotkeys.NumpadSubtract");
+ t.numpad_decimal = Str("Hotkeys.NumpadDecimal");
+ t.apple_keypad_num = Str("Hotkeys.AppleKeypadNum");
+ t.apple_keypad_multiply = Str("Hotkeys.AppleKeypadMultiply");
+ t.apple_keypad_divide = Str("Hotkeys.AppleKeypadDivide");
+ t.apple_keypad_plus = Str("Hotkeys.AppleKeypadAdd");
+ t.apple_keypad_minus = Str("Hotkeys.AppleKeypadSubtract");
+ t.apple_keypad_decimal = Str("Hotkeys.AppleKeypadDecimal");
+ t.apple_keypad_equal = Str("Hotkeys.AppleKeypadEqual");
+ t.mouse_num = Str("Hotkeys.MouseButton");
+ obs_hotkeys_set_translations(&t);
+
+ obs_hotkeys_set_audio_hotkeys_translations(Str("Mute"), Str("Unmute"),
+ Str("Push-to-mute"), Str("Push-to-talk"));
+
+ obs_hotkeys_set_sceneitem_hotkeys_translations(
+ Str("SceneItemShow"), Str("SceneItemHide"));
+
+ obs_hotkey_enable_callback_rerouting(true);
+ obs_hotkey_set_callback_routing_func(OBSBasic::HotkeyTriggered, this);
+}
+
+void OBSBasic::ProcessHotkey(obs_hotkey_id id, bool pressed)
+{
+ obs_hotkey_trigger_routed_callback(id, pressed);
+}
+
+void OBSBasic::HotkeyTriggered(void *data, obs_hotkey_id id, bool pressed)
+{
+ OBSBasic &basic = *static_cast(data);
+ QMetaObject::invokeMethod(&basic, "ProcessHotkey",
+ Q_ARG(obs_hotkey_id, id), Q_ARG(bool, pressed));
}
void OBSBasic::CreateHotkeys()
@@ -1769,7 +1998,7 @@ void OBSBasic::CreateHotkeys()
[](void *data, obs_hotkey_pair_id, obs_hotkey_t*, bool pressed) \
{ \
OBSBasic &basic = *static_cast(data); \
- if (pred && pressed) { \
+ if ((pred) && pressed) { \
blog(LOG_INFO, log_action " due to hotkey"); \
method(); \
return true; \
@@ -1782,9 +2011,11 @@ void OBSBasic::CreateHotkeys()
Str("Basic.Main.StartStreaming"),
"OBSBasic.StopStreaming",
Str("Basic.Main.StopStreaming"),
- MAKE_CALLBACK(!basic.outputHandler->StreamingActive(),
+ MAKE_CALLBACK(!basic.outputHandler->StreamingActive() &&
+ basic.ui->streamButton->isEnabled(),
basic.StartStreaming, "Starting stream"),
- MAKE_CALLBACK(basic.outputHandler->StreamingActive(),
+ MAKE_CALLBACK(basic.outputHandler->StreamingActive() &&
+ basic.ui->streamButton->isEnabled(),
basic.StopStreaming, "Stopping stream"),
this, this);
LoadHotkeyPair(streamingHotkeys,
@@ -1805,18 +2036,20 @@ void OBSBasic::CreateHotkeys()
LoadHotkey(forceStreamingStopHotkey,
"OBSBasic.ForceStopStreaming");
- recordingHotkeys = obs_hotkey_pair_register_frontend(
- "OBSBasic.StartRecording",
- Str("Basic.Main.StartRecording"),
- "OBSBasic.StopRecording",
- Str("Basic.Main.StopRecording"),
- MAKE_CALLBACK(!basic.outputHandler->RecordingActive(),
- basic.StartRecording, "Starting recording"),
- MAKE_CALLBACK(basic.outputHandler->RecordingActive(),
- basic.StopRecording, "Stopping recording"),
- this, this);
- LoadHotkeyPair(recordingHotkeys,
- "OBSBasic.StartRecording", "OBSBasic.StopRecording");
+// recordingHotkeys = obs_hotkey_pair_register_frontend(
+// "OBSBasic.StartRecording",
+// Str("Basic.Main.StartRecording"),
+// "OBSBasic.StopRecording",
+// Str("Basic.Main.StopRecording"),
+// MAKE_CALLBACK(!basic.outputHandler->RecordingActive() &&
+// !basic.ui->recordButton->isChecked(),
+// basic.StartRecording, "Starting recording"),
+// MAKE_CALLBACK(basic.outputHandler->RecordingActive() &&
+// basic.ui->recordButton->isChecked(),
+// basic.StopRecording, "Stopping recording"),
+// this, this);
+// LoadHotkeyPair(recordingHotkeys,
+// "OBSBasic.StartRecording", "OBSBasic.StopRecording");
replayBufHotkeys = obs_hotkey_pair_register_frontend(
"OBSBasic.StartReplayBuffer",
@@ -1865,7 +2098,7 @@ void OBSBasic::CreateHotkeys()
void OBSBasic::ClearHotkeys()
{
obs_hotkey_pair_unregister(streamingHotkeys);
- obs_hotkey_pair_unregister(recordingHotkeys);
+// obs_hotkey_pair_unregister(recordingHotkeys);
obs_hotkey_pair_unregister(replayBufHotkeys);
obs_hotkey_unregister(forceStreamingStopHotkey);
obs_hotkey_unregister(togglePreviewProgramHotkey);
@@ -1877,6 +2110,8 @@ OBSBasic::~OBSBasic()
if (updateCheckThread && updateCheckThread->isRunning())
updateCheckThread->wait();
+ delete multiviewProjectorMenu;
+ delete trayMenu;
delete programOptions;
delete program;
@@ -1910,6 +2145,9 @@ OBSBasic::~OBSBasic()
if (advAudioWindow)
delete advAudioWindow;
+ if (about)
+ delete about;
+
obs_display_remove_draw_callback(ui->preview->GetDisplay(),
OBSBasic::RenderMain, this);
@@ -1933,6 +2171,10 @@ OBSBasic::~OBSBasic()
config_set_int(App()->GlobalConfig(), "General", "LastVersion",
LIBOBS_API_VER);
+#if OBS_RELEASE_CANDIDATE > 0
+ config_set_int(App()->GlobalConfig(), "General", "LastRCVersion",
+ OBS_RELEASE_CANDIDATE_VER);
+#endif
bool alwaysOnTop = IsAlwaysOnTop(this);
@@ -2002,7 +2244,7 @@ void OBSBasic::SaveProjectDeferred()
if (!sceneCollection)
return;
- ret = snprintf(fileName, 512, "obs-studio/basic/scenes/%s.json",
+ ret = snprintf(fileName, 512, "ebs-studio/basic/scenes/%s.json",
sceneCollection);
if (ret <= 0)
return;
@@ -2032,7 +2274,7 @@ OBSSceneItem OBSBasic::GetSceneItem(QListWidgetItem *item)
OBSSceneItem OBSBasic::GetCurrentSceneItem()
{
- return GetSceneItem(GetTopSelectedSourceItem());
+ return ui->sources->Get(GetTopSelectedSourceItem());
}
void OBSBasic::UpdatePreviewScalingMenu()
@@ -2055,32 +2297,6 @@ void OBSBasic::UpdatePreviewScalingMenu()
scalingAmount == float(ovi.output_width) / float(ovi.base_width));
}
-void OBSBasic::UpdateSources(OBSScene scene)
-{
- ClearListItems(ui->sources);
-
- obs_scene_enum_items(scene,
- [] (obs_scene_t *scene, obs_sceneitem_t *item, void *p)
- {
- OBSBasic *window = static_cast(p);
- window->InsertSceneItem(item);
-
- UNUSED_PARAMETER(scene);
- return true;
- }, this);
-}
-
-void OBSBasic::InsertSceneItem(obs_sceneitem_t *item)
-{
- QListWidgetItem *listItem = new QListWidgetItem();
- SetOBSRef(listItem, OBSSceneItem(item));
-
- ui->sources->insertItem(0, listItem);
- ui->sources->setCurrentRow(0, QItemSelectionModel::ClearAndSelect);
-
- SetupVisibilityItem(ui->sources, listItem, item);
-}
-
void OBSBasic::CreateInteractionWindow(obs_source_t *source)
{
if (interaction)
@@ -2144,8 +2360,6 @@ void OBSBasic::AddScene(OBSSource source)
container.handlers.assign({
std::make_shared(handler, "item_add",
OBSBasic::SceneItemAdded, this),
- std::make_shared(handler, "item_remove",
- OBSBasic::SceneItemRemoved, this),
std::make_shared(handler, "item_select",
OBSBasic::SceneItemSelected, this),
std::make_shared(handler, "item_deselect",
@@ -2207,7 +2421,7 @@ void OBSBasic::RemoveScene(OBSSource source)
if (sel != nullptr) {
if (sel == ui->scenes->currentItem())
- ClearListItems(ui->sources);
+ ui->sources->Clear();
delete sel;
}
@@ -2224,46 +2438,37 @@ void OBSBasic::RemoveScene(OBSSource source)
api->on_event(OBS_FRONTEND_EVENT_SCENE_LIST_CHANGED);
}
-void OBSBasic::AddSceneItem(OBSSceneItem item)
+static bool select_one(obs_scene_t *scene, obs_sceneitem_t *item, void *param)
{
- obs_scene_t *scene = obs_sceneitem_get_scene(item);
-
- if (GetCurrentScene() == scene)
- InsertSceneItem(item);
+ obs_sceneitem_t *selectedItem =
+ reinterpret_cast(param);
+ if (obs_sceneitem_is_group(item))
+ obs_sceneitem_group_enum_items(item, select_one, param);
- SaveProject();
+ obs_sceneitem_select(item, (selectedItem == item));
- if (!disableSaving) {
- obs_source_t *sceneSource = obs_scene_get_source(scene);
- obs_source_t *itemSource = obs_sceneitem_get_source(item);
- blog(LOG_INFO, "User added source '%s' (%s) to scene '%s'",
- obs_source_get_name(itemSource),
- obs_source_get_id(itemSource),
- obs_source_get_name(sceneSource));
- }
+ UNUSED_PARAMETER(scene);
+ return true;
}
-void OBSBasic::RemoveSceneItem(OBSSceneItem item)
+void OBSBasic::AddSceneItem(OBSSceneItem item)
{
- for (int i = 0; i < ui->sources->count(); i++) {
- QListWidgetItem *listItem = ui->sources->item(i);
+ obs_scene_t *scene = obs_sceneitem_get_scene(item);
- if (GetOBSRef(listItem) == item) {
- DeleteListItem(ui->sources, listItem);
- break;
- }
- }
+ if (GetCurrentScene() == scene)
+ ui->sources->Add(item);
SaveProject();
if (!disableSaving) {
- obs_scene_t *scene = obs_sceneitem_get_scene(item);
obs_source_t *sceneSource = obs_scene_get_source(scene);
obs_source_t *itemSource = obs_sceneitem_get_source(item);
- blog(LOG_INFO, "User Removed source '%s' (%s) from scene '%s'",
+ blog(LOG_INFO, "User added source '%s' (%s) to scene '%s'",
obs_source_get_name(itemSource),
obs_source_get_id(itemSource),
obs_source_get_name(sceneSource));
+
+ obs_scene_enum_items(scene, select_one, (obs_sceneitem_t*)item);
}
}
@@ -2284,7 +2489,10 @@ void OBSBasic::UpdateSceneSelection(OBSSource source)
ui->scenes->setCurrentItem(items.first());
sceneChanging = false;
- UpdateSources(scene);
+ OBSScene curScene =
+ GetOBSRef