Ansariel 2025-01-25 23:47:10 +01:00
commit 246a60a75c
31 changed files with 275 additions and 81 deletions

View File

@ -6,6 +6,10 @@ on:
description: 'Include tracy profiling builds'
required: false
default: 'false'
override_signing:
description: 'Manual builds are not signned by default. Force code signing for this run.'
required: false
default: 'false'
push:
branches:
- "Firestorm*.*.*"
@ -141,7 +145,18 @@ jobs:
echo "Building for channel ${FS_RELEASE_CHAN}"
viewer_channel=${FS_RELEASE_CHAN}
shell: bash
- name: Check if release type is signable
if: runner.os == 'Windows'
run: |
if [[ "${FS_RELEASE_TYPE}" == "Release" || "${FS_RELEASE_TYPE}" == "Beta" ]]; then
CODESIGNING_ENABLED=true
else
CODESIGNING_ENABLED=false
fi
echo "CODESIGNING_ENABLED=${CODESIGNING_ENABLED}" >> $GITHUB_ENV
echo "Codesigning enabled: ${CODESIGNING_ENABLED}"
shell: bash
- name: Get the code
uses: actions/checkout@v4
with:
@ -261,7 +276,7 @@ jobs:
done
shell: bash
- name: Set expiration days based on FS_RELEASE_TYPE
- name: Set expiration days and codesigning based on FS_RELEASE_TYPE
run: |
case "${{ env.FS_RELEASE_TYPE }}" in
"Nightly" | "Manual" | "Profiling")
@ -302,6 +317,78 @@ jobs:
autobuild configure -c ReleaseFS -A${addrsize} -- --package --chan ${{env.FS_RELEASE_CHAN}} ${{env.EXTRA_ARGS}} ${{env.FS_GRID}}
echo "BUGSPLAT_DB=$BUGSPLAT_DB" >> $GITHUB_ENV
shell: bash
- name: Generate metadata.json
if: runner.os == 'Windows'
run: |
echo '{
"Endpoint": "${{ secrets.AZURE_ENDPOINT }}",
"CodeSigningAccountName": "${{ secrets.AZURE_CODE_SIGNING_NAME }}",
"CertificateProfileName": "${{ secrets.AZURE_CERT_PROFILE_NAME }}",
"ExcludeCredentials": [
"ManagedIdentityCredential"
]
}' > ${{github.workspace}}/metadata.json
echo "CODESIGNING_METADATA_PATH=${{github.workspace}}/metadata.json" >> $env:GITHUB_ENV
shell: pwsh
- name: Validate Windows 10 SDK version and find signtool.exe IFF codesigning is enabled for these builds or overridden
if: ${{ runner.os == 'Windows' && (env.CODESIGNING_ENABLED == 'true' || github.event.inputs.override_signing == 'true') }}
id: validate-sdk
run: |
try {
$Arch = ($env:RUNNER_ARCH).ToLower()
$SearchBase = "${env:ProgramFiles(x86)}\Windows Kits\10\bin"
"Searching `"$SearchBase`" for signtool ($Arch)..."
$Tool = Get-ChildItem $SearchBase -Recurse -Force -ErrorAction SilentlyContinue |
Where-Object {$_.Name -eq 'signtool.exe' -and $_.Directory -like "*\$Arch"} |
Sort-Object -Descending |
Select-Object -First 1
if (!($Tool)) {throw [System.IO.FileNotFoundException]::new('File not found.', 'signtool.exe')}
'Adding signtool to PATH'
$Tool.Directory.FullName | Out-File $env:GITHUB_PATH -Append
"signtool-$Arch=$($Tool.FullName)" | Out-File $env:GITHUB_OUTPUT -Append
$env:PATH = "$($Tool.Directory.FullName);$env:PATH"
signtool.exe /h
} catch {
Write-Output "::error::$($_.Exception)"
Write-Output '::endgroup::'
exit 1
}
echo "SIGNTOOL_PATH=signtool.exe" >> $env:GITHUB_ENV
shell: pwsh
- name: Install nuget.exe
if: runner.os == 'Windows'
run: |
Invoke-WebRequest -Uri https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -OutFile nuget.exe
shell: pwsh
- name: Install Microsoft.Trusted.Signing.Client
if: runner.os == 'Windows'
run: |
.\nuget.exe install Microsoft.Trusted.Signing.Client -Version 1.0.53 -OutputDirectory .
shell: pwsh
- name: Locate Azure.CodeSigning.Dlib.dll
if: runner.os == 'Windows'
run: |
$dllPath = (Get-ChildItem ".\Microsoft.Trusted.Signing.Client.1.0.53\bin\x64\Azure.CodeSigning.Dlib.dll" -Recurse -File | Select-Object -First 1).FullName
if (-not $dllPath) {
Write-Error "Azure.CodeSigning.Dlib.dll not found."
exit 1
}
echo "CODESIGNING_DLIB_PATH=$dllPath" >> $env:GITHUB_ENV
shell: pwsh
- name: Prep env for Trusted code on Windows only
if: runner.os == 'Windows'
run: |
echo "AZURE_CLIENT_ID=${{ secrets.AZURE_CLIENT_ID }}" >> $GITHUB_ENV
echo "AZURE_CLIENT_SECRET=${{ secrets.AZURE_CLIENT_SECRET }}" >> $GITHUB_ENV
echo "AZURE_TENANT_ID=${{ secrets.AZURE_TENANT_ID }}" >> $GITHUB_ENV
shell: bash
- name: build
id: build
run: autobuild build -c ReleaseFS -A${addrsize} --no-configure

View File

@ -6,14 +6,14 @@ on:
build_run_number:
description: 'GitHub Run Number (per build_viewer.yml workflow)'
required: true
policy:
description: 'Policy to sign binaries'
required: true
type: choice
default: "Test"
options:
- "Test"
- "Release"
# policy:
# description: 'Policy to sign binaries'
# required: true
# type: choice
# default: "Test"
# options:
# - "Test"
# - "Release"
# viewer_version:
# description: 'viewer version not including build'
# required: true
@ -33,7 +33,7 @@ on:
jobs:
find-setup-files:
runs-on: ubuntu-latest
runs-on: windows-latest
permissions:
actions: read
contents: read
@ -69,7 +69,7 @@ jobs:
sign-and-upload:
name: Sign and Upload each Setup.exe
needs: find-setup-files
runs-on: ubuntu-latest
runs-on: windows-latest
strategy:
matrix:
file: ${{ fromJson( needs.find-setup-files.outputs.setup_files) }}
@ -83,6 +83,7 @@ jobs:
curl -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts
shell: bash
- name: Download Setup.exe Files Artifact
uses: actions/download-artifact@v4
@ -93,28 +94,49 @@ jobs:
run: |
mkdir -p to_sign
cp "setup_exe_files/${{ matrix.file }}" to_sign/
- name: Upload unsigned artifact
shell: bash
# - name: Upload unsigned artifact
# id: upload-unsigned-artifact
# uses: actions/upload-artifact@v4
# with:
# name: unsigned-artifact-${{ matrix.file }}
# path: to_sign/${{ matrix.file }}
# - name: sign the file
# uses: signpath/github-action-submit-signing-request@v1
# env:
# SIGNPATH_SIGNING_POLICY_SLUG: ${{ github.event.inputs.policy == 'Test' && vars.SIGNPATH_SIGNING_POLICY_SLUG_TEST || vars.SIGNPATH_SIGNING_POLICY_SLUG_RELEASE }}
# with:
# api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
# organization-id: '${{ vars.SIGNPATH_ORGANIZATION_ID }}'
# project-slug: '${{ vars.SIGNPATH_PROJECT_SLUG }}'
# signing-policy-slug: '${{ env.SIGNPATH_SIGNING_POLICY_SLUG }}'
# github-artifact-id: "${{steps.upload-unsigned-artifact.outputs.artifact-id}}"
# wait-for-completion: true
# output-artifact-directory: 'application-signed'
- name: Azure Trusted Signing
uses: azure/trusted-signing-action@v0.5.1
with:
azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }}
azure-client-id: ${{ secrets.AZURE_CLIENT_ID }}
azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}
endpoint: ${{ secrets.AZURE_ENDPOINT }}
trusted-signing-account-name: ${{ secrets.AZURE_CODE_SIGNING_NAME }}
certificate-profile-name: ${{ secrets.AZURE_CERT_PROFILE_NAME }}
# Sign all exes inside the folder
files-folder: ${{ github.workspace }}\to_sign
files-folder-filter: exe
# - name: Upload signed artifact
# uses: actions/upload-artifact@v4
# with:
# name: signed-artifact-${{ matrix.file }}
# path: ./application-signed
# - name: Upload unsigned artifact
- name: Upload signed artifact
id: upload-unsigned-artifact
uses: actions/upload-artifact@v4
with:
name: unsigned-artifact-${{ matrix.file }}
path: to_sign/${{ matrix.file }}
- name: sign the file
uses: signpath/github-action-submit-signing-request@v1
env:
SIGNPATH_SIGNING_POLICY_SLUG: ${{ github.event.inputs.policy == 'Test' && vars.SIGNPATH_SIGNING_POLICY_SLUG_TEST || vars.SIGNPATH_SIGNING_POLICY_SLUG_RELEASE }}
with:
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
organization-id: '${{ vars.SIGNPATH_ORGANIZATION_ID }}'
project-slug: '${{ vars.SIGNPATH_PROJECT_SLUG }}'
signing-policy-slug: '${{ env.SIGNPATH_SIGNING_POLICY_SLUG }}'
github-artifact-id: "${{steps.upload-unsigned-artifact.outputs.artifact-id}}"
wait-for-completion: true
output-artifact-directory: 'application-signed'
- name: Upload signed artifact
uses: actions/upload-artifact@v4
with:
name: signed-artifact-${{ matrix.file }}
path: ./application-signed
path: to_sign\${{ matrix.file }}

View File

@ -2,9 +2,9 @@
* @file
* @brief
*
* $LicenseInfo:firstyear=2024&license=fsviewerlgpl$
* $LicenseInfo:firstyear=2025&license=fsviewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (C) 2024, The Phoenix Firestorm Project, Inc.
* Copyright (C) 2025, The Phoenix Firestorm Project, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public

View File

@ -4193,7 +4193,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>license_file</key>
<string>docs/LICENSE-source.txt</string>
<key>copyright</key>
<string>Copyright (c) 2024, The Phoenix Firestorm Project, Inc.</string>
<string>Copyright (c) 2025, The Phoenix Firestorm Project, Inc.</string>
<key>version_file</key>
<string>newview/viewer_version.txt</string>
<key>name</key>

View File

@ -2655,7 +2655,7 @@ if (DARWIN)
set(MACOSX_BUNDLE_BUNDLE_NAME "Firestorm")
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}")
set(MACOSX_BUNDLE_BUNDLE_VERSION "${VIEWER_SHORT_VERSION}${VIEWER_MACOSX_PHASE}${VIEWER_REVISION}")
set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2010-2024 The Phoenix Firestorm Project, Inc.")
set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2010-2025 The Phoenix Firestorm Project, Inc.")
set(MACOSX_BUNDLE_NSMAIN_NIB_FILE "Firestorm.nib")
set(MACOSX_BUNDLE_NSPRINCIPAL_CLASS "LLApplication")

View File

@ -3,4 +3,4 @@
CFBundleName = "Firestorm";
CFBundleShortVersionString = "Firestorm version %%VERSION%%";
CFBundleGetInfoString = "Firestorm version %%VERSION%%, Copyright 2010-2024 The Phoenix Firestorm Project, Inc.";
CFBundleGetInfoString = "Firestorm version %%VERSION%%, Copyright 2010-2025 The Phoenix Firestorm Project, Inc.";

View File

@ -9242,6 +9242,20 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>1</integer>
</map>
<!-- <FS:minerjr> [FIRE-35083] Floater_stats.xml has in correct stat_view setting for materials -->
<!-- Missing boolean flag for remembering the open/close state of the Materials stat_view of the floater_stats.xml file -->
<key>OpenDebugStatMaterials</key>
<map>
<key>Comment</key>
<string>Expand Materials performance stats display</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<!-- </FS:minerjr> [FIRE-35083] -->
<key>OpenDebugStatTexture</key>
<map>
<key>Comment</key>

View File

@ -59,25 +59,55 @@ class FSViewerManifest:
def fs_channel_unique(self):
return self.channel().replace("Firestorm", "").strip()
def fs_sign_win_binaries( self ):
try:
subprocess.check_call(["signtool.exe","sign","/n","Phoenix","/d","Firestorm","/du","http://www.phoenixviewer.com","/t","http://timestamp.verisign.com/scripts/timstamp.dll",self.args['configuration']+"\\firestorm-bin.exe"],
stderr=subprocess.PIPE,stdout=subprocess.PIPE)
subprocess.check_call(["signtool.exe","sign","/n","Phoenix","/d","Firestorm","/du","http://www.phoenixviewer.com","/t","http://timestamp.verisign.com/scripts/timstamp.dll",self.args['configuration']+"\\slplugin.exe"],
stderr=subprocess.PIPE,stdout=subprocess.PIPE)
subprocess.check_call(["signtool.exe","sign","/n","Phoenix","/d","Firestorm","/du","http://www.phoenixviewer.com","/t","http://timestamp.verisign.com/scripts/timstamp.dll",self.args['configuration']+"\\SLVoice.exe"],
stderr=subprocess.PIPE,stdout=subprocess.PIPE)
subprocess.check_call(["signtool.exe","sign","/n","Phoenix","/d","Firestorm","/du","http://www.phoenixviewer.com","/t","http://timestamp.verisign.com/scripts/timstamp.dll",self.args['configuration']+"\\"+self.final_exe()],
stderr=subprocess.PIPE,stdout=subprocess.PIPE)
except Exception as e:
print("Couldn't sign final binary. Tried to sign %s" % self.args['configuration']+"\\"+self.final_exe())
def fs_sign_win_binaries(self):
signtool_path = os.getenv('SIGNTOOL_PATH')
codesigning_dlib_path = os.getenv('CODESIGNING_DLIB_PATH')
metadata_file = os.getenv("CODESIGNING_METADATA_PATH")
# at some point we might want to sign other DLLs as well.
executable_paths = [
# self.args['configuration'] + "\\firestorm-bin.exe", # no need to sign this we are not packaging it.
self.args['configuration'] + "\\slplugin.exe",
self.args['configuration'] + "\\SLVoice.exe",
self.args['configuration'] + "\\llwebrtc.dll",
self.args['configuration'] + "\\llplugin\\dullahan_host.exe",
self.args['configuration'] + "\\" + self.final_exe()
]
if not signtool_path or not codesigning_dlib_path:
print("Signing configuration is missing. Skipping signing process.")
return
print("Signing executables.")
for exe_path in executable_paths:
try:
subprocess.check_call([
signtool_path, "sign", "/v", "/debug", "/fd", "SHA256",
"/tr", "http://timestamp.acs.microsoft.com", "/td", "SHA256",
"/dlib", codesigning_dlib_path, "/dmdf", metadata_file, exe_path
], stderr=subprocess.PIPE, stdout=subprocess.PIPE)
print(f"Signed {exe_path}")
except Exception as e:
print(f"Couldn't sign binary: {exe_path}. Error: {e}")
def fs_sign_win_installer(self, substitution_strings):
signtool_path = os.getenv('SIGNTOOL_PATH')
codesigning_dlib_path = os.getenv('CODESIGNING_DLIB_PATH')
metadata_file = os.getenv("CODESIGNING_METADATA_PATH")
installer_path = self.args['configuration'] + "\\" + substitution_strings['installer_file']
if not signtool_path or not codesigning_dlib_path:
print("Signing configuration is missing. Skipping signing process.")
return
print("Signing installer.")
def fs_sign_win_installer( self, substitution_strings ):
try:
subprocess.check_call(["signtool.exe","sign","/n","Phoenix","/d","Firestorm","/du","http://www.phoenixviewer.com",self.args['configuration']+"\\"+substitution_strings['installer_file']],stderr=subprocess.PIPE,stdout=subprocess.PIPE)
subprocess.check_call([
signtool_path, "sign", "/v", "/debug", "/fd", "SHA256",
"/tr", "http://timestamp.acs.microsoft.com", "/td", "SHA256",
"/dlib", codesigning_dlib_path, "/dmdf", metadata_file, installer_path
], stderr=subprocess.PIPE, stdout=subprocess.PIPE)
except Exception as e:
print("Working directory: %s" % os.getcwd())
print("Couldn't sign windows installer. Tried to sign %s" % self.args['configuration']+"\\"+substitution_strings['installer_file'])
print(f"Couldn't sign windows installer: {installer_path}. Error: {e}")
def fs_delete_linux_symbols( self ):
debugDir = os.path.join( self.get_dst_prefix(), "bin", ".debug" )

View File

@ -63,7 +63,7 @@ Unicode true # Enable unicode support
##!include "%%SOURCE%%\installers\windows\lang_pt-br.nsi"
!include "%%SOURCE%%\installers\windows\lang_ru.nsi"
##!include "%%SOURCE%%\installers\windows\lang_tr.nsi"
##!include "%%SOURCE%%\installers\windows\lang_zh.nsi"
!include "%%SOURCE%%\installers\windows\lang_zh.nsi"
# *TODO: Move these into the language files themselves
##LangString LanguageCode ${LANG_DANISH} "da"
@ -77,7 +77,7 @@ LangString LanguageCode ${LANG_POLISH} "pl"
##LangString LanguageCode ${LANG_PORTUGUESEBR} "pt"
LangString LanguageCode ${LANG_RUSSIAN} "ru"
##LangString LanguageCode ${LANG_TURKISH} "tr"
##LangString LanguageCode ${LANG_TRADCHINESE} "zh"
LangString LanguageCode ${LANG_TRADCHINESE} "zh"
# This placeholder is replaced by viewer_manifest.py
%%INST_VARS%%
@ -240,8 +240,19 @@ Function CheckCPUFlagsAVX2
; AVX2 not supported
; Replace %DLURL% in the language string with the URL
${WordReplace} "$(MissingAVX2)" "%DLURL%" "${DL_URL}-legacy-cpus" "+*" $3
MessageBox MB_OK "$3"
MessageBox MB_OK "$3"
${OpenURL} "${DL_URL}-legacy-cpus"
MessageBox MB_YESNO $(AVX2OverrideConfirmation) IDNO NoInstall
MessageBox MB_OKCANCEL $(AVX2OverrideNote) IDCANCEL NoInstall
; User chose to proceed
Pop $3
Pop $2
Pop $1
Return
NoInstall:
Quit
OK_AVX2:
@ -579,7 +590,7 @@ WriteRegStr SHELL_CONTEXT "${MSUNINSTALL_KEY}" "DisplayVersion" "${VERSION_LONG}
# <FS:Ansariel> Separate install sizes for 32 and 64 bit
#WriteRegDWORD SHELL_CONTEXT "${MSUNINSTALL_KEY}" "EstimatedSize" "0x0001D500" # ~117 MB
${If} ${IS64BIT} == "1"
WriteRegDWORD SHELL_CONTEXT "${MSUNINSTALL_KEY}" "EstimatedSize" "0x00064000" # 400 MB
WriteRegDWORD SHELL_CONTEXT "${MSUNINSTALL_KEY}" "EstimatedSize" "0x00098800" # 610 MB
${Else}
WriteRegDWORD SHELL_CONTEXT "${MSUNINSTALL_KEY}" "EstimatedSize" "0x00061800" # 390 MB
${EndIf}

View File

@ -57,8 +57,12 @@ LangString CheckAdministratorUnInstMB ${LANG_GERMAN} 'Sie besitzen ungenügende
; checkcpuflags
LangString MissingSSE2 ${LANG_GERMAN} "Dieser PC besitzt möglicherweise keinen Prozessor mit SSE2-Unterstützung, die für die Ausführung von Firestorm ${VERSION_LONG} benötigt wird. Trotzdem installieren?"
; Extended cpu checks (AVX2)
LangString MissingAVX2 ${LANG_GERMAN} "Ihre CPU unterstützt keine AVX2-Anweisungen. Bitte laden Sie die Version für ältere CPUs von %DLURL%-legacy-cpus/ herunter."
LangString AVX2Available ${LANG_GERMAN} "Ihre CPU unterstützt AVX2-Anweisungen. Sie können die für AVX2 optimierte Version für eine bessere Leistung unter %DLURL%/ herunterladen. Möchten Sie sie jetzt herunterladen?"
LangString AVX2OverrideConfirmation ${LANG_GERMAN} "Falls Sie glauben, dass Ihr PC AVX2-Anweisungen unterstützt, können Sie die Installation dennoch durchführen. Möchten Sie fortfahren?"
LangString AVX2OverrideNote ${LANG_GERMAN} "Durch das Übersteuern des Installers installieren Sie möglicherweise eine Version, die beim Starten direkt abstürzt. In diesem Fall installieren Sie bitte stattdessen die Standard-Version."
; closesecondlife function (install)
LangString CloseSecondLifeInstDP ${LANG_GERMAN} "Warten auf die Beendigung von Firestorm ..."

View File

@ -161,7 +161,7 @@ BEGIN
VALUE "FileDescription", "Firestorm"
VALUE "FileVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}"
VALUE "InternalName", "Firestorm"
VALUE "LegalCopyright", "Copyright \251 2010-2024, The Phoenix Firestorm Project, Inc."
VALUE "LegalCopyright", "Copyright \251 2010-2025, The Phoenix Firestorm Project, Inc."
VALUE "OriginalFilename", "Firestorm.exe"
VALUE "ProductName", "Firestorm"
VALUE "ProductVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}"

View File

@ -155,13 +155,18 @@
stat="glboundmemstat"
setting="DebugStatModeBoundMem"/>
</stat_view>
<!-- <FS:minerjr> [FIRE-35083] Floater_stats.xml has in correct stat_view setting for materials -->
<!-- The material stat_view had the incorrect setting, which was causing and convert_from_llsd warning and a bugsplat in Debug mode -->
<!-- It also prevented the material count of the floater_stats from remembering its open/close state -->
<stat_view name="material"
label="Material"
setting="DebugStatModeMaterials">
setting="OpenDebugStatMaterials">
<stat_bar name="nummaterials"
label="Count"
stat="nummaterials"/>
stat="nummaterials"
setting="DebugStatModeMaterials"/>
</stat_view>
<!-- </FS:minerjr> [FIRE-35083] -->
<stat_view name="network"
label="Network"
setting="OpenDebugStatNet">

View File

@ -214,6 +214,7 @@
<slider name="trackpad_sensitivity_slider" tool_tip="Règle la sensibilité du trackpad"/>
<check_box name="stop_posing_on_close_checkbox" label="Arrêt pose si fermeture" tool_tip="Ne pas arrêter votre pose peut être utile si vous travaillez beaucoup et que vous ne voulez pas la perdre accidentellement."/>
<check_box name="reset_base_rotation_on_edit_checkbox" label="Réinitialisation de la rotation" tool_tip="Lorsque vous modifiez une rotation pour la première fois, la remet à zéro. Cela signifie que votre travail peut enregistrer une pose (et non une différence - voir charger/enregistrer). Une coche verte apparaît à côté de chaque articulation dont l'exportation a été remise à zéro."/>
<check_box name="also_save_bvh_checkbox" label="Ajouter BVH en enregistrant**" tool_tip="Lorsque vous enregistrez votre pose, écrivez également un fichier BVH, qui peut être téléchargé via 'Construire > Charger > Animation' pour poser vous-même ou d'autres personnes dans le monde. Pour ce faire, les articulations doivent remettre leur « base » à zéro, car le BVH nécessite que l'on travaille sur l'original."/>
</panel>
</tab_container>
</panel>
@ -226,7 +227,7 @@
<button name="undo_change" tool_tip="Annuler la dernière rotation" />
<button name="button_redo_change" tool_tip="Rétablir la dernière modification annulée" />
<button name="refresh_avatars" tool_tip="Double-cliquez pour remettre toutes les parties du corps sélectionnées dans l'état où elles se trouvaient lorsque vous avez commencé à poser." />
<button name="delta_mode_toggle" tool_tip="Si vous modifiez plusieurs articulations, chacune d'entre elles sera modifiée de la même manière, au lieu de toutes les modifier du même coup." />
<button name="delta_mode_toggle" tool_tip="Si vous modifiez plusieurs articulations, chacune d'entre elles sera modifiée de la même manière, au lieu de toutes les modifier du même coup. Sert également à déverrouiller le Gimbal Lock." />
<button label="Miroir" name="button_toggleMirrorRotation" tool_tip="Changer l'articulation opposée, comme dans un miroir." />
<button label="Sym." name="button_toggleSympatheticRotation" tool_tip="Modifier l'articulation opposée, mais de la même manière." />
</panel>
@ -252,7 +253,7 @@
<button name="toggleAdvancedPanel" tool_tip="Passer à la section des paramètres avancés"/>
<button name="FlipPose_avatar" tool_tip="Inverser toute la pose vers la gauche/droite" />
<button name="FlipJoint_avatar" tool_tip="Miroir des parties du corps sélectionnées gauche/droite" />
<button label="Capter" name="button_RecaptureParts" tool_tip="Si les parties du corps sélectionnées sont désactivées, cette option permet de capturer à nouveau ce que ces parties du corps font actuellement. Ce bouton est désactivé si vous commencez à partir d`une pose T." />
<button label="Capter" name="button_RecaptureParts" tool_tip="Si les parties du corps sélectionnées sont désactivées, cette option permet de capturer à nouveau ce que ces parties du corps font actuellement."/>
<button label="Marche/arrêt" name="toggle_PosingSelectedBones" tool_tip="Active ou désactive le Poser pour les parties du corps sélectionnées. Lorsqu'elle est désactivée, cette partie du corps s'anime comme d'habitude (comme avec une AO ou avec une balle, etc.)." />
<button label="Mes poses" name="toggleLoadSavePanel" tool_tip="Charger, enregistrer et gérer les poses que vous créez" />
<button tool_tip="Gérer le catalogue des poses" name="open_poseDir_button" />
@ -276,8 +277,8 @@
<slider label="Échelle Y :" name="Advanced_Scale_Y" />
<slider label="Échelle Z :" name="Advanced_Scale_Z" />
<button label="Annuler le changement d'échelle" name="undo_scale_change" tool_tip="Annuler le dernier changement d'échelle" />
<button label="Remise à l'échelle" name="redo_scale_change" tool_tip="Refaire le dernier changement d'échelle" />
<button label="Réinitialisation de I'échelle" name="reset_scales" tool_tip="Double-cliquez pour rétablir l'échelle d'origine" />
<button label="À l'échelle" name="redo_scale_change" tool_tip="Refaire le dernier changement d'échelle" />
<button label="Réinit. échelle" name="reset_scales" tool_tip="Double-cliquez pour rétablir l'échelle d'origine" />
</panel>
</tab_container>
</panel>

View File

@ -16,6 +16,12 @@
<button label="Aucun" label_selected="Aucun" name="None"/>
<check_box label="Cop" name="check_copy"/>
<check_box label="Lister tous les dossiers" name="check_show_empty"/>
<check_box label="Objets groupés" name="check_only_coalesced"/>
<combo_box tool_tip="Filtre les objets liés" name="inventory_filter_show_links_combo">
<combo_box.item name="show_links" label="Afficher les liens"/>
<combo_box.item name="show_links_only" label="Afficher seulement les liens"/>
<combo_box.item name="hide_links" label="Masquer les liens"/>
</combo_box>
<check_box label="Créé par moi" name="check_created_by_me"/>
<check_box label="Créé par d'autres" name="check_created_by_others"/>
<check_box label="Depuis la connexion" name="check_since_logoff"/>

View File

@ -1,10 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<toggleable_menu name="Settings">
<menu_item_call label="Charger uniquement les rotations" name="rotations"/>
<menu_item_call label="Charger uniquement les positions" name="positions"/>
<menu_item_call label="Charger uniquement les échelles" name="scale"/>
<menu_item_call label="Charger les rotations &amp; les positions" name="rotations_positions"/>
<menu_item_call label="Charger les rotations &amp; les échelles" name="rotations_scales"/>
<menu_item_call label="Charger les positions &amp; les échelles" name="positions_scales"/>
<menu_item_call label="Tout charger" name="load_all"/>
<menu_item_call label="Charger la sélection" tool_tip="Charge uniquement les jointures qui sont désactivées et les activer." name="load_selective"/>
<menu_item_call label="Charger la sélection - Uniquement les rotations " tool_tip="Charge uniquement les rotations des jointures qui sont désactivées, et les active." name="rotations_positions"/>
<menu_item_call label="Charger uniquement les rotations" tool_tip="Charge uniquement les rotations. Bien pour les poses faites pour d'autres avatars/silhouettes." name="rotations"/>
<menu_item_call label="Charger" tool_tip="Charge les rotations, les positions et les échelles" name="load_all"/>
</toggleable_menu>

View File

@ -35,6 +35,6 @@
<menu_item_check name="inventory_filter_only_modify" label="Uniquement les éléments modifiables"/>
<menu_item_check name="inventory_filter_only_copy" label="Uniquement les éléments copiables"/>
<menu_item_check name="inventory_filter_only_transfer" label="Uniquement les éléments transférables"/>
<menu_item_check name="inventory_filter_coalesced_objects_only" label="Uniquement les éléments regroupés"/>
<menu_item_check name="inventory_filter_coalesced_objects_only" label="Uniquement les objets groupés"/>
<menu_item_call label="Vider la corbeille" name="empty_trash"/>
</toggleable_menu>

View File

@ -35,6 +35,7 @@
<combo_box.item value="filter_type_textures" label="Textures"/>
<combo_box.item value="filter_type_snapshots" label="Photos"/>
<combo_box.item value="filter_type_settings" label="Paramètres" />
<combo_box.item value="filter_type_coalesced" label="Uniquement les objets groupés"/>
<combo_box.item value="filter_type_custom" label="Personnalisé..."/>
</combo_box>
<menu_button name="options_visibility_btn" tool_tip="Afficher les paramètres de visibilité des résultats de recherche"/>
@ -57,6 +58,9 @@
<panel name="new_inventory_panel">
<button name="new_inv_btn" tool_tip="Ajouter une Fenêtre d'inventaire"/>
</panel>
<panel name="show_filters_panel">
<button name="show_filters_inv_btn" tool_tip="Afficher les filtres - Affiche le menu latéral des filtres lorsqu'il est sélectionné. Il est mis en surbrillance lorsqu'un filtre est activé."/>
</panel>
<panel name="view_mode_panel">
<button name="view_mode_btn" tool_tip="Passer d'une vue à l'autre"/>
</panel>

View File

@ -15,8 +15,20 @@
<text name="AvatarInspectorTooltipDelay_text">secondes</text>
<slider label="Objets :" name="ObjectInspectorTooltipDelay_slider" tool_tip="Délai d'affichage d'une infobulle après avoir passé la souris au-dessus d'un objet. (Par défaut : 0.35s)"/>
<text name="ObjectInspectorTooltipDelay_text">secondes</text>
<text name="FSHudTextLabel">
Options du texte flottant :
</text>
<slider label="Distance d'atténuation des textes flottants (en mètres) :" label_width="305" tool_tip="Définit la distance à partir de laquelle les textes flottants commencent à s'atténuer" name="FSHudTextFadeDistance"/>
<slider label="Distance de disparition des textes flottants (en mètres) :" label_width="305" tool_tip="Définit la distance à partir de laquelle les textes flottants ne s'affichent plus" name="FSHudTextFadeRange"/>
<check_box name="FSHudTextUseHoverHighlight" label="Survoler l'objet pour mettre en évidence le texte flottant :" tool_tip="Lorsqu'un objet est survolé, met en évidence le texte flottant (hovertext) en le déplaçant au premier plan et désactive son alpha."/>
<text name="FSHudTextShowBackgroundLabel">
Afficher arrière-plan texte flottant :
</text>
<combo_box name="FSHudTextShowBackgroundDropdown" tool_tip="Affiche un arrière-plan noir/blanc derrière le texte flottant (hovertext) pour le rendre plus lisible. L'opacité peut être modifiée dans Couleurs > Divers.">
<combo_box.item label="Non" name="ScriptDialogOption_0"/>
<combo_box.item label="Uniquement l'objet en surbrillance" name="ScriptDialogOption_1"/>
<combo_box.item label="Tous les objets" name="ScriptDialogOption_2"/>
</combo_box>
</panel>
<panel label="Interface 2D" name="ui-2d-overlay">
<text name="UI Size:" width="240">Échelle de l'UI (peut poser problème) :</text>

View File

@ -38,7 +38,7 @@
<text name="username_tag_label">Nom d'utilisateur</text>
<text name="bubble_chat">Étiquettes / Bulle de discussion :</text>
<color_swatch name="background" tool_tip="Sélectionnez la couleur des étiquettes"/>
<slider label="Transparence" name="bubble_chat_opacity" tool_tip="Sélectionnez la transparence des étiquettes"/>
<slider label="Opacité" name="bubble_chat_opacity" tool_tip="Ajustez l'opacité des étiquettes"/>
<slider label="Alignement vertical " name="FSNameTagZOffsetCorrection" tool_tip="Modifiez l'alignement vertical des tags des résidents. 0 par défaut"/>
<check_box name="FSTagShowDistance" label="Afficher la distance à côté de l'étiquette" tool_tip="Afficher la distance de l'avatar à côté de l'étiquette"/>
<check_box name="FSTagShowDistanceColors" label="Colorer les étiquettes selon la distance :"/>
@ -73,8 +73,8 @@
</panel>
</panel>
<panel label="Minicarte" name="tab-minimap">
<slider label="Transparence de l'arrière-plan :" label_width="180" width="485" name="FSMiniMapOpacity"/>
<text name="netmap_pickradius_textbox">Transparence &amp; couleur du point :</text>
<slider label="Opacité de l'arrière-plan :" label_width="180" width="485" name="FSMiniMapOpacity"/>
<text name="netmap_pickradius_textbox">Opacité &amp; couleur du point :</text>
<text name="netmap_pickradius_color_textbox">Couleur du point :</text>
<color_swatch name="MapPickRadiusColor" tool_tip="Contrôle la couleur du point sur la minicarte. La taille du point peut être ajustée avec le paramètre Taille du point."/>
<text name="netmap_pickradius_opacity_textbox">Opacité:</text>
@ -92,13 +92,14 @@
<panel label="Divers" name="tab-misc">
<text name="effects_color_textbox">Faisceau de sélection :</text>
<text left="240" name="ScriptDialogFgLabel" width="300">Avant et arrière-plan des dialogues de scripts :</text>
<text name="floater_opacity">Transparence des fenêtres :</text>
<text name="floater_opacity">Opacité des fenêtres :</text>
<slider label="Actives :" name="active"/>
<slider label="Inactives :" name="inactive"/>
<slider label="Caméra / Mouvement :" name="camera_movement"/>
<text name="console_opacity">Transparence de la console :</text>
<text name="console_opacity">Opacité de la console :</text>
<color_swatch name="console_background" tool_tip="Sélectionnez la couleur de la console"/>
<slider label="Transparence :" name="console_background_opacity" tool_tip="Sélectionnez la transparence de l'arrière-plan de la console"/>
<slider label="Opacité :" name="console_background_opacity" tool_tip="Ajustez l'opacité du fond de la console"/>
<slider label="Opacité du fond du texte flottant :" name="FSHudTextBackgroundOpacity" tool_tip="Ajustez l'opacité de l'arrière-plan du texte flottant"/>
<text name="preferences_search_label">Surlignage des préférences recherchées :</text>
<color_swatch name="preferences_search_color" tool_tip="Sélectionnez la couleur des préférences surlignées par les résultats de recherche"/>
<text name="area_search_beacon_color_label">Couleur de la balise de recherche zonière : </text>
@ -124,11 +125,11 @@
<color_swatch name="notecard_editor_writable_selection_color" tool_tip="Couleur du texte sélectionné dans la notice"/>
<check_box name="FSScriptDialogNoTransparency" label="Toujours afficher les dialogues de scripts sur un arrière-plan opaque"/>
<check_box name="FSGroupNotifyNoTransparency" label="Toujours afficher les notices de groupe avec un arrière-plan opaque"/>
<check_box name="override_pie_color_checkbox" label="Définir la couleur d'arrière-plan et la transparence des menus circulaires :"/>
<check_box name="override_pie_color_checkbox" label="Ajuster la couleur d'arrière-plan et l'opacité des menus circulaires :"/>
<panel name="tab-colorize">
<color_swatch name="pie_bg_color_override" tool_tip="Sélectionnez la couleur d'arrière-plan des menus circulaires"/>
<color_swatch name="pie_selected_color_override" tool_tip="Sélectionnez la couleur d'arrière-plan des menus circulaires"/>
<slider label="Transparence :" label_width="80" name="pie_menu_opacity" tool_tip="Sélectionnez la transparence des menus circulaires"/>
<slider label="Opacité :" label_width="80" name="pie_menu_opacity" tool_tip="Ajustez l'opacité des menus circulaires"/>
<slider label="Dégradé :" label_width="80" name="pie_menu_fade_out" tool_tip="Sélectionnez le niveau de dégradé de la couleur primaire des menus circulaires"/>
</panel>
</panel>