Merge branch 'master' into 7.1.13_preview

master
Beq 2025-06-09 17:02:02 +01:00
commit 36039a93e1
35 changed files with 264 additions and 107 deletions

View File

@ -313,7 +313,8 @@ jobs:
FS_PF_UA: ${{ secrets.FS_PF_UA }}
run: |
if [ -n "${FS_PF_UA}" ]; then
echo "EXTRA_ARGS=${{ env.EXTRA_ARGS }} -DFS_PS_USER_AGENT=\"${FS_PF_UA}\"" >> $GITHUB_ENV
echo "EXTRA_ARGS=${{ env.EXTRA_ARGS }} -DFS_PF_USER_AGENT=\"${FS_PF_UA}\"" >> $GITHUB_ENV
echo "Building with custom user-agent string."
else
echo "No custom user-agent string provided."
fi
@ -378,13 +379,13 @@ jobs:
- name: Install Microsoft.Trusted.Signing.Client
if: runner.os == 'Windows'
run: |
.\nuget.exe install Microsoft.Trusted.Signing.Client -Version 1.0.53 -OutputDirectory .
.\nuget.exe install Microsoft.Trusted.Signing.Client -Version 1.0.86 -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
$dllPath = (Get-ChildItem ".\Microsoft.Trusted.Signing.Client.1.0.86\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

View File

@ -75,10 +75,12 @@ endif(TESTBUILD AND TESTBUILDPERIOD)
#<FS:Beq> Support for custom Primfeed UA
option(FS_PF_USER_AGENT "Optional compiletime Primfeed useragent string" "")
if(FS_PF_USER_AGENT)
# For a single target, say your executable is called "firestorm_viewer":
if (FS_PF_USER_AGENT)
add_compile_definitions(FS_PF_USER_AGENT="${FS_PF_USER_AGENT}")
endif()
message(STATUS "Compiling with custom Primfeed user-agent: ${FS_PF_USER_AGENT}")
else (FS_PF_USER_AGENT)
message(STATUS "Compiling with standard Primfeed user-agent")
endif (FS_PF_USER_AGENT)
# </Beq>
# <FS:Ansariel> [AVX Optimization]
option(USE_AVX_OPTIMIZATION "AVX optimization support" OFF)

View File

@ -74,9 +74,14 @@ FSPrimfeedPhotoPanel::FSPrimfeedPhotoPanel() :
mDescriptionTextBox(nullptr),
mLocationCheckbox(nullptr),
mRatingComboBox(nullptr),
mStoresComboBox(nullptr),
mPostButton(nullptr),
mBtnPreview(nullptr),
mBigPreviewFloater(nullptr)
mBigPreviewFloater(nullptr),
mCancelButton(nullptr),
mCommercialCheckbox(nullptr),
mFilterComboBox(nullptr),
mPublicGalleryCheckbox(nullptr)
{
mCommitCallbackRegistrar.add("SocialSharing.SendPhoto", [this](LLUICtrl*, const LLSD&) { onSend(); });
mCommitCallbackRegistrar.add("SocialSharing.RefreshPhoto", [this](LLUICtrl*, const LLSD&) { onClickNewSnapshot(); });
@ -88,6 +93,16 @@ FSPrimfeedPhotoPanel::FSPrimfeedPhotoPanel() :
LL_DEBUGS("primfeed") << "Info button clicked, opening " << url << LL_ENDL;
LLWeb::loadURLExternal(url);
});
FSPrimfeedAuth::sPrimfeedAuthPump->listen("FSPrimfeedPhotoPanel",
[this](const LLSD& data)
{
if (data["responseType"].asString() == "primfeed_user_info")
{
this->loadPrimfeedInfo(data);
return true;
}
return false;
});
}
FSPrimfeedPhotoPanel::~FSPrimfeedPhotoPanel()
@ -97,8 +112,6 @@ FSPrimfeedPhotoPanel::~FSPrimfeedPhotoPanel()
mPreviewHandle.get()->die();
}
FSPrimfeedAuth::sPrimfeedAuthPump->stopListening("FSPrimfeedAccountPanel");
gSavedSettings.setS32("FSLastSnapshotToPrimfeedResolution", getChild<LLComboBox>("resolution_combobox")->getCurrentIndex());
gSavedSettings.setS32("FSLastSnapshotToPrimfeedWidth", getChild<LLSpinCtrl>("custom_snapshot_width")->getValue().asInteger());
gSavedSettings.setS32("FSLastSnapshotToPrimfeedHeight", getChild<LLSpinCtrl>("custom_snapshot_height")->getValue().asInteger());
@ -121,6 +134,7 @@ bool FSPrimfeedPhotoPanel::postBuild()
mCommercialCheckbox = getChild<LLUICtrl>("primfeed_commercial_content");
mPublicGalleryCheckbox = getChild<LLUICtrl>("primfeed_add_to_public_gallery");
mRatingComboBox = getChild<LLUICtrl>("rating_combobox");
mStoresComboBox = getChild<LLComboBox>("stores_combobox");
mPostButton = getChild<LLUICtrl>("post_photo_btn");
mCancelButton = getChild<LLUICtrl>("cancel_photo_btn");
mBigPreviewFloater = dynamic_cast<LLFloaterBigPreview*>(LLFloaterReg::getInstance("big_preview"));
@ -192,6 +206,8 @@ void FSPrimfeedPhotoPanel::draw()
mCancelButton->setEnabled(can_post);
mDescriptionTextBox->setEnabled(can_post);
mRatingComboBox->setEnabled(can_post);
// If the stores combo box is present, enable it only if we have stores to select from
mStoresComboBox->setEnabled(can_post && mStoresComboBox->getItemCount() > 1);
mResolutionComboBox->setEnabled(can_post);
mFilterComboBox->setEnabled(can_post);
mRefreshBtn->setEnabled(can_post);
@ -327,7 +343,7 @@ bool FSPrimfeedPhotoPanel::onPrimfeedConnectStateChange(const LLSD& /*data*/)
{
if (FSPrimfeedAuth::isAuthorized())
{
sendPhoto();
return true;
}
return false;
@ -352,10 +368,10 @@ void FSPrimfeedPhotoPanel::sendPhoto()
std::string description = mDescriptionTextBox->getValue().asString();
// Get the content rating
int content_rating = mRatingComboBox->getValue().asInteger();
bool post_to_public_gallery = mPublicGalleryCheckbox->getValue().asBoolean();
bool commercial_content = mCommercialCheckbox->getValue().asBoolean();
int content_rating = mRatingComboBox->getValue().asInteger();
bool post_to_public_gallery = mPublicGalleryCheckbox->getValue().asBoolean();
bool commercial_content = mCommercialCheckbox->getValue().asBoolean();
std::string store_id = mStoresComboBox->getValue().asString();
// Get the image
LLSnapshotLivePreview* previewp = getPreviewView();
@ -376,6 +392,11 @@ void FSPrimfeedPhotoPanel::sendPhoto()
params["location"] = slurl_string;
}
if (!store_id.empty())
{
// Add the store ID if we have one selected
params["store_id"] = store_id;
}
FSPrimfeedConnect::instance().uploadPhoto(params, previewp->getFormattedImage().get(),
[this](bool success, const std::string& url)
@ -529,6 +550,35 @@ void FSPrimfeedPhotoPanel::checkAspectRatio(S32 index)
}
}
void FSPrimfeedPhotoPanel::loadPrimfeedInfo(const LLSD& data)
{
if (!mStoresComboBox)
return;
// Clear any existing entries
mStoresComboBox->clearRows();
mStoresComboBox->add(LLTrans::getString("Personal"), LLSD(""));
// Read the saved stores array
const LLSD& stores = data["stores"];
if (!stores.isArray() || stores.size() == 0)
{
// No stores - disable the combobox
mStoresComboBox->setEnabled(false);
return;
}
mStoresComboBox->setEnabled(true);
for (S32 i = 0; i < stores.size(); ++i)
{
const LLSD& store = stores[i];
std::string id = store["id"].asString();
std::string name = store["name"].asString();
mStoresComboBox->add(name, LLSD(id));
}
mStoresComboBox->setCurrentByIndex(0);
}
LLUICtrl* FSPrimfeedPhotoPanel::getRefreshBtn()
{
return mRefreshBtn;
@ -536,13 +586,10 @@ LLUICtrl* FSPrimfeedPhotoPanel::getRefreshBtn()
void FSPrimfeedPhotoPanel::onOpen(const LLSD& key)
{
if (!FSPrimfeedAuth::isAuthorized())
{
// Reauthorise if necessary.
FSPrimfeedAuth::initiateAuthRequest();
LLSD dummy;
onPrimfeedConnectStateChange(dummy);
}
// Reauthorise if necessary.
FSPrimfeedAuth::initiateAuthRequest();
LLSD dummy;
onPrimfeedConnectStateChange(dummy);
}
void FSPrimfeedPhotoPanel::uploadCallback(bool success, const LLSD& response)
@ -639,9 +686,23 @@ FSPrimfeedAccountPanel::FSPrimfeedAccountPanel() :
FSPrimfeedAuth::sPrimfeedAuthPump->listen("FSPrimfeedAccountPanel",
[this](const LLSD& data)
{
bool success = data["success"].asBoolean();
primfeedAuthResponse(success, data);
return true;
if (data.has("responseType"))
{
auto response_type = data["responseType"].asString();
if (response_type == "primfeed_auth_response")
{
bool success = data["success"].asBoolean();
primfeedAuthResponse(success, data);
return true;
}
if (response_type == "primfeed_auth_reset")
{
bool success = data["success"].asBoolean();
primfeedAuthResponse(success, data);
return true;
}
}
return false;
});
setVisibleCallback([this](LLUICtrl*, bool visible) { onVisibilityChange(visible); });
@ -663,8 +724,8 @@ bool FSPrimfeedAccountPanel::postBuild()
void FSPrimfeedAccountPanel::draw()
{
FSPrimfeedConnect::EConnectionState connection_state = FSPrimfeedConnect::instance().getConnectionState();
static FSPrimfeedConnect::EConnectionState last_state = FSPrimfeedConnect::PRIMFEED_DISCONNECTED;
FSPrimfeedConnect::EConnectionState connection_state = FSPrimfeedConnect::instance().getConnectionState();
static FSPrimfeedConnect::EConnectionState last_state = FSPrimfeedConnect::PRIMFEED_DISCONNECTED;
// Update the connection state if it has changed
if (connection_state != last_state)
@ -772,14 +833,20 @@ void FSPrimfeedAccountPanel::onConnect()
{
FSPrimfeedAuth::initiateAuthRequest();
LLSD dummy;
onPrimfeedConnectStateChange(dummy);
onPrimfeedConnectStateChange(dummy);
}
void FSPrimfeedAccountPanel::onDisconnect()
{
FSPrimfeedAuth::resetAuthStatus();
LLSD dummy;
onPrimfeedConnectStateChange(dummy);
onPrimfeedConnectStateChange(dummy);
}
FSPrimfeedAccountPanel::~FSPrimfeedAccountPanel()
{
// Disconnect the primfeed auth pump
FSPrimfeedAuth::sPrimfeedAuthPump->stopListening("FSPrimfeedAccountPanel");
}
////////////////////////
@ -789,10 +856,10 @@ void FSPrimfeedAccountPanel::onDisconnect()
FSFloaterPrimfeed::FSFloaterPrimfeed(const LLSD& key) :
LLFloater(key),
mPrimfeedPhotoPanel(nullptr),
mPrimfeedAccountPanel(nullptr),
mStatusErrorText(nullptr),
mStatusLoadingText(nullptr),
mStatusLoadingIndicator(nullptr),
mPrimfeedAccountPanel(nullptr)
mStatusLoadingIndicator(nullptr)
{
mCommitCallbackRegistrar.add("SocialSharing.Cancel", [this](LLUICtrl*, const LLSD&) { onCancel(); });
}

View File

@ -34,6 +34,7 @@
class LLIconCtrl;
class LLCheckBoxCtrl;
class LLComboBox;
class LLSnapshotLivePreview;
class LLFloaterBigPreview;
@ -52,6 +53,7 @@ public:
bool postBuild() override;
S32 notify(const LLSD& info);
void draw() override;
void loadPrimfeedInfo(const LLSD& data);
LLSnapshotLivePreview* getPreviewView();
void onVisibilityChange(bool new_visibility);
@ -80,28 +82,30 @@ private:
LLHandle<LLView> mPreviewHandle;
LLUICtrl * mResolutionComboBox;
LLUICtrl * mFilterComboBox;
LLUICtrl * mRefreshBtn;
LLUICtrl * mWorkingLabel;
LLUICtrl * mThumbnailPlaceholder;
LLUICtrl * mDescriptionTextBox;
LLUICtrl * mLocationCheckbox;
LLUICtrl* mResolutionComboBox;
LLUICtrl* mFilterComboBox;
LLUICtrl* mRefreshBtn;
LLUICtrl* mWorkingLabel;
LLUICtrl* mThumbnailPlaceholder;
LLUICtrl* mDescriptionTextBox;
LLUICtrl* mLocationCheckbox;
LLUICtrl * mCommercialCheckbox;
LLUICtrl * mPublicGalleryCheckbox;
LLUICtrl * mRatingComboBox;
LLUICtrl * mPostButton;
LLUICtrl * mCancelButton;
LLButton * mBtnPreview;
LLUICtrl* mCommercialCheckbox;
LLUICtrl* mPublicGalleryCheckbox;
LLUICtrl* mRatingComboBox;
LLUICtrl* mPostButton;
LLUICtrl* mCancelButton;
LLButton* mBtnPreview;
LLComboBox* mStoresComboBox;
LLFloaterBigPreview * mBigPreviewFloater;
LLFloaterBigPreview* mBigPreviewFloater;
};
class FSPrimfeedAccountPanel : public LLPanel
{
public:
FSPrimfeedAccountPanel();
~FSPrimfeedAccountPanel();
bool postBuild() override;
void draw() override;

View File

@ -112,31 +112,25 @@ void FSPrimfeedAuth::initiateAuthRequest()
// It should be called when the user clicks the "Authenticate" button.
// Also triggered on opening the floater.
// The actual implementation is in the create() method.
if (!isAuthorized())
if (sPrimfeedAuth)
{
if (sPrimfeedAuth)
LLNotificationsUtil::add("PrimfeedAuthorizationAlreadyInProgress");
return;
}
// If no token stored, begin the login request; otherwise check user status.
sPrimfeedAuth = FSPrimfeedAuth::create(
[](bool success, const LLSD &response)
{
LLNotificationsUtil::add("PrimfeedAuthorizationAlreadyInProgress");
return;
LLSD event_data = response;
event_data["responseType"] = "primfeed_auth_response";
event_data["success"] = success;
sPrimfeedAuthPump->post(event_data);
// Now that auth is complete, clear the static pointer.
sPrimfeedAuth.reset();
}
// If no token stored, begin the login request; otherwise check user status.
sPrimfeedAuth = FSPrimfeedAuth::create(
[](bool success, const LLSD &response)
{
LLSD event_data = response;
event_data["success"] = success;
sPrimfeedAuthPump->post(event_data);
// Now that auth is complete, clear the static pointer.
sPrimfeedAuth.reset();
}
);
FSPrimfeedConnect::instance().setConnectionState(FSPrimfeedConnect::PRIMFEED_CONNECTING);
}
else
{
LLNotificationsUtil::add("PrimfeedAlreadyAuthorized");
}
);
FSPrimfeedConnect::instance().setConnectionState(FSPrimfeedConnect::PRIMFEED_CONNECTING);
}
void FSPrimfeedAuth::resetAuthStatus()
@ -147,7 +141,7 @@ void FSPrimfeedAuth::resetAuthStatus()
gSavedPerAccountSettings.setString("FSPrimfeedPlan", "");
gSavedPerAccountSettings.setString("FSPrimfeedUsername", "");
LLSD event_data;
event_data["status"] = "reset";
event_data["responseType"] = "primfeed_auth_reset";
event_data["success"] = "false";
sPrimfeedAuthPump->post(event_data);
FSPrimfeedConnect::instance().setConnectionState(FSPrimfeedConnect::PRIMFEED_DISCONNECTED);
@ -201,7 +195,8 @@ std::shared_ptr<FSPrimfeedAuth> FSPrimfeedAuth::create(authorized_callback_t cal
FSPrimfeedConnect::instance().setConnectionState(FSPrimfeedConnect::PRIMFEED_CONNECTING);
// If no token stored, begin the login request; otherwise check user status.
if (gSavedPerAccountSettings.getString("FSPrimfeedOAuthToken").empty())
auth->mOauthToken = gSavedPerAccountSettings.getString("FSPrimfeedOAuthToken");
if (auth->mOauthToken.empty())
{
auth->beginLoginRequest();
}
@ -432,22 +427,23 @@ void FSPrimfeedAuth::checkUserStatus()
}
void FSPrimfeedAuth::gotUserStatus(bool success, const LLSD &response)
void FSPrimfeedAuth::gotUserStatus(bool success, const LLSD &response) const
{
LL_INFOS("Primfeed") << "User status: " << response << "(" << success << ")" << LL_ENDL;
if (success && response.has("plan"))
if (success && response.has("plan") && response.has("username") && response.has("link"))
{
gSavedPerAccountSettings.setString("FSPrimfeedOAuthToken", mOauthToken);
gSavedPerAccountSettings.setString("FSPrimfeedPlan", response["plan"].asString());
gSavedPerAccountSettings.setString("FSPrimfeedProfileLink", response["link"].asString());
gSavedPerAccountSettings.setString("FSPrimfeedUsername", response["username"].asString());
FSPrimfeedConnect::instance().setConnectionState(FSPrimfeedConnect::PRIMFEED_CONNECTED);
LLSD event_data = response;
event_data["responseType"] = "primfeed_user_info";
sPrimfeedAuthPump->post(event_data);
mCallback(true, response);
return;
}
else
{
LLNotificationsUtil::add("PrimfeedUserStatusFailed");
FSPrimfeedConnect::instance().setConnectionState(FSPrimfeedConnect::PRIMFEED_DISCONNECTED);
mCallback(false, response);
}
LLNotificationsUtil::add("PrimfeedUserStatusFailed");
FSPrimfeedConnect::instance().setConnectionState(FSPrimfeedConnect::PRIMFEED_DISCONNECTED);
mCallback(false, response);
}

View File

@ -79,7 +79,7 @@ private:
// Callback when the validate response is received.
void gotValidateResponse(bool success, const LLSD &response);
// Callback when the user status response is received.
void gotUserStatus(bool success, const LLSD &response);
void gotUserStatus(bool success, const LLSD &response) const;
boost::signals2::connection mInstantMessageConnection;
boost::signals2::connection mChatMessageConnection;

View File

@ -89,6 +89,7 @@ void FSPrimfeedConnect::uploadPhotoCoro(const LLSD& params, LLImageFormatted* im
addPart("location", params["location"].asString());
}
LL_DEBUGS("primfeed") << "Adding image file header" << LL_ENDL;
body << dash << sep
<< "Content-Disposition: form-data; name=\"image\"; filename=\"snapshot." << fmt << "\"" << sep
@ -122,12 +123,11 @@ void FSPrimfeedConnect::uploadPhotoCoro(const LLSD& params, LLImageFormatted* im
headers->append(HTTP_OUT_HEADER_USER_AGENT, FS_PF_USER_AGENT);
headers->append("Authorization", "Bearer " + token);
headers->append("pf-viewer-api-key", apiKey);
headers->append("Content-Type", "multipart/form-data; boundary=" + boundary);
LL_DEBUGS("primfeed") << "Dumping HTTP headers for POST:" << LL_ENDL;
for (auto it = headers->begin(); it != headers->end(); ++it)
if (params.has("store_id") && !params["store_id"].asString().empty())
{
LL_DEBUGS("primfeed") << it->first << ": " << it->second << LL_ENDL;
headers->append("kynno-selected-store", params["store_id"].asString());
}
headers->append("Content-Type", "multipart/form-data; boundary=" + boundary);
LL_DEBUGS("primfeed") << "Headers set" << LL_ENDL;
LL_DEBUGS("primfeed") << "Starting HTTP POST" << LL_ENDL;
@ -182,9 +182,3 @@ bool FSPrimfeedConnect::isTransactionOngoing() const
mConnectionState == PRIMFEED_DISCONNECTING);
}
void FSPrimfeedConnect::loadPrimfeedInfo()
{
LL_DEBUGS("primfeed") << "loadPrimfeedInfo() called" << LL_ENDL;
// Nothing to do here for Primfeed
setConnectionState(PRIMFEED_CONNECTED);
}

View File

@ -305,7 +305,10 @@ S32 LLAgentBenefits::get2KTextureUploadCost(S32 area) const
{
if (m_2k_texture_upload_cost.empty())
{
return m_texture_upload_cost;
// <FS:Ansariel> OpenSim legacy economy
//return m_texture_upload_cost;
return LLGridManager::instance().isInSecondLife() ? m_texture_upload_cost : LLGlobalEconomy::instance().getPriceUpload();
// </FS:Ansariel>
}
return m_2k_texture_upload_cost[0];
}

View File

@ -60,7 +60,7 @@ static void touch_default_probe(LLReflectionMap* probe)
}
}
LLHeroProbeManager::LLHeroProbeManager():mMirrorNormal(0,0,1) // <FS:Beq/> [FIRE-35007][#3331] mirrors not working after relog. make sure the mirror normal is not zero length
LLHeroProbeManager::LLHeroProbeManager()
{
}

View File

@ -15,6 +15,10 @@
<check_box label="Guide anzeigen" name="show_guides" tool_tip="Zeigt Aufnahme-Guide (Drittel-Regel) innerhalb des Aufnahmebereichs an."/>
<button label="Aktualisieren" name="new_snapshot_btn" tool_tip="Zum Aktualisieren klicken"/>
<button label="Vorschau" name="big_preview_btn" tool_tip="Klicken, um Vorschau ein-/auszuschalten"/>
<text name="store_label">
Teilen als:
</text>
<combo_box name="stores_combobox" tool_tip="Falls Ihnen einen oder mehrere Blogger-Bestände auf Primfeed zugewiesen sind, erscheinen diese hier."/>
<text name="description_label">
Beschreibung:
</text>

View File

@ -10,10 +10,10 @@
single_instance="true"
reuse_instance="true"
title="Share to Primfeed"
height="600"
height="638"
width="272">
<panel
height="590"
height="638"
width="272"
visible="true"
name="background"
@ -27,7 +27,7 @@
tab_height="21"
tab_position="top"
top="7"
height="570"
height="605"
follows="all"
halign="center">
<panel

View File

@ -628,7 +628,7 @@
</scroll_list>
</panel>
<panel
follows="right|top|bottom"
follows="right|bottom"
height="95"
top_pad="0"
width="258"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<panel
height="540"
height="590"
width="272"
follows="all"
layout="topleft"
@ -192,6 +192,29 @@
width="100">
<button.commit_callback function="SocialSharing.BigPreview" />
</button>
<text
follows="left|top"
layout="topleft"
font="SansSerif"
height="16"
left="10"
name="store_label"
top_pad="8"
type="string">
Post as:
</text>
<combo_box
control_name="FSPrimfeedSelectedStore"
follows="left|top"
layout="topleft"
name="stores_combobox"
tool_tip="If you have one or more easy blogger stores assigned on Primfeed they will appear here."
top_pad="2"
left="10"
height="21"
width="235">
<!-- Initially empty; items will be populated at runtime -->
</combo_box>
<text
length="1"
follows="top|left|right"

View File

@ -243,11 +243,12 @@
Sensibilité du trackpad :
</text>
<slider name="trackpad_sensitivity_slider" tool_tip="Règle la sensibilité du trackpad"/>
<check_box name="natural_direction_checkbox" label="Utiliser l'alignement naturel" tool_tip="Le squelette a des rotations d'articulations non naturelles par défaut. Cela complique la pose. Si cette option est cochée, les articulations tourneront de manière plus naturelle."/>
<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 à l'enregis.**" 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."/>
<check_box name="confirm_overwrite_on_save_checkbox" label="Confirmer l'écrasement" tool_tip="Lorsque vous enregistrez une pose, si le fichier existe déjà, vous devez cliquer à nouveau sur le bouton d'enregistrement pour confirmer que vous êtes sûr de vouloir l'écraser."/>
<check_box name="natural_direction_checkbox" label="Utiliser l'alignement naturel" tool_tip="Le squelette a des rotations d'articulations non naturelles par défaut. Cela complique la pose. Si cette option est cochée, les articulations tourneront de manière plus naturelle."/>
<check_box name="show_joint_markers_checkbox" label="Aff. marqueurs de jointure" tool_tip="Afficher de petits indicateurs pour faciliter la sélection des articulations lors de la pose visuelle."/>
</panel>
</tab_container>
<button name="toggleVisualManipulators" tool_tip="Activer et désactiver les manipulateurs visuels"/>

View File

@ -15,6 +15,10 @@
<check_box label="Guide de cadrage" tool_tip="Affiche le guide de cadrage (règle des tiers) à l'intérieur du cadre de la photo." name="show_guides"/>
<button label="Actualiser" name="new_snapshot_btn" tool_tip="Cliquez pour actualiser"/>
<button label="Aperçu" name="big_preview_btn" tool_tip="Cliquez pour afficher l'aperçu"/>
<text name="store_label">
Publier en tant que :
</text>
<combo_box name="stores_combobox" tool_tip="Si vous avez une ou plusieurs boutiques Easy Blogger attribuées sur Primfeed, elles apparaîtront ici."/>
<text name="description_label">
Description :
</text>

View File

@ -7152,4 +7152,13 @@ Votre position actuelle : [AVATAR_POS]
<string name="ListEmpty">
La liste est vide
</string>
<string name="NoValidUUIDs">
Le fichier importé ne contient aucun UUID valide.
</string>
<string name="ImportListTooLarge">
Trop d'entrées. Le fichier CSV contient [COUNT] entrées et il y a [MAX] emplacements disponibles.
</string>
<string name="ImportSuccessful">
Successfully processed [COUNT] entries.
</string>
</strings>

View File

@ -479,6 +479,8 @@
<name_list name="AccessList" tool_tip="(最大[MAX]人中[LISTED]人が登録されています。)"/>
<button label="追加" name="add_allowed"/>
<button label="削除" label_selected="削除" name="remove_allowed"/>
<button label="エクスポート" label_selected="エクスポート" name="export_allowed"/>
<button tool_tip="有効なUUIDのみ(1行に1つ、余分な文字やフォーマットなし)を含むCSV形式のファイルをインポートします。" label="インポート" label_selected="インポート" name="import_allowed"/>
</panel>
<panel name="Banned_layout_panel">
<text label="バン" name="BanCheck">
@ -490,6 +492,8 @@
</name_list>
<button label="追加" name="add_banned"/>
<button label="削除" label_selected="削除" name="remove_banned"/>
<button label="エクスポート" label_selected="エクスポート" name="export_banned"/>
<button tool_tip="有効なUUIDのみ(1行に1つ、余分な文字やフォーマットなし)を含むCSV形式のファイルをインポートします。" label="インポート" label_selected="インポート" name="import_banned"/>
</panel>
</panel>
<panel label="体験" name="land_experiences_panel"/>

View File

@ -256,11 +256,12 @@
トラックパッドの感度:
</text>
<slider name="trackpad_sensitivity_slider" tool_tip="トラックボールの感度を調整します。"/>
<check_box name="natural_direction_checkbox" label="自然な配置を使用する" tool_tip="デフォルトでは、スケルトンの関節の回転は不自然です。これにより、ポーズが複雑になります。チェックすると、関節がより自然に回転します。"/>
<check_box name="stop_posing_on_close_checkbox" label="閉じたらポーズを止める" tool_tip="ポーズを止めないことは、多くの作業を行っていて、誤ってポーズを失いたくない場合に役に立ちます。"/>
<check_box name="reset_base_rotation_on_edit_checkbox" label="編集時にベース回転をリセット" tool_tip="回転を初めて編集するときは、ゼロにリセットします。これにより、作業でポーズを保存できます。(差分ではなく、読み込み/保存を参照)ゼロにエクスポートした各ジョイントの横に緑色のチェックマークが表示されます。"/>
<check_box name="also_save_bvh_checkbox" label="保存時にBVHを書き込む**" tool_tip="ポーズを保存するときに、BVHファイルも作成します。このファイルは、「ビルド」>「アップロード」>「アニメーション」からアップロードして、自分自身または他のユーザーにインワールドのポーズを与えることができます。BVHにはオリジナルの作業が必要なので、ジョイントの「ベース」をゼロにリセットする必要があります。"/>
<check_box name="confirm_overwrite_on_save_checkbox" label="上書きを確認" tool_tip="ポーズを保存するときに、ファイルがすでに存在する場合は、上書きすることを確認するために、もう一度保存ボタンをクリックする必要があります。"/>
<check_box name="natural_direction_checkbox" label="自然な配置を使用する" tool_tip="デフォルトでは、スケルトンの関節の回転は不自然です。これにより、ポーズが複雑になります。チェックすると、関節がより自然に回転します。"/>
<check_box name="show_joint_markers_checkbox" label="ジョイント部にマーカーを表示" tool_tip="視覚的なポージングにジョイント部の選択を支援するための小さなインジケーターを表示します。"/>
</panel>
</tab_container>
<button name="toggleVisualManipulators" tool_tip="視覚マニピュレータのオン/オフを切り替えます。"/>

View File

@ -208,7 +208,7 @@
<text name="preferences_search_bg_label">
背景:
</text>
<color_swatch name="preferences_search_color" tool_tip="初期設定の検索結果のハイライトの背景色を選択します。"/>
<color_swatch name="preferences_search_bg_color" tool_tip="初期設定の検索結果のハイライトの背景色を選択します。"/>
<text name="preferences_search_font_label">
フォント:
</text>

View File

@ -24,6 +24,10 @@
<check_box label="フレームのガイドを表示" tool_tip="スナップショットフレーム内にフレームのガイド(三分割法)を表示します。" name="show_guides"/>
<button label="リフレッシュ" name="new_snapshot_btn" tool_tip="クリックでリフレッシュします。"/>
<button label="プレビュー" name="big_preview_btn" tool_tip="クリックでプレビューを切り替えます。"/>
<text name="store_label">
投稿者:
</text>
<combo_box name="stores_combobox" tool_tip="Primfeedにつ以上の簡単なブロガーストアが割り当てられている場合は、ここに表示されます。"/>
<text name="description_label">
説明:
</text>

View File

@ -13,6 +13,8 @@
<!-- Estate Managers buttons -->
<button label="追加…" name="add_estate_manager_btn"/>
<button label="削除…" name="remove_estate_manager_btn"/>
<button label="エクスポート…" name="export_estate_manager_btn"/>
<button tool_tip="有効なUUIDのみ(1行に1つ、余分な文字やフォーマットなし)を含むCSV形式のファイルをインポートします。" label="インポート…" name="import_estate_manager_btn"/>
</panel>
<!-- ================================ ALLOWED tab =========================== -->
<panel label="許可" name="allowed_panel">
@ -30,6 +32,8 @@
<!-- Always allowed buttons -->
<button label="追加…" name="add_allowed_avatar_btn"/>
<button label="削除…" name="remove_allowed_avatar_btn"/>
<button label="エクスポート…" name="export_allowed_list_btn"/>
<button tool_tip="有効なUUIDのみ(1行に1つ、余分な文字やフォーマットなし)を含むCSV形式のファイルをインポートします。" label="インポート…" name="import_allowed_list_btn"/>
</panel>
<!-- ============================= ALLOWED GROUPS tab ======================= -->
<panel label="許可するグループ" name="allowed_groups_panel">
@ -47,6 +51,8 @@
<!-- Groups always allowed buttons -->
<button label="追加…" name="add_allowed_group_btn"/>
<button label="削除…" name="remove_allowed_group_btn"/>
<button label="エクスポート…" name="export_allowed_group_btn"/>
<button tool_tip="有効なUUIDのみ(1行に1つ、余分な文字やフォーマットなし)を含むCSV形式のファイルをインポートします。" label="インポート…" name="import_allowed_group_btn"/>
</panel>
<!-- ================================ BANNED tab ============================ -->
<panel label="バン" name="banned_panel">
@ -67,6 +73,8 @@
<!-- Always banned buttons -->
<button label="追加…" name="add_banned_avatar_btn"/>
<button label="削除…" name="remove_banned_avatar_btn"/>
<button label="エクスポート…" name="export_banned_avatar_btn"/>
<button tool_tip="有効なUUIDのみ(1行に1つ、余分な文字やフォーマットなし)を含むCSV形式のファイルをインポートします。" label="インポート…" name="import_banned_avatar_btn"/>
</panel>
</tab_container>
</panel>

View File

@ -6586,4 +6586,9 @@ Rez時間[OBJECT_REZ_TIME]
<string name="FSObjectInventoryElements">[NUM_ELEMENTS]件の要素</string>
<string name="OpenSimInventoryValidationErrorGenericHelp">グリッドオペレータのサポートチーム</string>
<string name="Unlimited">無制限</string>
</strings>
<string name="ListEmpty">リストは空です。</string>
<string name="NoValidUUIDs">インポートされたファイル内に有効なUUIDが見つかりません。</string>
<string name="ImportListTooLarge">エントリが多すぎます。CSVファイルには[COUNT]個のエントリがあり、残り使用可能なスロット数は[MAX]個です。</string>
<string name="ImportSuccessful">[COUNT]件のエントリを正常に処理しました。</string>
</strings>

View File

@ -244,11 +244,12 @@
<panel title="Inne" name="settings_panel">
<text name="trackpad_sensitivity_label">Czułość trackpada:</text>
<slider name="trackpad_sensitivity_slider" tool_tip="Dostosowuje czułość trackballa / kółka" />
<check_box name="natural_direction_checkbox" label="Naturalne wyrównanie" tool_tip="Szkielet ma domyślnie nienaturalne rotacje stawów. To utrudnia pozowanie. Po zaznaczeniu stawy będą się obracać w bardziej naturalny sposób." />
<check_box name="stop_posing_on_close_checkbox" label="Stop pozy po zamknięciu" tool_tip="Brak zatrzymywania pozy może być pomocny, jeśli nie chcesz jej przypadkowo stracić." />
<check_box name="reset_base_rotation_on_edit_checkbox" label="Reset bazy rotacji na edycji" tool_tip="Gdy po raz pierwszy edytujesz obrót, zresetuj go do zera. Oznacza to, że Twoja praca może zapisać pozę (a nie różnicę, patrz ładowanie / zapisywanie). Zielony 'ptaszek' pojawia się obok każdego wyzerowanego tak, wyeksportowanego stawu." />
<check_box name="also_save_bvh_checkbox" label="Twórz BVH podczas zapisu**" tool_tip="Podczas zapisywania pozy twórz również plik BVH, który można przesłać za pomocą 'Buduj > Prześlij > Animację', aby móc ustawiać siebie lub innych w świecie. Należy zresetować 'bazę' stawów do zera, ponieważ BVH wymaga oryginalnej pracy." />
<check_box name="confirm_overwrite_on_save_checkbox" label="Potwierdź nadpisanie" tool_tip="Gdy zapisujesz pozę, a plik już istnieje, musisz kliknąć przycisk zapisu ponownie, aby potwierdzić, że na pewno chcesz ją nadpisać." />
<check_box name="natural_direction_checkbox" label="Naturalne wyrównanie" tool_tip="Szkielet ma domyślnie nienaturalne rotacje stawów. To utrudnia pozowanie. Po zaznaczeniu stawy będą się obracać w bardziej naturalny sposób." />
<check_box name="show_joint_markers_checkbox" label="Wskaźniki stawów" tool_tip="Pokaż małe wskaźniki ułatwiające wybór stawów podczas pozowania." />
</panel>
</tab_container>
<button name="toggleVisualManipulators" tool_tip="Włącz / wyłącz manipulatory wizualne." />

View File

@ -15,6 +15,10 @@
<check_box label="Prowadnice" tool_tip="Pokaż prowadnicę kadrowania (zasadę trójpodziału) wewnątrz ramki migawki." name="show_guides" />
<button label="Odśwież" name="new_snapshot_btn" tool_tip="Kliknij, aby odświeżyć" />
<button label="Podgląd" name="big_preview_btn" tool_tip="Kliknij, aby przełączyć podgląd" />
<text name="store_label">
Ślij jako:
</text>
<combo_box name="stores_combobox" tool_tip="Jeśli masz jeden lub więcej sklepów Easy Blogger przypisanych do Primfeed, to pojawią się one tutaj." />
<text name="description_label">
Opis:
</text>

View File

@ -468,6 +468,7 @@
<button label="Добавить" name="add_allowed" />
<button label="Удалить" label_selected="Удалить" name="remove_allowed" />
<button label="Экспорт" label_selected="Экспорт" name="export_allowed" />
<button label="Импорт" label_selected="Импорт" name="import_allowed" tool_tip="Импортируйте CSV-файл, содержащий только действительные UUID — по одному на строку, без дополнительных символов или форматирования."/>
</panel>
<panel name="Banned_layout_panel">
<text name="BanCheck">
@ -480,6 +481,7 @@
<button label="Добавить" name="add_banned"/>
<button label="Удалить" label_selected="Удалить" name="remove_banned" />
<button label="Экспорт" label_selected="Экспорт" name="export_banned" />
<button label="Импорт" label_selected="Импорт" name="import_banned" tool_tip="Импортируйте CSV-файл, содержащий только действительные UUID — по одному на строку, без дополнительных символов или форматирования."/>
</panel>
</panel>
<panel label="Приключения" name="land_experiences_panel"/>

View File

@ -207,10 +207,13 @@
<panel title="Настр." name="settings_panel">
<text name="trackpad_sensitivity_label">Чувствительность трекпада:</text>
<slider name="trackpad_sensitivity_slider" tool_tip="Регулирует чувствительность трекбола"/>
<check_box name="natural_direction_checkbox" label="Используйте естественное выравнивание" tool_tip="Скелет имеет неестественные вращения суставов по умолчанию. Это усложняет позирование. Если отмечено, суставы будут вращаться более естественно." />
<check_box name="stop_posing_on_close_checkbox" label="Стоп позы по закрытию" tool_tip="Не прерывать позу может быть полезно, если вы много работаете и не хотите случайно потерять ее."/>
<check_box name="reset_base_rotation_on_edit_checkbox" label="Сброс базовый поворот" tool_tip="При первом редактировании поворота обнулите его значение. Это означает, что в вашей работе можно сохранить позу (а не разницу, см. раздел Загрузка/сохранение). Рядом с каждым суставом, экспорт которого вы обнулили, появляется зеленая галочка."/>
<check_box name="also_save_bvh_checkbox" label="Запись BVH при сохранении**" tool_tip="Когда вы сохраняете свою позу, также запишется файл BVH, который можно загрузить через 'Build > Upload > Animation', чтобы позировать себя или других в мире. Это требует, чтобы суставы сбросили свою 'базу' на ноль, потому что BVH требует оригинальной работы."/>
<check_box name="confirm_overwrite_on_save_checkbox" label="Подтвердить перезапись" tool_tip="При сохранении позы, если файл уже существует, вам необходимо нажать кнопку сохранения еще раз, чтобы подтвердить, что вы действительно хотите перезаписать его."/>
<check_box name="natural_direction_checkbox" label="Используйте естественное выравнивание" tool_tip="Скелет имеет неестественные вращения суставов по умолчанию. Это усложняет позирование. Если отмечено, суставы будут вращаться более естественно." />
<check_box name="show_joint_markers_checkbox" label="Показать маркеры суставов" tool_tip="Покажите небольшие индикаторы, помогающие выбрать суставы при визуальном позировании."/>
</panel>
</tab_container>
<button name="toggleVisualManipulators" tool_tip="Включать и выключать визуальные манипуляторы"/>

View File

@ -13,6 +13,8 @@
<check_box label="Направляющие кадрирования" tool_tip="Показать направляющую кадрирования (правило третей) внутри рамки снимка." name="show_guides" />
<button label="Обновить" name="new_snapshot_btn" tool_tip="Нажмите, чтобы обновить"/>
<button label="Просмотр" name="big_preview_btn" tool_tip="Нажмите, чтобы переключить предварительный просмотр"/>
<text name="store_label">Опубликовать как:</text>
<combo_box name="stores_combobox" tool_tip="Если у вас есть один или несколько простых магазинов блогеров, назначенных на Primfeed, они появятся здесь."/>
<text name="description_label">Описание:</text>
<check_box label="Включить местоположение" name="add_location_cb"/>
<check_box label="Добавить в публичную галерею" name="primfeed_add_to_public_gallery"/>

View File

@ -11,6 +11,7 @@
<button label="Добавить..." name="add_estate_manager_btn"/>
<button label="Удалить..." name="remove_estate_manager_btn"/>
<button label="Экспорт..." name="export_estate_manager_btn"/>
<button label="Импорт..." name="import_estate_manager_btn" tool_tip="Импортируйте CSV-файл, содержащий только действительные UUID - по одному на строку, без дополнительных символов или форматирования."/>
</panel>
<panel label="Разрешенные" name="allowed_panel">
<panel label="top_panel" name="allowed_search_panel">
@ -26,6 +27,7 @@
<button label="Добавить..." name="add_allowed_avatar_btn"/>
<button label="Удалить..." name="remove_allowed_avatar_btn"/>
<button label="Экспорт..." name="export_allowed_list_btn"/>
<button label="Импорт..." name="import_allowed_list_btn" tool_tip="Импортируйте CSV-файл, содержащий только действительные UUID - по одному на строку, без дополнительных символов или форматирования."/>
</panel>
<panel label="Допущенные Группы" name="allowed_groups_panel">
<panel label="top_panel" name="allowed_group_search_panel">
@ -41,6 +43,7 @@
<button label="Добавить..." name="add_allowed_group_btn"/>
<button label="Удалить..." name="remove_allowed_group_btn"/>
<button label="Экспорт..." name="export_allowed_group_btn"/>
<button label="Импорт..." name="import_allowed_group_btn" tool_tip="Импортируйте CSV-файл, содержащий только действительные UUID - по одному на строку, без дополнительных символов или форматирования."/>
</panel>
<panel label="Заблокированы" name="banned_panel">
<panel label="top_panel" name="banned_search_panel">
@ -59,6 +62,7 @@
<button label="Добавить..." name="add_banned_avatar_btn"/>
<button label="Удалить..." name="remove_banned_avatar_btn"/>
<button label="Экспорт..." name="export_banned_avatar_btn"/>
<button label="Импорт..." name="import_banned_avatar_btn" tool_tip="Импортируйте CSV-файл, содержащий только действительные UUID - по одному на строку, без дополнительных символов или форматирования."/>
</panel>
</tab_container>
</panel>

View File

@ -6873,5 +6873,10 @@ ID объекта: [INSPECTING_KEY]
<string name="FSObjectInventoryElements">[NUM_ELEMENTS] элементов</string>
<string name="OpenSimInventoryValidationErrorGenericHelp">команда поддержки оператора вашей сетки</string>
<string name="Unlimited">Неограниченный</string>
<string name="ListEmpty">Список пуст</string>
<string name="NoValidUUIDs">В импортированном файле не найдено действительных UUID.</string>
<string name="ImportListTooLarge">Слишком много записей. CSV-файл содержит [COUNT] записей, а доступно [MAX] слотов.</string>
<string name="ImportSuccessful">Успешно обработано [COUNT] записей.</string>
</strings>

View File

@ -246,11 +246,12 @@
觸控板敏感度:
</text>
<slider name="trackpad_sensitivity_slider" tool_tip="設定觸控板的敏感度"/>
<check_box name="natural_direction_checkbox" label="使用自然對齊" tool_tip="骨骼預設具有不自然的關節旋轉,這可能會讓姿勢調整變得更複雜。選取此選項後,關節將以更自然的方式旋轉。" />
<check_box name="stop_posing_on_close_checkbox" label="關閉時停止" tool_tip="關閉時不停止姿勢可有助於保留目前工作。"/>
<check_box name="reset_base_rotation_on_edit_checkbox" label="編輯時重設基礎旋轉" tool_tip="首次編輯旋轉時,將其重設為零。這意味著可以保存完整的姿勢(而不僅僅是差異,請參閱載入/保存)。每個以零為基準匯出的關節旁都會顯示綠色勾選標誌。" />
<check_box name="also_save_bvh_checkbox" label="儲存時也儲存BHV" tool_tip="當姿勢被儲存時將同時創建一個BHV檔案該檔案可以透過建造 > 上傳 > 動畫上傳並用於自己或其他化身的姿勢。為了實現此功能關節的基礎位置必須設為零因為BHV無法從其他姿勢推導出來。"/>
<check_box name="confirm_overwrite_on_save_checkbox" label="確認覆蓋" tool_tip="儲存姿勢時,如果檔案已存在,您需要再次點擊保存按鈕以確認覆蓋。" />
<check_box name="reset_base_rotation_on_edit_checkbox" label="編輯時重設基礎旋轉" tool_tip="首次編輯旋轉時,將其重設為零。這意味著可以保存完整的姿勢(而不僅僅是差異,請參閱載入/保存)。每個以零為基準匯出的關節旁都會顯示綠色勾選標誌。" />
<check_box name="natural_direction_checkbox" label="使用自然對齊" tool_tip="骨骼預設具有不自然的關節旋轉,這可能會讓姿勢調整變得更複雜。選取此選項後,關節將以更自然的方式旋轉。" />
<check_box name="show_joint_markers_checkbox" label="顯示關節標記" tool_tip="顯示關節標記,以便在姿勢編輯時更輕鬆地選擇關節。" />
</panel>
</tab_container>
<button name="toggleVisualManipulators" tool_tip="啟用 / 停用可視操控器。" />

View File

@ -136,6 +136,7 @@
<combo_box.item label="少量" name="32" />
<combo_box.item label="中等" name="64" />
<combo_box.item label="很多" name="128" />
<combo_box.item label="超多" name="256" />
</combo_box>
<slider label="曝光度:" name="RenderExposure" />
<check_box label="鏡面" name="Mirrors" />
@ -160,7 +161,6 @@
<combo_box.item label="ACES" name="1"/>
</combo_box>
<slider label="色調映射混合:" tool_tip="在線性與色調映射顏色之間進行混合" name="TonemapMix"/>
<!-- End of mirror settings -->
<button label="重設為我們建議的設定" name="Defaults" />
<button label="確定" label_selected="確定" name="OK" />
<button label="取消" label_selected="取消" name="Cancel" />

View File

@ -213,6 +213,7 @@
<combo_box.item label="少量" name="32" />
<combo_box.item label="中等" name="64" />
<combo_box.item label="很多" name="128" />
<combo_box.item label="超多" name="256" />
</combo_box>
<text name="TonemapTypeText">
色調映射器:

View File

@ -15,6 +15,10 @@
<check_box label="顯示指導線" name="show_guides" tool_tip="在拍攝範圍內顯示拍攝指導線(例如三分法)。"/>
<button label="更新" name="new_snapshot_btn" tool_tip="點擊更新"/>
<button label="預覽" name="big_preview_btn" tool_tip="點擊切換預覽狀態"/>
<text name="store_label">
發布為:
</text>
<combo_box name="stores_combobox" tool_tip="如果您在Primfeed上分配了一個或多個EasyBloggers商店它們將顯示在這裡。"/>
<text name="description_label">
描述:
</text>

View File

@ -627,11 +627,11 @@
</scroll_list>
</panel>
<panel
follows="right|top|bottom"
follows="right|bottom"
height="95"
top_pad="0"
width="258"
name="layout_panel_5">
name="layout_panel_7">
<text
type="string"
length="1"

View File

@ -629,11 +629,11 @@
</scroll_list>
</panel>
<panel
follows="right|top|bottom"
follows="right|bottom"
height="330"
top_pad="0"
width="258"
name="layout_panel_5">
name="layout_panel_7">
<text
type="string"
length="1"