diff options
Diffstat (limited to 'indra')
129 files changed, 1382 insertions, 363 deletions
diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp index 7bc9e97eb1..ab48ff4a43 100644 --- a/indra/llcharacter/llkeyframemotion.cpp +++ b/indra/llcharacter/llkeyframemotion.cpp @@ -1213,7 +1213,7 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) if (!dp.unpackS32(temp_priority, "base_priority")) { - llwarns << "can't read priority" << llendl; + llwarns << "can't read animation base_priority" << llendl; return FALSE; } mJointMotionList->mBasePriority = (LLJoint::JointPriority) temp_priority; @@ -1223,6 +1223,11 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) mJointMotionList->mBasePriority = (LLJoint::JointPriority)((int)LLJoint::ADDITIVE_PRIORITY-1); mJointMotionList->mMaxPriority = mJointMotionList->mBasePriority; } + else if (mJointMotionList->mBasePriority < LLJoint::USE_MOTION_PRIORITY) + { + llwarns << "bad animation base_priority " << mJointMotionList->mBasePriority << llendl; + return FALSE; + } //------------------------------------------------------------------------- // get duration @@ -1233,7 +1238,8 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) return FALSE; } - if (mJointMotionList->mDuration > MAX_ANIM_DURATION ) + if (mJointMotionList->mDuration > MAX_ANIM_DURATION || + !llfinite(mJointMotionList->mDuration)) { llwarns << "invalid animation duration" << llendl; return FALSE; @@ -1257,13 +1263,15 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) //------------------------------------------------------------------------- // get loop //------------------------------------------------------------------------- - if (!dp.unpackF32(mJointMotionList->mLoopInPoint, "loop_in_point")) + if (!dp.unpackF32(mJointMotionList->mLoopInPoint, "loop_in_point") || + !llfinite(mJointMotionList->mLoopInPoint)) { llwarns << "can't read loop point" << llendl; return FALSE; } - if (!dp.unpackF32(mJointMotionList->mLoopOutPoint, "loop_out_point")) + if (!dp.unpackF32(mJointMotionList->mLoopOutPoint, "loop_out_point") || + !llfinite(mJointMotionList->mLoopOutPoint)) { llwarns << "can't read loop point" << llendl; return FALSE; @@ -1278,13 +1286,15 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) //------------------------------------------------------------------------- // get easeIn and easeOut //------------------------------------------------------------------------- - if (!dp.unpackF32(mJointMotionList->mEaseInDuration, "ease_in_duration")) + if (!dp.unpackF32(mJointMotionList->mEaseInDuration, "ease_in_duration") || + !llfinite(mJointMotionList->mEaseInDuration)) { llwarns << "can't read easeIn" << llendl; return FALSE; } - if (!dp.unpackF32(mJointMotionList->mEaseOutDuration, "ease_out_duration")) + if (!dp.unpackF32(mJointMotionList->mEaseOutDuration, "ease_out_duration") || + !llfinite(mJointMotionList->mEaseOutDuration)) { llwarns << "can't read easeOut" << llendl; return FALSE; @@ -1374,7 +1384,7 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) LLPointer<LLJointState> joint_state = new LLJointState; mJointStates.push_back(joint_state); - joint_state->setJoint( joint ); + joint_state->setJoint( joint ); // note: can accept NULL joint_state->setUsage( 0 ); //--------------------------------------------------------------------- @@ -1386,10 +1396,16 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) llwarns << "can't read joint priority." << llendl; return FALSE; } + + if (joint_priority < LLJoint::USE_MOTION_PRIORITY) + { + llwarns << "joint priority unknown - too low." << llendl; + return FALSE; + } joint_motion->mPriority = (LLJoint::JointPriority)joint_priority; if (joint_priority != LLJoint::USE_MOTION_PRIORITY && - joint_priority > mJointMotionList->mMaxPriority) + joint_priority > mJointMotionList->mMaxPriority) { mJointMotionList->mMaxPriority = (LLJoint::JointPriority)joint_priority; } @@ -1399,7 +1415,7 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) //--------------------------------------------------------------------- // scan rotation curve header //--------------------------------------------------------------------- - if (!dp.unpackS32(joint_motion->mRotationCurve.mNumKeys, "num_rot_keys")) + if (!dp.unpackS32(joint_motion->mRotationCurve.mNumKeys, "num_rot_keys") || joint_motion->mRotationCurve.mNumKeys < 0) { llwarns << "can't read number of rotation keys" << llendl; return FALSE; @@ -1423,7 +1439,8 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) if (old_version) { - if (!dp.unpackF32(time, "time")) + if (!dp.unpackF32(time, "time") || + !llfinite(time)) { llwarns << "can't read rotation key (" << k << ")" << llendl; return FALSE; @@ -1456,7 +1473,7 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) if (old_version) { - success = dp.unpackVector3(rot_angles, "rot_angles"); + success = dp.unpackVector3(rot_angles, "rot_angles") && rot_angles.isFinite(); LLQuaternion::Order ro = StringToOrder("ZYX"); rot_key.mRotation = mayaQ(rot_angles.mV[VX], rot_angles.mV[VY], rot_angles.mV[VZ], ro); @@ -1492,7 +1509,7 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) //--------------------------------------------------------------------- // scan position curve header //--------------------------------------------------------------------- - if (!dp.unpackS32(joint_motion->mPositionCurve.mNumKeys, "num_pos_keys")) + if (!dp.unpackS32(joint_motion->mPositionCurve.mNumKeys, "num_pos_keys") || joint_motion->mPositionCurve.mNumKeys < 0) { llwarns << "can't read number of position keys" << llendl; return FALSE; @@ -1516,7 +1533,8 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) if (old_version) { - if (!dp.unpackF32(pos_key.mTime, "time")) + if (!dp.unpackF32(pos_key.mTime, "time") || + !llfinite(pos_key.mTime)) { llwarns << "can't read position key (" << k << ")" << llendl; return FALSE; @@ -1585,9 +1603,9 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) return FALSE; } - if (num_constraints > MAX_CONSTRAINTS) + if (num_constraints > MAX_CONSTRAINTS || num_constraints < 0) { - llwarns << "Too many constraints... ignoring" << llendl; + llwarns << "Bad number of constraints... ignoring: " << num_constraints << llendl; } else { @@ -1632,7 +1650,7 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) constraintp->mConstraintType = (EConstraintType)byte; const S32 BIN_DATA_LENGTH = 16; - U8 bin_data[BIN_DATA_LENGTH]; + U8 bin_data[BIN_DATA_LENGTH+1]; if (!dp.unpackBinaryDataFixed(bin_data, BIN_DATA_LENGTH, "source_volume")) { llwarns << "can't read source volume name" << llendl; @@ -1640,7 +1658,7 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) return FALSE; } - bin_data[BIN_DATA_LENGTH-1] = 0; // Ensure null termination + bin_data[BIN_DATA_LENGTH] = 0; // Ensure null termination str = (char*)bin_data; constraintp->mSourceConstraintVolume = mCharacter->getCollisionVolumeID(str); @@ -1665,7 +1683,7 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) return FALSE; } - bin_data[BIN_DATA_LENGTH-1] = 0; // Ensure null termination + bin_data[BIN_DATA_LENGTH] = 0; // Ensure null termination str = (char*)bin_data; if (str == "GROUND") { @@ -1712,28 +1730,28 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) // constraintp->mTargetConstraintDir *= constraintp->mSourceConstraintOffset.magVec(); } - if (!dp.unpackF32(constraintp->mEaseInStartTime, "ease_in_start")) + if (!dp.unpackF32(constraintp->mEaseInStartTime, "ease_in_start") || !llfinite(constraintp->mEaseInStartTime)) { llwarns << "can't read constraint ease in start time" << llendl; delete constraintp; return FALSE; } - if (!dp.unpackF32(constraintp->mEaseInStopTime, "ease_in_stop")) + if (!dp.unpackF32(constraintp->mEaseInStopTime, "ease_in_stop") || !llfinite(constraintp->mEaseInStopTime)) { llwarns << "can't read constraint ease in stop time" << llendl; delete constraintp; return FALSE; } - if (!dp.unpackF32(constraintp->mEaseOutStartTime, "ease_out_start")) + if (!dp.unpackF32(constraintp->mEaseOutStartTime, "ease_out_start") || !llfinite(constraintp->mEaseOutStartTime)) { llwarns << "can't read constraint ease out start time" << llendl; delete constraintp; return FALSE; } - if (!dp.unpackF32(constraintp->mEaseOutStopTime, "ease_out_stop")) + if (!dp.unpackF32(constraintp->mEaseOutStopTime, "ease_out_stop") || !llfinite(constraintp->mEaseOutStopTime)) { llwarns << "can't read constraint ease out stop time" << llendl; delete constraintp; @@ -1742,7 +1760,7 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) mJointMotionList->mConstraints.push_front(constraintp); - constraintp->mJointStateIndices = new S32[constraintp->mChainLength + 1]; + constraintp->mJointStateIndices = new S32[constraintp->mChainLength + 1]; // note: mChainLength is size-limited - comes from a byte LLJoint* joint = mCharacter->findCollisionVolume(constraintp->mSourceConstraintVolume); // get joint to which this collision volume is attached diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp index 7330b00bcf..dca4cf7c3f 100644 --- a/indra/llcommon/llapr.cpp +++ b/indra/llcommon/llapr.cpp @@ -417,7 +417,11 @@ apr_pool_t* LLAPRFile::getAPRFilePool(apr_pool_t* pool) // File I/O S32 LLAPRFile::read(void *buf, S32 nbytes) { - llassert_always(mFile) ; + if(!mFile) + { + llwarns << "apr mFile is removed by somebody else. Can not read." << llendl ; + return 0; + } apr_size_t sz = nbytes; apr_status_t s = apr_file_read(mFile, buf, &sz); @@ -435,7 +439,11 @@ S32 LLAPRFile::read(void *buf, S32 nbytes) S32 LLAPRFile::write(const void *buf, S32 nbytes) { - llassert_always(mFile) ; + if(!mFile) + { + llwarns << "apr mFile is removed by somebody else. Can not write." << llendl ; + return 0; + } apr_size_t sz = nbytes; apr_status_t s = apr_file_write(mFile, buf, &sz); diff --git a/indra/llcommon/lldate.cpp b/indra/llcommon/lldate.cpp index a7ef28b431..04583cdd4a 100644 --- a/indra/llcommon/lldate.cpp +++ b/indra/llcommon/lldate.cpp @@ -121,7 +121,12 @@ std::string LLDate::toHTTPDateString (tm * gmt, std::string fmt) // use strftime() as it appears to be faster than std::time_put char buffer[128]; strftime(buffer, 128, fmt.c_str(), gmt); - return std::string(buffer); + std::string res(buffer); +#if LL_WINDOWS + // Convert from locale-dependant charset to UTF-8 (EXT-8524). + res = ll_convert_string_to_utf8_string(res); +#endif + return res; } void LLDate::toStream(std::ostream& s) const diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index 2693c0e22b..faf7aa51f1 100644 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -758,6 +758,7 @@ void LLStringOps::setupDatetimeInfo (bool daylight) datetimeToCodes["month"] = "%B"; // August datetimeToCodes["mthnum"] = "%m"; // 08 datetimeToCodes["day"] = "%d"; // 31 + datetimeToCodes["sday"] = "%-d"; // 9 datetimeToCodes["hour24"] = "%H"; // 14 datetimeToCodes["hour"] = "%H"; // 14 datetimeToCodes["hour12"] = "%I"; // 02 @@ -1127,6 +1128,11 @@ bool LLStringUtil::formatDatetime(std::string& replacement, std::string token, replacement = LLStringOps::sDayFormat; LLStringUtil::format(replacement, args); } + else if (code == "%-d") + { + struct tm * gmt = gmtime (&loc_seconds); + replacement = llformat ("%d", gmt->tm_mday); // day of the month without leading zero + } else if( !LLStringOps::sAM.empty() && !LLStringOps::sPM.empty() && code == "%p" ) { struct tm * gmt = gmtime (&loc_seconds); diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index 6e341b83a1..c430a60ff0 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -35,7 +35,7 @@ const S32 LL_VERSION_MAJOR = 2; const S32 LL_VERSION_MINOR = 1; -const S32 LL_VERSION_PATCH = 0; +const S32 LL_VERSION_PATCH = 1; const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Developer"; diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 0fc5ca1ad6..1566389e30 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -1553,6 +1553,7 @@ void LLImageFormatted::appendData(U8 *data, S32 size) S32 newsize = cursize + size; reallocateData(newsize); memcpy(getData() + cursize, data, size); + delete[] data; } } } diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 12007f7b52..46a7215707 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -58,6 +58,7 @@ #include "llbutton.h" #include "llfontgl.h" #include "llresmgr.h" +#include "lltrans.h" #include "llui.h" #include "llstl.h" @@ -2272,8 +2273,9 @@ void LLMenuGL::createSpilloverBranch() // technically, you can't tear off spillover menus, but we're passing the handle // along just to be safe LLMenuGL::Params p; + std::string label = LLTrans::getString("More"); p.name("More"); - p.label("More"); // *TODO: Translate + p.label(label); p.bg_color(mBackgroundColor); p.bg_visible(true); p.can_tear_off(false); @@ -2282,7 +2284,7 @@ void LLMenuGL::createSpilloverBranch() LLMenuItemBranchGL::Params branch_params; branch_params.name = "More"; - branch_params.label = "More"; // *TODO: Translate + branch_params.label = label; branch_params.branch = mSpilloverMenu; branch_params.font.style = "italic"; diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 9ab2cfef4b..d356f061f9 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -135,6 +135,7 @@ LLScrollListCtrl::Params::Params() search_column("search_column", 0), sort_column("sort_column", -1), sort_ascending("sort_ascending", true), + mouse_wheel_opaque("mouse_wheel_opaque", false), commit_on_keyboard_movement("commit_on_keyboard_movement", true), heading_height("heading_height"), page_lines("page_lines", 0), @@ -163,6 +164,7 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p) : LLUICtrl(p), mLineHeight(0), mScrollLines(0), + mMouseWheelOpaque(p.mouse_wheel_opaque), mPageLines(p.page_lines), mMaxSelectable(0), mAllowKeyboardMovement(TRUE), @@ -1520,6 +1522,12 @@ BOOL LLScrollListCtrl::handleScrollWheel(S32 x, S32 y, S32 clicks) BOOL handled = FALSE; // Pretend the mouse is over the scrollbar handled = mScrollbar->handleScrollWheel( 0, 0, clicks ); + + if (mMouseWheelOpaque) + { + return TRUE; + } + return handled; } diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index 1f0ef585db..19cb7e2bfe 100644 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -102,7 +102,8 @@ public: { // behavioral flags Optional<bool> multi_select, - commit_on_keyboard_movement; + commit_on_keyboard_movement, + mouse_wheel_opaque; // display flags Optional<bool> has_border, @@ -449,6 +450,7 @@ private: BOOL mCommitOnSelectionChange; BOOL mSelectionChanged; BOOL mNeedsScroll; + BOOL mMouseWheelOpaque; BOOL mCanSelect; const BOOL mDisplayColumnHeaders; BOOL mColumnsDirty; diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index ff330f863a..c91e225fd2 100644 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -101,6 +101,7 @@ LLUICtrl::LLUICtrl(const LLUICtrl::Params& p, const LLViewModelPtr& viewmodel) : LLView(p), mTentative(FALSE), mIsChrome(FALSE), + mTabStop(FALSE), mViewModel(viewmodel), mControlVariable(NULL), mEnabledControlVariable(NULL), diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index bbf3f4fc75..3326319e2d 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -5373,17 +5373,6 @@ <key>Value</key> <integer>0</integer> </map> - <key>MultipleAttachments</key> - <map> - <key>Comment</key> - <string>Allow multiple objects to be attached to a single attachment point.</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> <key>MuteAmbient</key> <map> <key>Comment</key> @@ -6436,6 +6425,17 @@ <key>Value</key> <real>1.0</real> </map> + <key>MediaBrowserWindowLimit</key> + <map> + <key>Comment</key> + <string>Maximum number of media brower windows that can be open at once (0 for no limit)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>5</integer> + </map> <key>MediaRollOffRate</key> <map> <key>Comment</key> diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 6ee5a8b279..337878cf96 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -388,7 +388,9 @@ void LLAgentWearables::saveWearable(const LLWearableType::EType type, const U32 const std::string new_name) { LLWearable* old_wearable = getWearable(type, index); - if (old_wearable && (old_wearable->isDirty() || old_wearable->isOldVersion())) + if(!old_wearable) return; + bool name_changed = !new_name.empty() && (new_name != old_wearable->getName()); + if (name_changed || old_wearable->isDirty() || old_wearable->isOldVersion()) { LLUUID old_item_id = old_wearable->getItemID(); LLWearable* new_wearable = LLWearableList::instance().createCopy(old_wearable); @@ -404,12 +406,10 @@ void LLAgentWearables::saveWearable(const LLWearableType::EType type, const U32 if (item) { std::string item_name = item->getName(); - bool name_changed = false; - if (!new_name.empty() && (new_name != item->getName())) + if (name_changed) { llinfos << "saveWearable changing name from " << item->getName() << " to " << new_name << llendl; item_name = new_name; - name_changed = true; } // Update existing inventory item LLPointer<LLViewerInventoryItem> template_item = @@ -1885,10 +1885,7 @@ void LLAgentWearables::userAttachMultipleAttachments(LLInventoryModel::item_arra msg->nextBlockFast(_PREHASH_ObjectData ); msg->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID()); msg->addUUIDFast(_PREHASH_OwnerID, item->getPermissions().getOwner()); - if (gSavedSettings.getBOOL("MultipleAttachments")) - msg->addU8Fast(_PREHASH_AttachmentPt, 0 | ATTACHMENT_ADD ); - else - msg->addU8Fast(_PREHASH_AttachmentPt, 0 ); // Wear at the previous or default attachment point + msg->addU8Fast(_PREHASH_AttachmentPt, 0 ); // Wear at the previous or default attachment point pack_permissions_slam(msg, item->getFlags(), item->getPermissions()); msg->addStringFast(_PREHASH_Name, item->getName()); msg->addStringFast(_PREHASH_Description, item->getDescription()); diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 63315ce2ae..cecb2ee6ad 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1012,7 +1012,7 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up addCOFItemLink(item_to_wear, do_update, cb); break; case LLAssetType::AT_OBJECT: - rez_attachment(item_to_wear, NULL); + rez_attachment(item_to_wear, NULL, replace); break; default: return false;; } @@ -1275,6 +1275,11 @@ bool LLAppearanceMgr::getCanRemoveFromCOF(const LLUUID& outfit_cat_id) // static bool LLAppearanceMgr::getCanAddToCOF(const LLUUID& outfit_cat_id) { + if (gAgentWearables.isCOFChangeInProgress()) + { + return false; + } + LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; LLFindWearablesEx not_worn(/*is_worn=*/ false, /*include_body_parts=*/ false); @@ -1286,6 +1291,32 @@ bool LLAppearanceMgr::getCanAddToCOF(const LLUUID& outfit_cat_id) return items.size() > 0; } +bool LLAppearanceMgr::getCanReplaceCOF(const LLUUID& outfit_cat_id) +{ + // Don't allow wearing anything while we're changing appearance. + if (gAgentWearables.isCOFChangeInProgress()) + { + return false; + } + + // Check whether it's the base outfit. + if (outfit_cat_id.isNull() || outfit_cat_id == getBaseOutfitUUID()) + { + return false; + } + + // Check whether the outfit contains any non-worn wearables. + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLFindWearablesEx not_worn(/*is_worn=*/ false, /*include_body_parts=*/ true); + gInventory.collectDescendentsIf(outfit_cat_id, + cats, + items, + LLInventoryModel::EXCLUDE_TRASH, + not_worn); + return items.size() > 0; +} + void LLAppearanceMgr::purgeBaseOutfitLink(const LLUUID& category) { LLInventoryModel::cat_array_t cats; diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 9f554dbdef..eb495bd274 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -84,6 +84,9 @@ public: // Determine whether we can add anything (but body parts) from the outfit contents to COF. static bool getCanAddToCOF(const LLUUID& outfit_cat_id); + // Determine whether we can replace current outfit with the given one. + bool getCanReplaceCOF(const LLUUID& outfit_cat_id); + // Copy all items in a category. void shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id, LLPointer<LLInventoryCallback> cb); diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index 6648bd7e57..29ead762d7 100644 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -163,7 +163,7 @@ public: } protected: - static void replaceWearable() + static void replaceWearable(const LLUUID& item_id) { // *TODO: Most probable that accessing to LLPanelOutfitEdit instance should be: // LLSideTray::getInstance()->getSidepanelAppearance()->getPanelOutfitEdit() @@ -175,7 +175,7 @@ protected: "panel_outfit_edit")); if (panel_outfit_edit != NULL) { - panel_outfit_edit->showAddWearablesPanel(true); + panel_outfit_edit->onReplaceMenuItemClicked(item_id); } } @@ -187,7 +187,7 @@ protected: functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1); registrar.add("Clothing.TakeOff", boost::bind(handleMultiple, take_off, mUUIDs)); - registrar.add("Clothing.Replace", boost::bind(replaceWearable)); + registrar.add("Clothing.Replace", boost::bind(replaceWearable, selected_id)); registrar.add("Clothing.Edit", boost::bind(LLAgentWearables::editWearable, selected_id)); registrar.add("Clothing.Create", boost::bind(&CofClothingContextMenu::createNew, this, selected_id)); @@ -244,7 +244,7 @@ protected: // *HACK* need to pass pointer to LLPanelOutfitEdit instead of LLSideTray::getInstance()->getPanel(). // LLSideTray::getInstance()->getPanel() is rather slow variant LLPanelOutfitEdit* panel_oe = dynamic_cast<LLPanelOutfitEdit*>(LLSideTray::getInstance()->getPanel("panel_outfit_edit")); - registrar.add("BodyPart.Replace", boost::bind(&LLPanelOutfitEdit::onReplaceBodyPartMenuItemClicked, panel_oe, selected_id)); + registrar.add("BodyPart.Replace", boost::bind(&LLPanelOutfitEdit::onReplaceMenuItemClicked, panel_oe, selected_id)); registrar.add("BodyPart.Edit", boost::bind(LLAgentWearables::editWearable, selected_id)); registrar.add("BodyPart.Create", boost::bind(&CofBodyPartContextMenu::createNew, this, selected_id)); @@ -396,7 +396,11 @@ void LLCOFWearables::refresh() return; } - if (mCOFVersion == catp->getVersion()) return; + // BAP - this check has to be removed because an item name change does not + // change cat version - ie, checking version is not a complete way + // of finding out whether anything has changed in this category. + //if (mCOFVersion == catp->getVersion()) return; + mCOFVersion = catp->getVersion(); typedef std::vector<LLSD> values_vector_t; diff --git a/indra/newview/llfloatermediabrowser.cpp b/indra/newview/llfloatermediabrowser.cpp index 268a0e0b93..90147ff650 100644 --- a/indra/newview/llfloatermediabrowser.cpp +++ b/indra/newview/llfloatermediabrowser.cpp @@ -76,8 +76,32 @@ void LLFloaterMediaBrowser::create(const std::string &url, const std::string& ta tag = id.asString(); } - // TODO: Figure out whether we need to close an existing instance and/or warn the user about the number of instances they have open + S32 browser_window_limit = gSavedSettings.getS32("MediaBrowserWindowLimit"); + if(LLFloaterReg::findInstance("media_browser", tag) != NULL) + { + // There's already a media browser for this tag, so we won't be opening a new window. + } + else if(browser_window_limit != 0) + { + // showInstance will open a new window. Figure out how many media browsers are already open, + // and close the least recently opened one if this will put us over the limit. + + LLFloaterReg::const_instance_list_t &instances = LLFloaterReg::getFloaterList("media_browser"); + lldebugs << "total instance count is " << instances.size() << llendl; + + for(LLFloaterReg::const_instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); iter++) + { + lldebugs << " " << (*iter)->getKey() << llendl; + } + + if(instances.size() >= (size_t)browser_window_limit) + { + // Destroy the least recently opened instance + (*instances.begin())->closeFloater(); + } + } + LLFloaterMediaBrowser *browser = dynamic_cast<LLFloaterMediaBrowser*> (LLFloaterReg::showInstance("media_browser", tag)); llassert(browser); if(browser) diff --git a/indra/newview/llfloatermediabrowser.h b/indra/newview/llfloatermediabrowser.h index 1645ed4613..4255d814c0 100644 --- a/indra/newview/llfloatermediabrowser.h +++ b/indra/newview/llfloatermediabrowser.h @@ -45,6 +45,7 @@ class LLFloaterMediaBrowser : public LLViewerMediaObserver { public: + LOG_CLASS(LLFloaterMediaBrowser); LLFloaterMediaBrowser(const LLSD& key); static void create(const std::string &url, const std::string& target); diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index d3d52e20f7..49d80a0249 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -184,7 +184,6 @@ LLFolderView::LLFolderView(const Params& p) mSourceID(p.task_id), mRenameItem( NULL ), mNeedsScroll( FALSE ), - mEnableScroll( true ), mUseLabelSuffix(p.use_label_suffix), mPinningSelectedItem(FALSE), mNeedsAutoSelect( FALSE ), @@ -562,7 +561,9 @@ void LLFolderView::addToSelectionList(LLFolderViewItem* item) void LLFolderView::removeFromSelectionList(LLFolderViewItem* item) { - if (mSelectedItems.size()) + // If items are filtered while background fetch is in progress + // scrollbar resets to the first filtered item. See EXT-3981. + if (!LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() && mSelectedItems.size()) { mSelectedItems.back()->setIsCurSelection(FALSE); } @@ -1980,7 +1981,7 @@ void LLFolderView::deleteAllChildren() void LLFolderView::scrollToShowSelection() { - if (mEnableScroll && mSelectedItems.size()) + if (mSelectedItems.size()) { mNeedsScroll = TRUE; } diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index f1d39a41ae..a7763e8eeb 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -274,7 +274,6 @@ public: void dumpSelectionInformation(); virtual S32 notify(const LLSD& info) ; - void setEnableScroll(bool enable_scroll) { mEnableScroll = enable_scroll; } bool useLabelSuffix() { return mUseLabelSuffix; } private: @@ -309,7 +308,6 @@ protected: LLLineEditor* mRenamer; BOOL mNeedsScroll; - bool mEnableScroll; BOOL mPinningSelectedItem; LLRect mScrollConstraintRect; BOOL mNeedsAutoSelect; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 38f3521b2d..7e710ce8e1 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -3936,7 +3936,7 @@ void LLObjectBridge::performAction(LLInventoryModel* model, std::string action) item = (LLViewerInventoryItem*)gInventory.getItem(object_id); if(item && gInventory.isObjectDescendentOf(object_id, gInventory.getRootFolderID())) { - rez_attachment(item, NULL); + rez_attachment(item, NULL, true); // Replace if "Wear"ing. } else if(item && item->isFinished()) { @@ -3952,6 +3952,10 @@ void LLObjectBridge::performAction(LLInventoryModel* model, std::string action) } gFocusMgr.setKeyboardFocus(NULL); } + else if ("wear_add" == action) + { + LLAppearanceMgr::instance().wearItemOnAvatar(mUUID, true, false); // Don't replace if adding. + } else if (isRemoveAction(action)) { LLInventoryItem* item = gInventory.getItem(mUUID); @@ -3998,7 +4002,7 @@ std::string LLObjectBridge::getLabelSuffix() const } } -void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment) +void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment, bool replace) { LLSD payload; payload["item_id"] = item->getLinkedUUID(); // Wear the base object in case this is a link. @@ -4017,9 +4021,14 @@ void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attach } } + if (!replace) + { + attach_pt |= ATTACHMENT_ADD; + } + payload["attachment_point"] = attach_pt; - if (!gSavedSettings.getBOOL("MultipleAttachments") && + if (replace && (attachment && attachment->getNumObjects() > 0)) { LLNotificationsUtil::add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez); @@ -4048,8 +4057,6 @@ bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& respon if (itemp) { U8 attachment_pt = notification["payload"]["attachment_point"].asInteger(); - if (gSavedSettings.getBOOL("MultipleAttachments")) - attachment_pt |= ATTACHMENT_ADD; LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_RezSingleAttachmentFromInv); @@ -4106,6 +4113,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { items.push_back(std::string("Wearable And Object Separator")); items.push_back(std::string("Wearable And Object Wear")); + items.push_back(std::string("Wearable Add")); items.push_back(std::string("Attach To")); items.push_back(std::string("Attach To HUD")); // commented out for DEV-32347 @@ -4114,6 +4122,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) if (!gAgentAvatarp->canAttachMoreObjects()) { disabled_items.push_back(std::string("Wearable And Object Wear")); + disabled_items.push_back(std::string("Wearable Add")); disabled_items.push_back(std::string("Attach To")); disabled_items.push_back(std::string("Attach To HUD")); } diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 91055eb906..00e8b0fb08 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -594,7 +594,8 @@ public: }; void rez_attachment(LLViewerInventoryItem* item, - LLViewerJointAttachment* attachment); + LLViewerJointAttachment* attachment, + bool replace = false); // Move items from an in-world object's "Contents" folder to a specified // folder in agent inventory. diff --git a/indra/newview/llinventorylistitem.cpp b/indra/newview/llinventorylistitem.cpp index ea57d36c06..b1f5b3be2f 100644 --- a/indra/newview/llinventorylistitem.cpp +++ b/indra/newview/llinventorylistitem.cpp @@ -96,9 +96,12 @@ void LLPanelInventoryListItemBase::draw() if (mSeparatorVisible && mSeparatorImage) { - // stretch along bottom of listitem, using image height + // place under bottom of listitem, using image height + // item_pad in list using the item should be >= image height + // to avoid cropping of top of the next item. LLRect separator_rect = getLocalRect(); - separator_rect.mTop = mSeparatorImage->getHeight(); + separator_rect.mTop = separator_rect.mBottom; + separator_rect.mBottom -= mSeparatorImage->getHeight(); mSeparatorImage->draw(separator_rect); } diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index 5416f01033..54b8f3a8a4 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -708,7 +708,7 @@ void LLInventoryCategoriesObserver::changed(U32 mask) const S32 current_num_known_descendents = cats->count() + items->count(); - LLCategoryData cat_data = (*iter).second; + LLCategoryData& cat_data = (*iter).second; bool cat_changed = false; @@ -722,11 +722,17 @@ void LLInventoryCategoriesObserver::changed(U32 mask) } // If any item names have changed, update the name hash - LLMD5 item_name_hash = gInventory.hashDirectDescendentNames(cat_id); - if (cat_data.mItemNameHash != item_name_hash) + // Only need to check if (a) name hash has not previously been + // computed, or (b) a name has changed. + if (!cat_data.mIsNameHashInitialized || (mask & LLInventoryObserver::LABEL)) { - cat_data.mItemNameHash = item_name_hash; - cat_changed = true; + LLMD5 item_name_hash = gInventory.hashDirectDescendentNames(cat_id); + if (cat_data.mItemNameHash != item_name_hash) + { + cat_data.mIsNameHashInitialized = true; + cat_data.mItemNameHash = item_name_hash; + cat_changed = true; + } } // If anything has changed above, fire the callback. @@ -773,7 +779,8 @@ bool LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t if (can_be_added) { - mCategoryMap.insert(category_map_value_t(cat_id, LLCategoryData(cb, version, current_num_known_descendents))); + mCategoryMap.insert(category_map_value_t( + cat_id,LLCategoryData(cat_id, cb, version, current_num_known_descendents))); } return can_be_added; @@ -783,3 +790,15 @@ void LLInventoryCategoriesObserver::removeCategory(const LLUUID& cat_id) { mCategoryMap.erase(cat_id); } + +LLInventoryCategoriesObserver::LLCategoryData::LLCategoryData( + const LLUUID& cat_id, callback_t cb, S32 version, S32 num_descendents) + + : mCatID(cat_id) + , mCallback(cb) + , mVersion(version) + , mDescendentsCount(num_descendents) + , mIsNameHashInitialized(false) +{ + mItemNameHash.finalize(); +} diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h index ccd5fa5f4e..d535250970 100644 --- a/indra/newview/llinventoryobserver.h +++ b/indra/newview/llinventoryobserver.h @@ -295,18 +295,14 @@ public: protected: struct LLCategoryData { - LLCategoryData(callback_t cb, S32 version, S32 num_descendents) - : mCallback(cb) - , mVersion(version) - , mDescendentsCount(num_descendents) - { - mItemNameHash.finalize(); - } + LLCategoryData(const LLUUID& cat_id, callback_t cb, S32 version, S32 num_descendents); callback_t mCallback; S32 mVersion; S32 mDescendentsCount; LLMD5 mItemNameHash; + bool mIsNameHashInitialized; + LLUUID mCatID; }; typedef std::map<LLUUID, LLCategoryData> category_map_t; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index ac92f41624..770bc02b40 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -175,6 +175,9 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params) setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER)); } mFolderRoot->setSortOrder(getFilter()->getSortOrder()); + + // Initialize base class params. + LLPanel::initFromParams(params); } LLInventoryPanel::~LLInventoryPanel() @@ -706,21 +709,6 @@ BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, return handled; } -// virtual -void LLInventoryPanel::onMouseEnter(S32 x, S32 y, MASK mask) -{ - LLPanel::onMouseEnter(x, y, mask); - // don't auto-scroll a list when cursor is over Inventory. See EXT-3981. - mFolderRoot->setEnableScroll(false); -} - -// virtual -void LLInventoryPanel::onMouseLeave(S32 x, S32 y, MASK mask) -{ - LLPanel::onMouseLeave(x, y, mask); - mFolderRoot->setEnableScroll(true); -} - void LLInventoryPanel::onFocusLost() { // inventory no longer handles cut/copy/paste/delete diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index c9e317f816..4db995b0c4 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -121,10 +121,6 @@ public: void* cargo_data, EAcceptance* accept, std::string& tooltip_msg); - - void onMouseEnter(S32 x, S32 y, MASK mask); - void onMouseLeave(S32 x, S32 y, MASK mask); - // LLUICtrl methods /*virtual*/ void onFocusLost(); /*virtual*/ void onFocusReceived(); diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp index 1de9d1c9b0..075f0ba3ec 100755 --- a/indra/newview/llmediadataclient.cpp +++ b/indra/newview/llmediadataclient.cpp @@ -263,15 +263,15 @@ void LLMediaDataClient::pushBack(request_ptr_t request) void LLMediaDataClient::trackRequest(request_ptr_t request) { - request_set_t::iterator iter = mUnQueuedRequests.lower_bound(request); + request_set_t::iterator iter = mUnQueuedRequests.find(request); - if(*iter == request) + if(iter != mUnQueuedRequests.end()) { LL_WARNS("LLMediaDataClient") << "Tracking already tracked request: " << *request << LL_ENDL; } else { - mUnQueuedRequests.insert(iter, request); + mUnQueuedRequests.insert(request); } } @@ -279,7 +279,7 @@ void LLMediaDataClient::stopTrackingRequest(request_ptr_t request) { request_set_t::iterator iter = mUnQueuedRequests.find(request); - if(*iter == request) + if (iter != mUnQueuedRequests.end()) { mUnQueuedRequests.erase(iter); } diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 8147a97317..f921bca623 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -275,11 +275,10 @@ protected: } else if ("wear_replace" == param) { - return !gAgentWearables.isCOFChangeInProgress(); + return LLAppearanceMgr::instance().getCanReplaceCOF(outfit_cat_id); } else if ("wear_add" == param) { - if (gAgentWearables.isCOFChangeInProgress()) return false; return LLAppearanceMgr::getCanAddToCOF(outfit_cat_id); } else if ("take_off" == param) @@ -676,7 +675,7 @@ bool LLOutfitsList::isActionEnabled(const LLSD& userdata) } // outfit selected - return LLAppearanceMgr::getCanAddToCOF(mSelectedOutfitUUID); + return LLAppearanceMgr::instance().getCanReplaceCOF(mSelectedOutfitUUID); } if (command_name == "take_off") { @@ -689,11 +688,6 @@ bool LLOutfitsList::isActionEnabled(const LLSD& userdata) if (command_name == "wear_add") { // *TODO: do we ever get here? - if (gAgentWearables.isCOFChangeInProgress()) - { - return false; - } - return LLAppearanceMgr::getCanAddToCOF(mSelectedOutfitUUID); } diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index c7ac4af14c..0464aa377e 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -773,11 +773,11 @@ void LLPanelOutfitEdit::onAddWearableClicked(void) } } -void LLPanelOutfitEdit::onReplaceBodyPartMenuItemClicked(LLUUID selected_item_id) +void LLPanelOutfitEdit::onReplaceMenuItemClicked(LLUUID selected_item_id) { LLViewerInventoryItem* item = gInventory.getLinkedItem(selected_item_id); - if (item && item->getType() == LLAssetType::AT_BODYPART) + if (item) { showFilteredWearablesListView(item->getWearableType()); } @@ -1032,7 +1032,7 @@ void LLPanelOutfitEdit::filterWearablesBySelectedItem(void) applyListViewFilter(LVIT_BODYPART); break; case LLAssetType::AT_CLOTHING: - default: + default: applyListViewFilter(LVIT_CLOTHING); break; } @@ -1321,6 +1321,13 @@ void LLPanelOutfitEdit::getSelectedItemsUUID(uuid_vec_t& uuid_list) void LLPanelOutfitEdit::onCOFChanged() { + //the panel is only updated when is visible to a user + + // BAP - this check has to be removed because otherwise item name + // changes made when the panel is not visible will not be + // propagated to the panel. + // if (!isInVisibleChain()) return; + update(); } @@ -1348,8 +1355,6 @@ void LLPanelOutfitEdit::saveListSelection() if(!selected_ids.size()) return; - mWearableItemsList->resetSelection(); - for (std::set<LLUUID>::const_iterator item_id = selected_ids.begin(); item_id != selected_ids.end(); ++item_id) { mWearableItemsList->selectItemByUUID(*item_id, true); diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index 0b6926b83e..871ed8d7ec 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -165,7 +165,7 @@ public: void onRemoveFromOutfitClicked(void); void onEditWearableClicked(void); void onAddWearableClicked(void); - void onReplaceBodyPartMenuItemClicked(LLUUID selected_item_id); + void onReplaceMenuItemClicked(LLUUID selected_item_id); void onShopButtonClicked(); void displayCurrentOutfit(); diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 81e805974f..583b41aa57 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -985,6 +985,13 @@ void LLPanelPrimMediaControls::onClickZoom() void LLPanelPrimMediaControls::nextZoomLevel() { + LLViewerObject* objectp = getTargetObject(); + if(objectp && objectp->isHUDAttachment()) + { + // Never allow zooming on HUD attachments. + return; + } + int index = 0; while (index < kNumZoomLevels) { diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 050b87bbe0..21f8485e90 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -3615,7 +3615,7 @@ void LLSelectMgr::selectionSetObjectSaleInfo(const LLSaleInfo& sale_info) // Attachments //---------------------------------------------------------------------- -void LLSelectMgr::sendAttach(U8 attachment_point) +void LLSelectMgr::sendAttach(U8 attachment_point, bool replace) { LLViewerObject* attach_object = mSelectedObjects->getFirstRootObject(); @@ -3629,9 +3629,12 @@ void LLSelectMgr::sendAttach(U8 attachment_point) if (0 == attachment_point || get_if_there(gAgentAvatarp->mAttachmentPoints, (S32)attachment_point, (LLViewerJointAttachment*)NULL)) { - - if (gSavedSettings.getBOOL("MultipleAttachments")) + if (!replace || attachment_point != 0) + { + // If we know the attachment point then we got here by clicking an + // "Attach to..." context menu item, so we should add, not replace. attachment_point |= ATTACHMENT_ADD; + } sendListToRegions( "ObjectAttach", diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 668c04cf15..4c64c77b83 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -612,7 +612,7 @@ public: // verification only, if it doesn't match region info then sale is // canceled void sendBuy(const LLUUID& buyer_id, const LLUUID& category_id, const LLSaleInfo sale_info); - void sendAttach(U8 attachment_point); + void sendAttach(U8 attachment_point, bool replace); void sendDetach(); void sendDropAttachment(); void sendLink(); diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp index f4f8241b99..1feb987682 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/newview/lltexlayer.cpp @@ -542,8 +542,7 @@ void LLTexLayerSetBuffer::doUpload() args["TIME"] = llformat("%d",(U32)mNeedsUploadTimer.getElapsedTimeF32()); args["BODYREGION"] = mTexLayerSet->getBodyRegionName(); args["RESOLUTION"] = lod_str; - args["ACTION"] = "uploaded"; - LLNotificationsUtil::add("AvatarRezSelfBakeNotification",args); + LLNotificationsUtil::add("AvatarRezSelfBakedTextureUploadNotification",args); llinfos << "Uploading [ name: " << mTexLayerSet->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUploadTimer.getElapsedTimeF32() << " ]" << llendl; } } @@ -593,8 +592,7 @@ void LLTexLayerSetBuffer::doUpdate() args["TIME"] = llformat("%d",(U32)mNeedsUpdateTimer.getElapsedTimeF32()); args["BODYREGION"] = mTexLayerSet->getBodyRegionName(); args["RESOLUTION"] = lod_str; - args["ACTION"] = "locally updated"; - LLNotificationsUtil::add("AvatarRezSelfBakeNotification",args); + LLNotificationsUtil::add("AvatarRezSelfBakedTextureUpdateNotification",args); llinfos << "Locally updating [ name: " << mTexLayerSet->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUpdateTimer.getElapsedTimeF32() << " ]" << llendl; } } diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 403692951f..952f893015 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -998,7 +998,11 @@ LLAPRFile* LLTextureCache::openHeaderEntriesFile(bool readonly, S32 offset) void LLTextureCache::closeHeaderEntriesFile() { - llassert_always(mHeaderAPRFile != NULL); + if(!mHeaderAPRFile) + { + return ; + } + delete mHeaderAPRFile; mHeaderAPRFile = NULL; } @@ -1115,7 +1119,7 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create } //mHeaderMutex is locked before calling this. -void LLTextureCache::writeEntryToHeaderImmediately(S32 idx, Entry& entry, bool write_header) +void LLTextureCache::writeEntryToHeaderImmediately(S32& idx, Entry& entry, bool write_header) { LLAPRFile* aprfile ; S32 bytes_written ; @@ -1124,7 +1128,13 @@ void LLTextureCache::writeEntryToHeaderImmediately(S32 idx, Entry& entry, bool w { aprfile = openHeaderEntriesFile(false, 0); bytes_written = aprfile->write((U8*)&mHeaderEntriesInfo, sizeof(EntriesInfo)) ; - llassert_always(bytes_written == sizeof(EntriesInfo)); + if(bytes_written != sizeof(EntriesInfo)) + { + clearCorruptedCache() ; //clear the cache. + idx = -1 ;//mark the idx invalid. + return ; + } + mHeaderAPRFile->seek(APR_SET, offset); } else @@ -1132,19 +1142,31 @@ void LLTextureCache::writeEntryToHeaderImmediately(S32 idx, Entry& entry, bool w aprfile = openHeaderEntriesFile(false, offset); } bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry)); - llassert_always(bytes_written == sizeof(Entry)); + if(bytes_written != sizeof(Entry)) + { + clearCorruptedCache() ; //clear the cache. + idx = -1 ;//mark the idx invalid. + + return ; + } + closeHeaderEntriesFile(); mUpdatedEntryMap.erase(idx) ; } //mHeaderMutex is locked before calling this. -void LLTextureCache::readEntryFromHeaderImmediately(S32 idx, Entry& entry) +void LLTextureCache::readEntryFromHeaderImmediately(S32& idx, Entry& entry) { S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry); LLAPRFile* aprfile = openHeaderEntriesFile(true, offset); S32 bytes_read = aprfile->read((void*)&entry, (S32)sizeof(Entry)); - llassert_always(bytes_read == sizeof(Entry)); closeHeaderEntriesFile(); + + if(bytes_read != sizeof(Entry)) + { + clearCorruptedCache() ; //clear the cache. + idx = -1 ;//mark the idx invalid. + } } //mHeaderMutex is locked before calling this. @@ -1169,7 +1191,7 @@ void LLTextureCache::updateEntryTimeStamp(S32 idx, Entry& entry) } //update an existing entry, write to header file immediately. -bool LLTextureCache::updateEntry(S32 idx, Entry& entry, S32 new_image_size, S32 new_data_size) +bool LLTextureCache::updateEntry(S32& idx, Entry& entry, S32 new_image_size, S32 new_data_size) { S32 new_body_size = llmax(0, new_data_size - TEXTURE_CACHE_ENTRY_SIZE) ; @@ -1240,6 +1262,10 @@ U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries) { aprfile = openHeaderEntriesFile(false, 0); updatedHeaderEntriesFile() ; + if(!aprfile) + { + return 0; + } aprfile->seek(APR_SET, (S32)sizeof(EntriesInfo)); } for (U32 idx=0; idx<num_entries; idx++) @@ -1281,7 +1307,11 @@ void LLTextureCache::writeEntriesAndClose(const std::vector<Entry>& entries) for (S32 idx=0; idx<num_entries; idx++) { S32 bytes_written = aprfile->write((void*)(&entries[idx]), (S32)sizeof(Entry)); - llassert_always(bytes_written == sizeof(Entry)); + if(bytes_written != sizeof(Entry)) + { + clearCorruptedCache() ; //clear the cache. + return ; + } } closeHeaderEntriesFile(); } @@ -1307,7 +1337,11 @@ void LLTextureCache::updatedHeaderEntriesFile() //entriesInfo mHeaderAPRFile->seek(APR_SET, 0); S32 bytes_written = mHeaderAPRFile->write((U8*)&mHeaderEntriesInfo, sizeof(EntriesInfo)) ; - llassert_always(bytes_written == sizeof(EntriesInfo)); + if(bytes_written != sizeof(EntriesInfo)) + { + clearCorruptedCache() ; //clear the cache. + return ; + } //write each updated entry S32 entry_size = (S32)sizeof(Entry) ; @@ -1323,7 +1357,11 @@ void LLTextureCache::updatedHeaderEntriesFile() } bytes_written = mHeaderAPRFile->write((void*)(&iter->second), entry_size); - llassert_always(bytes_written == entry_size); + if(bytes_written != entry_size) + { + clearCorruptedCache() ; //clear the cache. + return ; + } } mUpdatedEntryMap.clear() ; } @@ -1444,6 +1482,29 @@ void LLTextureCache::readHeaderCache() ////////////////////////////////////////////////////////////////////////////// +//the header mutex is locked before calling this. +void LLTextureCache::clearCorruptedCache() +{ + llwarns << "the texture cache is corrupted, need to be cleared." << llendl ; + + closeHeaderEntriesFile();//close possible file handler + purgeAllTextures(false) ; //clear the cache. + + if (!mReadOnly) //regenerate the directory tree if not exists. + { + LLFile::mkdir(mTexturesDirName); + + const char* subdirs = "0123456789abcdef"; + for (S32 i=0; i<16; i++) + { + std::string dirname = mTexturesDirName + gDirUtilp->getDirDelimiter() + subdirs[i]; + LLFile::mkdir(dirname); + } + } + + return ; +} + void LLTextureCache::purgeAllTextures(bool purge_directories) { if (!mReadOnly) @@ -1472,11 +1533,14 @@ void LLTextureCache::purgeAllTextures(bool purge_directories) mTexturesSizeTotal = 0; mFreeList.clear(); mTexturesSizeTotal = 0; + mUpdatedEntryMap.clear(); // Info with 0 entries mHeaderEntriesInfo.mVersion = sHeaderCacheVersion; mHeaderEntriesInfo.mEntries = 0; writeEntriesHeader(); + + llinfos << "The entire texture cache is cleared." << llendl ; } void LLTextureCache::purgeTextures(bool validate) @@ -1644,7 +1708,8 @@ S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, Entry& entry, S32 imag { updateEntry(idx, entry, imagesize, datasize); } - else // retry + + if(idx < 0) // retry { readHeaderCache(); // We couldn't write an entry, so refresh the LRU diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h index 0fceee3011..f80be0056b 100644 --- a/indra/newview/lltexturecache.h +++ b/indra/newview/lltexturecache.h @@ -154,6 +154,7 @@ protected: private: void setDirNames(ELLPath location); void readHeaderCache(); + void clearCorruptedCache(); void purgeAllTextures(bool purge_directories); void purgeTextures(bool validate); LLAPRFile* openHeaderEntriesFile(bool readonly, S32 offset); @@ -161,12 +162,12 @@ private: void readEntriesHeader(); void writeEntriesHeader(); S32 openAndReadEntry(const LLUUID& id, Entry& entry, bool create); - bool updateEntry(S32 idx, Entry& entry, S32 new_image_size, S32 new_body_size); + bool updateEntry(S32& idx, Entry& entry, S32 new_image_size, S32 new_body_size); void updateEntryTimeStamp(S32 idx, Entry& entry) ; U32 openAndReadEntries(std::vector<Entry>& entries); void writeEntriesAndClose(const std::vector<Entry>& entries); - void readEntryFromHeaderImmediately(S32 idx, Entry& entry) ; - void writeEntryToHeaderImmediately(S32 idx, Entry& entry, bool write_header = false) ; + void readEntryFromHeaderImmediately(S32& idx, Entry& entry) ; + void writeEntryToHeaderImmediately(S32& idx, Entry& entry, bool write_header = false) ; void removeEntry(S32 idx, Entry& entry, std::string& filename); void removeCachedTexture(const LLUUID& id) ; S32 getHeaderCacheEntry(const LLUUID& id, Entry& entry); diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index dddfed097d..65a40a5b3a 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -850,15 +850,14 @@ bool LLTextureFetchWorker::doWork(S32 param) { if(mCanUseHTTP) { - const S32 HTTP_QUEUE_MAX_SIZE = 8; // *TODO: Integrate this with llviewerthrottle // Note: LLViewerThrottle uses dynamic throttling which makes sense for UDP, // but probably not for Textures. // Set the throttle to the entire bandwidth, assuming UDP packets will get priority // when they are needed F32 max_bandwidth = mFetcher->mMaxBandwidth; - if ((mFetcher->getHTTPQueueSize() >= HTTP_QUEUE_MAX_SIZE) || - (mFetcher->getTextureBandwidth() > max_bandwidth)) + if (mFetcher->isHTTPThrottled(mDesiredSize) || + mFetcher->getTextureBandwidth() > max_bandwidth) { // Make normal priority and return (i.e. wait until there is room in the queue) setPriority(LLWorkerThread::PRIORITY_NORMAL | mWorkPriority); @@ -1250,7 +1249,7 @@ bool LLTextureFetchWorker::deleteOK() if ((haveWork() && // not ok to delete from these states - ((mState >= SEND_HTTP_REQ && mState <= WAIT_HTTP_REQ) || + ((mState == WAIT_HTTP_REQ) || (mState >= WRITE_TO_CACHE && mState <= WAIT_ON_WRITE)))) { delete_ok = false; @@ -1511,6 +1510,11 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image { mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS"); mTextureInfo.setUpLogging(gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog"), gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"), gSavedSettings.getU32("TextureLoggingThreshold")); + + for(S32 i = 0 ; i < TOTAL_TEXTURE_TYPES; i++) + { + mHTTPThrottleFlag[i] = FALSE ; + } } LLTextureFetch::~LLTextureFetch() @@ -1658,6 +1662,65 @@ void LLTextureFetch::removeFromHTTPQueue(const LLUUID& id) mHTTPTextureQueue.erase(id); } +void LLTextureFetch::clearHTTPThrottleFlag() +{ + static const F32 WAIT_TIME = 0.3f ; //seconds. + static LLFrameTimer timer ; + + if(timer.getElapsedTimeF32() < WAIT_TIME) //wait for WAIT_TIME + { + return ; + } + timer.reset() ; + + LLMutexLock lock(&mNetworkQueueMutex); + for(S32 i = 0 ; i < TOTAL_TEXTURE_TYPES; i++)//reset the http throttle flags. + { + mHTTPThrottleFlag[i] = FALSE ; + } +} + +//check if need to throttle this fetching request. +//rule: if a request can not be inserted into the http queue due to a full queue, +// block all future insertions of requests with larger fetching size requirement. +//because: +// later insertions are usually at lower priorities; and +// small textures need chance to be fetched. +bool LLTextureFetch::isHTTPThrottled(S32 requested_size) +{ + static const S32 SMALL_TEXTURE_MAX_SIZE = 64 * 64 * 4 ; + static const S32 MEDIUM_TEXTURE_MAX_SIZE = 256 * 256 * 4 ; + static const U32 MAX_HTTP_QUEUE_SIZE = 8 ; + + //determine the class of the texture: SMALL, MEDIUM, or LARGE. + S32 type = LARGE_TEXTURE ; + if(requested_size <= SMALL_TEXTURE_MAX_SIZE) + { + type = SMALL_TEXTURE ; + } + else if(requested_size <= MEDIUM_TEXTURE_MAX_SIZE) + { + type = MEDIUM_TEXTURE ; + } + + LLMutexLock lock(&mNetworkQueueMutex); + + if(mHTTPTextureQueue.size() >= MAX_HTTP_QUEUE_SIZE)//if the http queue is full. + { + if(!mHTTPThrottleFlag[type + 1]) + { + for(S32 i = type + 1 ; i < TOTAL_TEXTURE_TYPES; i++) //block all requests with fetching size larger than this request. + { + mHTTPThrottleFlag[i] = TRUE ; + } + } + + return true ; + } + + return mHTTPThrottleFlag[type] ; //true if this request can not be inserted to the http queue. +} + void LLTextureFetch::deleteRequest(const LLUUID& id, bool cancel) { lockQueue() ; @@ -1824,7 +1887,8 @@ S32 LLTextureFetch::update(U32 max_time_ms) lldebugs << "processed: " << processed << " messages." << llendl; } } - + clearHTTPThrottleFlag(); + return res; } diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h index 634e590fe0..c31c38b04a 100644 --- a/indra/newview/lltexturefetch.h +++ b/indra/newview/lltexturefetch.h @@ -95,7 +95,8 @@ protected: void removeFromNetworkQueue(LLTextureFetchWorker* worker, bool cancel); void addToHTTPQueue(const LLUUID& id); void removeFromHTTPQueue(const LLUUID& id); - S32 getHTTPQueueSize() { return getNumHTTPRequests(); } + bool isHTTPThrottled(S32 requested_size); + void clearHTTPThrottleFlag(); void removeRequest(LLTextureFetchWorker* worker, bool cancel); // Called from worker thread (during doWork) void processCurlRequests(); @@ -134,6 +135,16 @@ private: F32 mTextureBandwidth; F32 mMaxBandwidth; LLTextureInfo mTextureInfo; + + enum + { + SMALL_TEXTURE = 0 , //size <= 64 * 64 + MEDIUM_TEXTURE, //size <= 256 * 256 + LARGE_TEXTURE, //size > 256 * 256 + DUMMY, + TOTAL_TEXTURE_TYPES + }; + BOOL mHTTPThrottleFlag[TOTAL_TEXTURE_TYPES]; }; #endif // LL_LLTEXTUREFETCH_H diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index f9e7191b21..cf1dd639e1 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -1270,7 +1270,6 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick) if (!parcel || objectp.isNull() || - objectp->isHUDAttachment() || pick.mObjectFace < 0 || pick.mObjectFace >= objectp->getNumTEs()) { diff --git a/indra/newview/llviewerattachmenu.cpp b/indra/newview/llviewerattachmenu.cpp index f683bd8674..5b3c4ea773 100644 --- a/indra/newview/llviewerattachmenu.cpp +++ b/indra/newview/llviewerattachmenu.cpp @@ -122,7 +122,7 @@ void LLViewerAttachMenu::attachObjects(const uuid_vec_t& items, const std::strin LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getLinkedItem(id); if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID())) { - rez_attachment(item, attachmentp); + rez_attachment(item, attachmentp); // don't replace if called from an "Attach To..." menu } else if(item && item->isFinished()) { diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 7a17bfeb46..d89ee13b95 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -3072,20 +3072,25 @@ void LLViewerMediaImpl::calculateInterest() // Calculate distance from the avatar, for use in the proximity calculation. mProximityDistance = 0.0f; + mProximityCamera = 0.0f; if(!mObjectList.empty()) { // Just use the first object in the list. We could go through the list and find the closest object, but this should work well enough. std::list< LLVOVolume* >::iterator iter = mObjectList.begin() ; LLVOVolume* objp = *iter ; llassert_always(objp != NULL) ; + + // The distance calculation is invalid for HUD attachments -- leave both mProximityDistance and mProximityCamera at 0 for them. + if(!objp->isHUDAttachment()) + { + LLVector3d obj_global = objp->getPositionGlobal() ; + LLVector3d agent_global = gAgent.getPositionGlobal() ; + LLVector3d global_delta = agent_global - obj_global ; + mProximityDistance = global_delta.magVecSquared(); // use distance-squared because it's cheaper and sorts the same. - LLVector3d obj_global = objp->getPositionGlobal() ; - LLVector3d agent_global = gAgent.getPositionGlobal() ; - LLVector3d global_delta = agent_global - obj_global ; - mProximityDistance = global_delta.magVecSquared(); // use distance-squared because it's cheaper and sorts the same. - - LLVector3d camera_delta = gAgentCamera.getCameraPositionGlobal() - obj_global; - mProximityCamera = camera_delta.magVec(); + LLVector3d camera_delta = gAgentCamera.getCameraPositionGlobal() - obj_global; + mProximityCamera = camera_delta.magVec(); + } } if(mNeedsMuteCheck) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index a83980dc23..92195f0a4d 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -5852,6 +5852,7 @@ void handle_buy_land() class LLObjectAttachToAvatar : public view_listener_t { public: + LLObjectAttachToAvatar(bool replace) : mReplace(replace) {} static void setObjectSelection(LLObjectSelectionHandle selection) { sObjectSelection = selection; } private: @@ -5865,22 +5866,38 @@ private: LLViewerJointAttachment* attachment_point = NULL; if (index > 0) attachment_point = get_if_there(gAgentAvatarp->mAttachmentPoints, index, (LLViewerJointAttachment*)NULL); - confirm_replace_attachment(0, attachment_point); + confirmReplaceAttachment(0, attachment_point); } return true; } + static void onNearAttachObject(BOOL success, void *user_data); + void confirmReplaceAttachment(S32 option, LLViewerJointAttachment* attachment_point); + + struct CallbackData + { + CallbackData(LLViewerJointAttachment* point, bool replace) : mAttachmentPoint(point), mReplace(replace) {} + + LLViewerJointAttachment* mAttachmentPoint; + bool mReplace; + }; + protected: static LLObjectSelectionHandle sObjectSelection; + bool mReplace; }; LLObjectSelectionHandle LLObjectAttachToAvatar::sObjectSelection; -void near_attach_object(BOOL success, void *user_data) +// static +void LLObjectAttachToAvatar::onNearAttachObject(BOOL success, void *user_data) { + if (!user_data) return; + CallbackData* cb_data = static_cast<CallbackData*>(user_data); + if (success) { - const LLViewerJointAttachment *attachment = (LLViewerJointAttachment *)user_data; + const LLViewerJointAttachment *attachment = cb_data->mAttachmentPoint; U8 attachment_id = 0; if (attachment) @@ -5900,12 +5917,15 @@ void near_attach_object(BOOL success, void *user_data) // interpret 0 as "default location" attachment_id = 0; } - LLSelectMgr::getInstance()->sendAttach(attachment_id); + LLSelectMgr::getInstance()->sendAttach(attachment_id, cb_data->mReplace); } LLObjectAttachToAvatar::setObjectSelection(NULL); + + delete cb_data; } -void confirm_replace_attachment(S32 option, void* user_data) +// static +void LLObjectAttachToAvatar::confirmReplaceAttachment(S32 option, LLViewerJointAttachment* attachment_point) { if (option == 0/*YES*/) { @@ -5930,7 +5950,8 @@ void confirm_replace_attachment(S32 option, void* user_data) delta = delta * 0.5f; walkToSpot -= delta; - gAgent.startAutoPilotGlobal(gAgent.getPosGlobalFromAgent(walkToSpot), "Attach", NULL, near_attach_object, user_data, stop_distance); + CallbackData* user_data = new CallbackData(attachment_point, mReplace); // *TODO: leak if the callback isn't called? + gAgent.startAutoPilotGlobal(gAgent.getPosGlobalFromAgent(walkToSpot), "Attach", NULL, onNearAttachObject, user_data, stop_distance); gAgentCamera.clearFocusObject(); } } @@ -8115,7 +8136,8 @@ void initialize_menus() commit.add("Object.Touch", boost::bind(&handle_object_touch)); commit.add("Object.SitOrStand", boost::bind(&handle_object_sit_or_stand)); commit.add("Object.Delete", boost::bind(&handle_object_delete)); - view_listener_t::addMenu(new LLObjectAttachToAvatar(), "Object.AttachToAvatar"); + view_listener_t::addMenu(new LLObjectAttachToAvatar(true), "Object.AttachToAvatar"); + view_listener_t::addMenu(new LLObjectAttachToAvatar(false), "Object.AttachAddToAvatar"); view_listener_t::addMenu(new LLObjectReturn(), "Object.Return"); view_listener_t::addMenu(new LLObjectReportAbuse(), "Object.ReportAbuse"); view_listener_t::addMenu(new LLObjectMute(), "Object.Mute"); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 004d138221..82fef1d916 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -79,6 +79,8 @@ // format changes. JC const U32 INDRA_OBJECT_CACHE_VERSION = 14; +// Format string used to construct filename for the object cache +static const char OBJECT_CACHE_FILENAME[] = "objects_%d_%d.slc"; extern BOOL gNoRender; @@ -323,13 +325,25 @@ LLViewerRegion::~LLViewerRegion() delete mEventPoll; LLHTTPSender::clearSender(mHost); - saveCache(); + saveObjectCache(); std::for_each(mObjectPartition.begin(), mObjectPartition.end(), DeletePointer()); } -void LLViewerRegion::loadCache() +const std::string LLViewerRegion::getObjectCacheFilename(U64 mHandle) const +{ + std::string filename; + U32 region_x, region_y; + + grid_from_region_handle(mHandle, ®ion_x, ®ion_y); + filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, + llformat(OBJECT_CACHE_FILENAME, region_x, region_y)); + + return filename; +} + +void LLViewerRegion::loadObjectCache() { if (mCacheLoaded) { @@ -341,9 +355,8 @@ void LLViewerRegion::loadCache() LLVOCacheEntry *entry; - std::string filename; - filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"") + gDirUtilp->getDirDelimiter() + - llformat("objects_%d_%d.slc",U32(mHandle>>32)/REGION_WIDTH_UNITS, U32(mHandle)/REGION_WIDTH_UNITS ); + std::string filename = getObjectCacheFilename(mHandle); + LL_DEBUGS("ObjectCache") << filename << LL_ENDL; LLFILE* fp = LLFile::fopen(filename, "rb"); /* Flawfinder: ignore */ if (!fp) @@ -414,7 +427,7 @@ void LLViewerRegion::loadCache() } -void LLViewerRegion::saveCache() +void LLViewerRegion::saveObjectCache() { if (!mCacheLoaded) { @@ -427,9 +440,8 @@ void LLViewerRegion::saveCache() return; } - std::string filename; - filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"") + gDirUtilp->getDirDelimiter() + - llformat("objects_%d_%d.slc", U32(mHandle>>32)/REGION_WIDTH_UNITS, U32(mHandle)/REGION_WIDTH_UNITS ); + std::string filename = getObjectCacheFilename(mHandle); + LL_DEBUGS("ObjectCache") << filename << LL_ENDL; LLFILE* fp = LLFile::fopen(filename, "wb"); /* Flawfinder: ignore */ if (!fp) @@ -1454,7 +1466,7 @@ void LLViewerRegion::unpackRegionHandshake() // Now that we have the name, we can load the cache file // off disk. - loadCache(); + loadObjectCache(); // After loading cache, signal that simulator can start // sending data. diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index a9e7ef771c..8254cf1cad 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -99,9 +99,8 @@ public: ~LLViewerRegion(); // Call this after you have the region name and handle. - void loadCache(); - - void saveCache(); + void loadObjectCache(); + void saveObjectCache(); void sendMessage(); // Send the current message to this region's simulator void sendReliableMessage(); // Send the current message to this region's simulator @@ -330,6 +329,9 @@ public: LLDynamicArray<LLUUID> mMapAvatarIDs; private: + // determine the cache filename for the region from the region handle + const std::string getObjectCacheFilename(U64 mHandle) const; + // The surfaces and other layers LLSurface* mLandp; @@ -404,7 +406,7 @@ private: // Cache ID is unique per-region, across renames, moving locations, // etc. LLUUID mCacheID; - + typedef std::map<std::string, std::string> CapabilityMap; CapabilityMap mCapabilities; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 6e1a9c61e6..298ac28ca8 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3133,14 +3133,16 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) if (motionp->getName().empty()) { output = llformat("%s - %d", - motionp->getID().asString().c_str(), - (U32)motionp->getPriority()); + gAgent.isGodlikeWithoutAdminMenuFakery() ? + motionp->getID().asString().c_str() : + LLUUID::null.asString().c_str(), + (U32)motionp->getPriority()); } else { output = llformat("%s - %d", - motionp->getName().c_str(), - (U32)motionp->getPriority()); + motionp->getName().c_str(), + (U32)motionp->getPriority()); } addDebugText(output); } diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index c9130b56b4..194213f880 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -863,12 +863,13 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu } // for bool standalone = mParent ? mParent->isStandalone() : false; + bool wear_add_visible = mask & (MASK_CLOTHING|MASK_ATTACHMENT) && n_worn == 0 && can_be_worn && (n_already_worn != 0 || mask & MASK_ATTACHMENT); // *TODO: eliminate multiple traversals over the menu items setMenuItemVisible(menu, "wear_wear", n_already_worn == 0 && n_worn == 0 && can_be_worn); setMenuItemEnabled(menu, "wear_wear", n_already_worn == 0 && n_worn == 0); - setMenuItemVisible(menu, "wear_add", mask == MASK_CLOTHING && n_worn == 0 && n_already_worn != 0 && can_be_worn); - setMenuItemEnabled(menu, "wear_add", n_items == 1 && canAddWearable(ids.front()) && n_already_worn != 0); + setMenuItemVisible(menu, "wear_add", wear_add_visible); + setMenuItemEnabled(menu, "wear_add", n_items == 1 && canAddWearable(ids.front())); setMenuItemVisible(menu, "wear_replace", n_worn == 0 && n_already_worn != 0 && can_be_worn); //visible only when one item selected and this item is worn setMenuItemVisible(menu, "edit", !standalone && mask & (MASK_CLOTHING|MASK_BODYPART) && n_worn == n_items && n_worn == 1); @@ -984,7 +985,18 @@ bool LLWearableItemsList::ContextMenu::canAddWearable(const LLUUID& item_id) // TODO: investigate wearables may not be loaded at this point EXT-8231 LLViewerInventoryItem* item = gInventory.getItem(item_id); - if (!item || item->getType() != LLAssetType::AT_CLOTHING) + if (!item) + { + return false; + } + + if (item->getType() == LLAssetType::AT_OBJECT) + { + // *TODO: is this the right check? + return isAgentAvatarValid() && gAgentAvatarp->canAttachMoreObjects(); + } + + if (item->getType() != LLAssetType::AT_CLOTHING) { return false; } diff --git a/indra/newview/skins/default/xui/da/language_settings.xml b/indra/newview/skins/default/xui/da/language_settings.xml index fa8a788605..3e46f69af1 100644 --- a/indra/newview/skins/default/xui/da/language_settings.xml +++ b/indra/newview/skins/default/xui/da/language_settings.xml @@ -17,6 +17,7 @@ datetimeToCodes["month"] = "%B"; // August datetimeToCodes["mthnum"] = "%m"; // 08 datetimeToCodes["day"] = "%d"; // 31 + datetimeToCodes["sday"] = "%-d"; // 9 datetimeToCodes["hour24"] = "%H"; // 14 datetimeToCodes["hour"] = "%H"; // 14 datetimeToCodes["hour12"] = "%I"; // 02 diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml index 3a036fc441..c3c017ae97 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml @@ -42,7 +42,12 @@ <text name="library_label"> Bibliothek: </text> - <scroll_list name="library_list" width="166"/> + <scroll_list name="library_list" width="166"> + <scroll_list.rows name="action_animation" value="Animation"/> + <scroll_list.rows name="action_sound" value="Sound"/> + <scroll_list.rows name="action_chat" value="Chat"/> + <scroll_list.rows name="action_wait" value="Warten"/> + </scroll_list> <button label="Hinzufügen >>" left_pad="6" name="add_btn" width="94"/> <text name="steps_label"> Schritte: diff --git a/indra/newview/skins/default/xui/de/floater_world_map.xml b/indra/newview/skins/default/xui/de/floater_world_map.xml index f54d8c3328..befa46651a 100644 --- a/indra/newview/skins/default/xui/de/floater_world_map.xml +++ b/indra/newview/skins/default/xui/de/floater_world_map.xml @@ -22,12 +22,12 @@ <text name="land_sale_label"> Land-Verkauf </text> - <text name="by_owner_label"> - durch Besitzer - </text> <text name="auction_label"> Land-Auktion </text> + <text name="by_owner_label"> + durch Besitzer + </text> <button label="Nach Hause" label_selected="Nach Hause" name="Go Home" tool_tip="Nach Hause teleportieren"/> <text name="Home_label"> Zuhause @@ -39,7 +39,7 @@ <text name="pg_label"> Generell </text> - <check_box label="Mature" name="events_mature_chk"/> + <check_box initial_value="true" label="Mature" name="events_mature_chk"/> <text name="events_mature_label"> Moderat </text> @@ -67,6 +67,9 @@ <scroll_list.columns label="" name="icon"/> <scroll_list.columns label="" name="sim_name"/> </scroll_list> + <text name="events_label"> + Standort: + </text> <button label="Teleportieren" label_selected="Teleportieren" name="Teleport" tool_tip="Zu ausgewählter Position teleportieren"/> <button font="SansSerifSmall" label="SLurl kopieren" name="copy_slurl" tool_tip="Kopiert die aktuelle Position als SLurl zur Verwendung im Web."/> <button label="Auswahl anzeigen" label_selected="Ziel anzeigen" name="Show Destination" tool_tip="Karte auf ausgewählte Position zentrieren"/> diff --git a/indra/newview/skins/default/xui/de/language_settings.xml b/indra/newview/skins/default/xui/de/language_settings.xml index 3e357007ff..d54f548fe1 100644 --- a/indra/newview/skins/default/xui/de/language_settings.xml +++ b/indra/newview/skins/default/xui/de/language_settings.xml @@ -17,6 +17,7 @@ datetimeToCodes["month"] = "%B"; // August datetimeToCodes["mthnum"] = "%m"; // 08 datetimeToCodes["day"] = "%d"; // 31 + datetimeToCodes["sday"] = "%-d"; // 9 datetimeToCodes["hour24"] = "%H"; // 14 datetimeToCodes["hour"] = "%H"; // 14 datetimeToCodes["hour12"] = "%I"; // 02 diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index 45ae8a0c95..b9b6a8ed50 100644 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -94,6 +94,7 @@ <menu_item_call label="Skripts auf nicht ausführen einstellen" name="Set Scripts to Not Running"/> </menu> <menu label="Optionen" name="Options"> + <menu_item_call label="Hochlade-Berechtigungen (Standard) festlegen" name="perm prefs"/> <menu_item_check label="Erweiterte Berechtigungen anzeigen" name="DebugPermissions"/> <menu_item_check label="Nur meine Objekte auswählen" name="Select Only My Objects"/> <menu_item_check label="Nur bewegliche Objekte auswählen" name="Select Only Movable Objects"/> @@ -111,7 +112,6 @@ <menu_item_call label="Sound ([COST] L$)..." name="Upload Sound"/> <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/> <menu_item_call label="Mehrfach-Upload ([COST] L$ pro Datei)..." name="Bulk Upload"/> - <menu_item_call label="Hochlade-Berechtigungen (Standard) festlegen" name="perm prefs"/> </menu> </menu> <menu label="Hilfe" name="Help"> diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index 24582e4be3..e5baf0f98f 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -366,7 +366,7 @@ Sind Sie sicher, dass Sie fortfahren wollen? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> <notification name="DeleteOutfits"> - Das ausgewählte Outfit löschen? + Das/Die ausgewählte(n) Outfit(s) löschen? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> <notification name="PromptGoToEventsPage"> @@ -2765,7 +2765,7 @@ Avatar '[NAME]' hat als vollständig gerezzter Avatar die Welt verlass </notification> <notification name="AvatarRezSelfBakeNotification"> (Seit [EXISTENCE] Sekunden inworld ) -Die [RESOLUTION]-gebakene Textur für '[BODYREGION]' wurde in [TIME] Sekunden hochgeladen. +Die [RESOLUTION]-gebakene Textur für '[BODYREGION]' wurde in [TIME] Sekunden [ACTION]. </notification> <notification name="ConfirmLeaveCall"> Möchten Sie dieses Gespräch wirklich verlassen ? @@ -2803,4 +2803,7 @@ Sollte das Problem fortbestehen, finden Sie weitere Hilfestellung unter [SUPPORT Wenn Sie ein Stück Land besitzen, können Sie dies als Ihr Zuhause festlegen. Ansonsten können Sie auf der Karte nachsehen und dort Ort suchen, die als „Infohub“ gekennzeichnet sind. </global> + <global name="You died and have been teleported to your home location"> + Sie sind gestorben und wurden zu Ihrem Zuhause teleportiert. + </global> </notifications> diff --git a/indra/newview/skins/default/xui/de/panel_group_notices.xml b/indra/newview/skins/default/xui/de/panel_group_notices.xml index f45b5ea7af..8c1df04ed8 100644 --- a/indra/newview/skins/default/xui/de/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/de/panel_group_notices.xml @@ -21,7 +21,7 @@ Maximal 200 pro Gruppe täglich <text name="notice_list_none_found"> Nicht gefunden. </text> - <button label="Neue Mitteilung erstellen" label_selected="Neue Mitteilung" name="create_new_notice" tool_tip="Neue Mitteilung erstellen"/> + <button label="Neue Mitteilung" label_selected="Neue Mitteilung" name="create_new_notice" tool_tip="Neue Mitteilung erstellen"/> <button label="Aktualisieren" label_selected="Liste aktualisieren" name="refresh_notices" tool_tip="Mitteilungsliste aktualisieren"/> <panel label="Neue Mitteilung" name="panel_create_new_notice"> <text name="lbl"> diff --git a/indra/newview/skins/default/xui/de/panel_group_roles.xml b/indra/newview/skins/default/xui/de/panel_group_roles.xml index db5186e081..f297d32a91 100644 --- a/indra/newview/skins/default/xui/de/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/de/panel_group_roles.xml @@ -13,6 +13,9 @@ Drücken Sie die Strg-Taste und klicken Sie auf Namen, um mehrere Mitglieder auszuwählen. </panel.string> + <panel.string name="donation_area"> + [AREA] m². + </panel.string> <filter_editor label="Mitglieder filtern" name="filter_input"/> <name_list name="member_list"> <name_list.columns label="Mitglied" name="name" relative_width="0.30"/> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml index 44b2bd1f60..5c71b20fb0 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml @@ -11,8 +11,8 @@ <check_box label="Aktiviert" name="enable_media"/> <slider label="Voice-Chat" name="Voice Volume"/> <check_box label="Aktiviert" name="enable_voice_check"/> - <check_box label="Automatische Wiedergabe zulassen" name="media_auto_play_btn" tool_tip="Hier aktivieren, um Medien automatisch wiederzugeben."/> - <check_box label="Medien, die an andere Avatare angehängt sind, wiedergeben." name="media_show_on_others_btn" tool_tip="Diese Option deaktivieren, um Medien für andere Avataren, die sich in der Nähe befinden, auszublenden."/> + <check_box label="Automatische Wiedergabe zulassen" name="media_auto_play_btn" tool_tip="Hier aktivieren, um Medien automatisch wiederzugeben." value="true"/> + <check_box label="Medien, die an andere Avatare angehängt sind, wiedergeben." name="media_show_on_others_btn" tool_tip="Diese Option deaktivieren, um Medien für andere Avataren, die sich in der Nähe befinden, auszublenden." value="true"/> <text name="voice_chat_settings"> Voice-Chat-Einstellungen </text> @@ -28,6 +28,12 @@ <panel.string name="default_text"> Standard </panel.string> + <panel.string name="default system device"> + Standardgerät + </panel.string> + <panel.string name="no device"> + Kein Gerät + </panel.string> <text name="Input"> Eingabe </text> diff --git a/indra/newview/skins/default/xui/de/panel_teleport_history.xml b/indra/newview/skins/default/xui/de/panel_teleport_history.xml index 4efd83dfff..4d721f2af6 100644 --- a/indra/newview/skins/default/xui/de/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/de/panel_teleport_history.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="Teleport History"> <accordion name="history_accordion"> + <no_matched_tabs_text name="no_matched_teleports_msg" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/places/[SEARCH_TERM] Suche]."/> + <no_visible_tabs_text name="no_teleports_msg" value="Die Teleportliste ist leer. Versuchen Sie es mit der [secondlife:///app/search/all Suche]."/> <accordion_tab name="today" title="Heute"/> <accordion_tab name="yesterday" title="Gestern"/> <accordion_tab name="2_days_ago" title="Vor 2 Tagen"/> diff --git a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml index b9ca969ac5..4ba187dbd6 100644 --- a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml @@ -23,8 +23,7 @@ </panel.string> <text name="title" value="Objektprofil"/> <text name="origin" value="(Inventar)"/> - <panel label="" - name="item_profile"> + <panel label="" name="item_profile"> <text name="LabelItemNameTitle"> Name: </text> @@ -51,7 +50,7 @@ </text> <check_box label="Bearbeiten" name="CheckOwnerModify"/> <check_box label="Kopieren" name="CheckOwnerCopy"/> - <check_box label="Transferieren" name="CheckOwnerTransfer"/> + <check_box label="Übertragen" name="CheckOwnerTransfer"/> <text name="AnyoneLabel"> Jeder: </text> @@ -59,13 +58,13 @@ <text name="GroupLabel"> Gruppe: </text> - <check_box label="Teilen" name="CheckShareWithGroup" tool_tip="Mit allen Mitgliedern der zugeordneten Gruppe, Ihre Berechtigungen dieses Objekt zu ändern teilen. Sie müssen Übereignen, um Rollenbeschränkungen zu aktivieren."/> + <check_box label="Teilen" name="CheckShareWithGroup" tool_tip="Mit allen Mitgliedern der zugeordneten Gruppe, Ihre Berechtigungen dieses Objekt zu ändern, teilen. Sie müssen Übereignen, um Rollenbeschränkungen zu aktivieren."/> <text name="NextOwnerLabel"> Nächster Eigentümer: </text> <check_box label="Bearbeiten" name="CheckNextOwnerModify"/> <check_box label="Kopieren" name="CheckNextOwnerCopy"/> - <check_box label="Transferieren" name="CheckNextOwnerTransfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/> + <check_box label="Übertragen" name="CheckNextOwnerTransfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/> </panel> <check_box label="Zum Verkauf" name="CheckPurchase"/> <combo_box name="combobox sale copy"> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index abe03e1adb..bf7d2ef3b3 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -663,6 +663,9 @@ <string name="worldmap_offline"> Offline </string> + <string name="worldmap_item_tooltip_format"> + [PRICE] L$ für [AREA] m² + </string> <string name="worldmap_results_none_found"> Nicht gefunden. </string> @@ -1061,6 +1064,7 @@ <string name="AnimFlagStop" value=" Animation stoppen:"/> <string name="AnimFlagStart" value=" Animation starten:"/> <string name="Wave" value=" Winken"/> + <string name="GestureActionNone" value="Keine"/> <string name="HelloAvatar" value=" Hallo Avatar!"/> <string name="ViewAllGestures" value=" Alle anzeigen >>"/> <string name="GetMoreGestures" value="Mehr >>"/> @@ -1143,12 +1147,12 @@ <string name="InvFolder Favorite"> Favoriten </string> - <string name="InvFolder favorite"> - Favoriten - </string> <string name="InvFolder Current Outfit"> Aktuelles Outfit </string> + <string name="InvFolder Initial Outfits"> + Ursprüngliche Outfits + </string> <string name="InvFolder My Outfits"> Meine Outfits </string> @@ -1468,6 +1472,7 @@ <string name="SummaryForTheWeek" value="Zusammenfassung für diese Woche, beginnend am "/> <string name="NextStipendDay" value=". Der nächste Stipendium-Tag ist "/> <string name="GroupIndividualShare" value=" Gruppenanteil Einzelanteil"/> + <string name="GroupColumn" value="Gruppe"/> <string name="Balance"> Kontostand </string> @@ -1687,6 +1692,12 @@ <string name="BusyModeResponseDefault"> Der Einwohner/Die Einwohnerin ist „beschäftigt”, d.h. er/sie möchte im Moment nicht gestört werden. Ihre Nachricht wird dem Einwohner/der Einwohnerin als IM angezeigt, und kann später beantwortet werden. </string> + <string name="NoOutfits"> + Sie haben noch keine Outfits. Versuchen Sie es mit der [secondlife:///app/search/all Suche]. + </string> + <string name="NoOutfitsTabsMatched"> + Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/all/[SEARCH_TERM] Suche]. + </string> <string name="MuteByName"> (Nach Namen) </string> @@ -3676,6 +3687,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ <string name="group_role_owners"> Eigentümer </string> + <string name="group_member_status_online"> + Online + </string> <string name="uploading_abuse_report"> Bericht wird hochgeladen... @@ -3729,9 +3743,15 @@ Missbrauchsbericht <string name="Invalid Wearable"> Ungültiges Objekt </string> + <string name="New Gesture"> + Neue Geste + </string> <string name="New Script"> Neues Skript </string> + <string name="New Note"> + Neue Notiz + </string> <string name="New Folder"> Neuer Ordner </string> @@ -3789,6 +3809,15 @@ Missbrauchsbericht <string name="Male - Wow"> Männlich - Wow </string> + <string name="Female - Chuckle"> + Weiblich - Kichern + </string> + <string name="Female - Cry"> + Weiblich - Weinen + </string> + <string name="Female - Embarrassed"> + Weiblich - Verlegen + </string> <string name="Female - Excuse me"> Weiblich - Räuspern </string> @@ -3807,9 +3836,21 @@ Missbrauchsbericht <string name="Female - Hey"> Weiblich - Hey </string> + <string name="Female - Hey baby"> + Weiblich - Hey Süße(r) + </string> <string name="Female - Laugh"> Weiblich - Lachen </string> + <string name="Female - Looking good"> + Weiblich - Looking good + </string> + <string name="Female - Over here"> + Weiblich - Over here + </string> + <string name="Female - Please"> + Weiblich - Please + </string> <string name="Female - Repulsed"> Weiblich - Angewidert </string> @@ -3859,4 +3900,46 @@ Missbrauchsbericht <string name="dateTimePM"> Uhr </string> + <string name="LocalEstimateUSD"> + [AMOUNT] US$ + </string> + <string name="Membership"> + Mitgliedschaft + </string> + <string name="Roles"> + Rollen + </string> + <string name="Group Identity"> + Gruppenidentität + </string> + <string name="Parcel Management"> + Parzellenverwaltung + </string> + <string name="Parcel Identity"> + Parzellenidentität + </string> + <string name="Parcel Settings"> + Parzelleneinstellungen + </string> + <string name="Parcel Powers"> + Parzellenfähigkeiten + </string> + <string name="Parcel Access"> + Parzellenzugang + </string> + <string name="Parcel Content"> + Parzelleninhalt + </string> + <string name="Object Management"> + Objektmanagement + </string> + <string name="Accounting"> + Kontoführung + </string> + <string name="Notices"> + Mitteilungen + </string> + <string name="Chat"> + Chat + </string> </strings> diff --git a/indra/newview/skins/default/xui/en/language_settings.xml b/indra/newview/skins/default/xui/en/language_settings.xml index c523185034..c8a06fe401 100644 --- a/indra/newview/skins/default/xui/en/language_settings.xml +++ b/indra/newview/skins/default/xui/en/language_settings.xml @@ -23,6 +23,7 @@ datetimeToCodes["month"] = "%B"; // August datetimeToCodes["mthnum"] = "%m"; // 08 datetimeToCodes["day"] = "%d"; // 31 + datetimeToCodes["sday"] = "%-d"; // 9 datetimeToCodes["hour24"] = "%H"; // 14 datetimeToCodes["hour"] = "%H"; // 14 datetimeToCodes["hour12"] = "%I"; // 02 diff --git a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml index 8ec7689819..76f68c6d4b 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml @@ -89,6 +89,15 @@ function="Object.EnableWear" /> </menu_item_call> <menu_item_call + label="Add" + layout="topleft" + name="add"> + <menu_item_call.on_click + function="Object.AttachAddToAvatar" /> + <menu_item_call.on_visible + function="Object.EnableWear" /> + </menu_item_call> + <menu_item_call label="Report" layout="topleft" name="report"> diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml index b6cc222e96..31f70d99ca 100644 --- a/indra/newview/skins/default/xui/en/menu_object.xml +++ b/indra/newview/skins/default/xui/en/menu_object.xml @@ -83,6 +83,15 @@ <menu_item_call.on_enable function="Object.EnableWear" /> </menu_item_call> + <menu_item_call + enabled="false" + label="Add" + name="Add"> + <menu_item_call.on_click + function="Object.AttachAddToAvatar" /> + <menu_item_call.on_enable + function="Object.EnableWear" /> + </menu_item_call> <context_menu label="Attach ▶" name="Object Attach" /> diff --git a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml index c3adbb7904..5feac53c33 100644 --- a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml +++ b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml @@ -13,7 +13,7 @@ layout="topleft" name="wear_wear"> <on_click - function="Wearable.Add" /> + function="Wearable.Wear" /> </menu_item_call> <menu_item_call label="Add" @@ -59,7 +59,7 @@ function="Wearable.Edit" /> </menu_item_call> <menu_item_call - label="Object Profile" + label="Item Profile" layout="topleft" name="object_profile"> <on_click diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 962e3ac582..d7684e434e 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6340,10 +6340,18 @@ Avatar '[NAME]' left as fully loaded. <notification icon="notifytip.tga" - name="AvatarRezSelfBakeNotification" + name="AvatarRezSelfBakedTextureUploadNotification" type="notifytip"> ( [EXISTENCE] seconds alive ) -You [ACTION] a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME] seconds. +You uploaded a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME] seconds. + </notification> + + <notification + icon="notifytip.tga" + name="AvatarRezSelfBakedTextureUpdateNotification" + type="notifytip"> +( [EXISTENCE] seconds alive ) +You locally updated a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME] seconds. </notification> <notification diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 185e458a85..0499873fb0 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -156,6 +156,7 @@ width="135" visible="false" /> </layout_panel> <layout_panel +tab_stop="false" follows="right|bottom" name="links" width="200" diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index 2c9d7e4b6a..082d51ed3c 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -97,6 +97,8 @@ name="location_combo" top_delta="0" width="266"> + <combo_list + mouse_wheel_opaque="true"/> <!-- *TODO: Delete. Let the location_input use the correct art sizes. <location_input.add_landmark_button height="18" diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_list.xml b/indra/newview/skins/default/xui/en/widgets/scroll_list.xml index 63166f32b7..dd93675807 100644 --- a/indra/newview/skins/default/xui/en/widgets/scroll_list.xml +++ b/indra/newview/skins/default/xui/en/widgets/scroll_list.xml @@ -12,6 +12,7 @@ draw_stripes="true" scroll_bar_bg_visible="false" scroll_bar_bg_color="black" + mouse_wheel_opaque="false" background_visible="true" heading_height="23" draw_border="false" diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml index cf1b3bbbbd..c58eb227aa 100644 --- a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml @@ -42,7 +42,12 @@ <text name="library_label"> Biblioteca: </text> - <scroll_list name="library_list"/> + <scroll_list name="library_list"> + <scroll_list.rows name="action_animation" value="Animaciones"/> + <scroll_list.rows name="action_sound" value="Sonido"/> + <scroll_list.rows name="action_chat" value="Chat"/> + <scroll_list.rows name="action_wait" value="Espera"/> + </scroll_list> <button label="Añadir >>" name="add_btn"/> <text name="steps_label"> Pasos: diff --git a/indra/newview/skins/default/xui/es/floater_world_map.xml b/indra/newview/skins/default/xui/es/floater_world_map.xml index 3135324816..acc63e52a0 100644 --- a/indra/newview/skins/default/xui/es/floater_world_map.xml +++ b/indra/newview/skins/default/xui/es/floater_world_map.xml @@ -19,12 +19,12 @@ <text name="land_sale_label"> Venta de terreno </text> - <text name="by_owner_label"> - por el dueño - </text> <text name="auction_label"> subasta </text> + <text name="by_owner_label"> + por el dueño + </text> <button name="Go Home" tool_tip="Teleportar a mi Base"/> <text name="Home_label"> Base @@ -35,7 +35,7 @@ <text name="pg_label"> General </text> - <check_box name="events_mature_chk"/> + <check_box initial_value="true" name="events_mature_chk"/> <text name="events_mature_label"> Moderado </text> @@ -58,6 +58,9 @@ <search_editor label="Regiones alfabéticamente" name="location" tool_tip="Escribe el nombre de una región"/> <button label="Encontrar" name="DoSearch" tool_tip="Buscar una región"/> <button name="Clear" tool_tip="Limpia las marcas y actualiza el mapa"/> + <text name="events_label"> + Lugar: + </text> <button label="Teleportar" name="Teleport" tool_tip="Teleportar a la localización seleccionada"/> <button label="Copiar la SLurl" name="copy_slurl" tool_tip="Copiar la SLurl de esta posición para usarla en una web."/> <button label="Ver lo elegido" name="Show Destination" tool_tip="Centrar el mapa en la localización seleccionada"/> diff --git a/indra/newview/skins/default/xui/es/language_settings.xml b/indra/newview/skins/default/xui/es/language_settings.xml index 1ade4ba300..f172994077 100644 --- a/indra/newview/skins/default/xui/es/language_settings.xml +++ b/indra/newview/skins/default/xui/es/language_settings.xml @@ -17,6 +17,7 @@ datetimeToCodes["month"] = "%B"; // August datetimeToCodes["mthnum"] = "%m"; // 08 datetimeToCodes["day"] = "%d"; // 31 + datetimeToCodes["sday"] = "%-d"; // 9 datetimeToCodes["hour24"] = "%H"; // 14 datetimeToCodes["hour"] = "%H"; // 14 datetimeToCodes["hour12"] = "%I"; // 02 diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index f6ad18cf3a..66c0bf9311 100644 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -94,6 +94,7 @@ <menu_item_call label="Configurar scripts como no ejecutándose" name="Set Scripts to Not Running"/> </menu> <menu label="Opciones" name="Options"> + <menu_item_call label="Configurar los permisos por defecto de subida" name="perm prefs"/> <menu_item_check label="Mostrar los permisos avanzados" name="DebugPermissions"/> <menu_item_check label="Seleccionar sólo mis objetos" name="Select Only My Objects"/> <menu_item_check label="Seleccionar sólo los objetos movibles" name="Select Only Movable Objects"/> @@ -111,7 +112,6 @@ <menu_item_call label="Sonido ([COST] L$)..." name="Upload Sound"/> <menu_item_call label="Animación ([COST] L$)..." name="Upload Animation"/> <menu_item_call label="Masivo ([COST] L$ por archivo)..." name="Bulk Upload"/> - <menu_item_call label="Configurar los permisos por defecto de subida" name="perm prefs"/> </menu> </menu> <menu label="Ayuda" name="Help"> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 88013df8f5..e9eda790dd 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -2750,8 +2750,8 @@ Comprueba la configuración de la red y del servidor de seguridad. El avatar '[NAME]' ya estaba totalmente cargado al salir. </notification> <notification name="AvatarRezSelfBakeNotification"> - ( [EXISTENCE] segundos vivo) -Has cargado una textura obtenida mediante bake de [RESOLUTION] para '[BODYREGION]' después de [TIME] segundos. + ( [EXISTENCE] segundos con vida ) +Has [ACTION] una textura obtenida mediante bake de [RESOLUTION] para '[BODYREGION]' después de [TIME] segundos. </notification> <notification name="ConfirmLeaveCall"> ¿Estás seguro de que deseas salir de esta multiconferencia? @@ -2788,4 +2788,7 @@ Si los problemas persisten, por favor, acude a [SUPPORT_SITE]. Si posees un terreno, puedes hacerlo tu Base. También puedes buscar en el Mapa lugares marcados como "Puntos de Información". </global> + <global name="You died and have been teleported to your home location"> + Has muerto y te has teleportado a tu Base. + </global> </notifications> diff --git a/indra/newview/skins/default/xui/es/panel_group_notices.xml b/indra/newview/skins/default/xui/es/panel_group_notices.xml index 7a3dbad59e..1eaa69abff 100644 --- a/indra/newview/skins/default/xui/es/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/es/panel_group_notices.xml @@ -18,7 +18,7 @@ El máximo es de 200 por día y grupo. <text name="notice_list_none_found"> No se han encontrado </text> - <button label="Crear un aviso nuevo" label_selected="Crear un aviso nuevo" name="create_new_notice" tool_tip="Crear un aviso nuevo"/> + <button label="Nuevo aviso" label_selected="Crear un aviso nuevo" name="create_new_notice" tool_tip="Crear un aviso nuevo"/> <button label="Actualizar" label_selected="Actualizar la lista" name="refresh_notices" tool_tip="Actualizar la lista de avisos"/> <panel label="Crear un aviso nuevo" name="panel_create_new_notice"> <text name="lbl"> diff --git a/indra/newview/skins/default/xui/es/panel_group_roles.xml b/indra/newview/skins/default/xui/es/panel_group_roles.xml index 5ef81162bc..390b4e2e9d 100644 --- a/indra/newview/skins/default/xui/es/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/es/panel_group_roles.xml @@ -12,6 +12,9 @@ Puede añadir o quitar los roles asignados a los miembros. Seleccione varios nombres manteniendo pulsada la tecla Ctrl y pulsando en cada uno de ellos. </panel.string> + <panel.string name="donation_area"> + [AREA] m² + </panel.string> <filter_editor label="Filtrar los miembros" name="filter_input"/> <name_list name="member_list"> <name_list.columns label="Miembro" name="name"/> @@ -74,21 +77,15 @@ incluyendo el de Todos y el de Propietarios. <text name="static"> Nombre del rol </text> - <line_editor name="role_name"> - Empleados - </line_editor> + <line_editor name="role_name"/> <text name="static3"> Etiqueta del rol </text> - <line_editor name="role_title"> - (esperando) - </line_editor> + <line_editor name="role_title"/> <text name="static2"> Descripción </text> - <text_editor name="role_description"> - (esperando) - </text_editor> + <text_editor name="role_description"/> <text name="static4"> Roles asignados </text> @@ -103,9 +100,6 @@ incluyendo el de Todos y el de Propietarios. </scroll_list> </panel> <panel name="actions_footer"> - <text name="static"> - Descripción de la capacidad - </text> <text_editor name="action_description"> Esta capacidad es la de 'Expulsar miembros de este grupo'. Sólo un propietario puede expulsar a otro. </text_editor> diff --git a/indra/newview/skins/default/xui/es/panel_nearby_media.xml b/indra/newview/skins/default/xui/es/panel_nearby_media.xml index f03338e4c7..f65cae6e20 100644 --- a/indra/newview/skins/default/xui/es/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/es/panel_nearby_media.xml @@ -48,16 +48,16 @@ <button name="stop_btn" tool_tip="Parar los media seleccionados"/> </layout_panel> <layout_panel name="play"> - <button name="play_btn" tool_tip="Ejecutar los media"/> + <button name="play_btn" tool_tip="Ejecutar los media seleccionados"/> </layout_panel> <layout_panel name="pause"> - <button name="pause_btn" tool_tip="Pausa los media seleccionados"/> + <button name="pause_btn" tool_tip="Pausar los media seleccionados"/> </layout_panel> <layout_panel name="volume_slider_ctrl"> <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Volumen de los media seleccionados"/> </layout_panel> <layout_panel name="mute"> - <button name="mute_btn" tool_tip="Silencia los media seleccionados"/> + <button name="mute_btn" tool_tip="Silenciar el audio de los media seleccionados"/> </layout_panel> <layout_panel name="zoom"> <button name="zoom_btn" tool_tip="Zoom en los media seleccionados"/> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml index 2d3c76d215..b0088ee1a2 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Sonidos" name="Preference Media panel"> <slider label="Volumen general" name="System Volume"/> - <check_box label="Silenciar cuando minimice" name="mute_when_minimized"/> + <check_box initial_value="true" label="Silenciar cuando minimice" name="mute_when_minimized"/> <slider label="Botones" name="UI Volume"/> <slider label="Ambiental" name="Wind Volume"/> <slider label="Efectos de sonido" name="SFX Volume"/> @@ -11,8 +11,8 @@ <check_box label="Activada" name="enable_media"/> <slider label="Chat de voz" name="Voice Volume"/> <check_box label="Activado" name="enable_voice_check"/> - <check_box label="Permitir la ejecución automática de los media" name="media_auto_play_btn" tool_tip="Marcar esto para permitir la ejecución automática de los media"/> - <check_box label="Ejecutar para otros avatares los media anexados" name="media_show_on_others_btn" tool_tip="Al desmarcar esto se esconderán los media anexados a otros avatares cercanos"/> + <check_box label="Permitir la ejecución automática de los media" name="media_auto_play_btn" tool_tip="Marcar esto para permitir la ejecución automática de los media" value="true"/> + <check_box label="Ejecutar para otros avatares los media anexados" name="media_show_on_others_btn" tool_tip="Al desmarcar esto se esconderán los media anexados a otros avatares cercanos" value="true"/> <text name="voice_chat_settings"> Configuración del chat de voz </text> @@ -28,6 +28,12 @@ <panel.string name="default_text"> Por defecto </panel.string> + <panel.string name="default system device"> + Dispositivo del sistema por defecto + </panel.string> + <panel.string name="no device"> + Ningún dispositivo + </panel.string> <text name="Input"> Entrada </text> diff --git a/indra/newview/skins/default/xui/es/panel_teleport_history.xml b/indra/newview/skins/default/xui/es/panel_teleport_history.xml index a0ee30e8f6..364451b26b 100644 --- a/indra/newview/skins/default/xui/es/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/es/panel_teleport_history.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="Teleport History"> <accordion name="history_accordion"> + <no_matched_tabs_text name="no_matched_teleports_msg" value="¿No encuentras lo que buscas? Intenta con [secondlife:///app/search/places/[SEARCH_TERM] Buscar]."/> + <no_visible_tabs_text name="no_teleports_msg" value="El historial de teleportes está vacío. Intenta con [secondlife:///app/search/places/ Buscar]."/> <accordion_tab name="today" title="Hoy"/> <accordion_tab name="yesterday" title="Ayer"/> <accordion_tab name="2_days_ago" title="Hace 2 días"/> - 5 <accordion_tab name="3_days_ago" title="Hace 3 días"/> <accordion_tab name="4_days_ago" title="Hace 4 días"/> <accordion_tab name="5_days_ago" title="Hace 5 días"/> diff --git a/indra/newview/skins/default/xui/es/sidepanel_item_info.xml b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml index d3b91e7a71..0cea46afba 100644 --- a/indra/newview/skins/default/xui/es/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml @@ -23,8 +23,7 @@ </panel.string> <text name="title" value="Perfil del elemento"/> <text name="origin" value="(Inventario)"/> - <panel label="" - name="item_profile"> + <panel label="" name="item_profile"> <text name="LabelItemNameTitle"> Nombre: </text> @@ -48,22 +47,22 @@ Tú puedes: </text> <check_box label="Modificar" name="CheckOwnerModify"/> - <check_box label="Copiarlo" name="CheckOwnerCopy"/> - <check_box label="Transferirlo" name="CheckOwnerTransfer"/> + <check_box label="Copiar" name="CheckOwnerCopy"/> + <check_box label="Transferir" name="CheckOwnerTransfer"/> <text name="AnyoneLabel"> Cualquiera: </text> - <check_box label="Copiarlo" name="CheckEveryoneCopy"/> + <check_box label="Copiar" name="CheckEveryoneCopy"/> <text name="GroupLabel"> Grupo: </text> - <check_box label="Compartir" name="CheckShareWithGroup" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación en este objeto. Debes transferirlo para activar las restricciones según los roles."/> + <check_box label="Compartir" name="CheckShareWithGroup" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación de este objeto. Debes transferirlo para activar las restricciones según los roles."/> <text name="NextOwnerLabel"> Próximo propietario: </text> - <check_box label="Modificarlo" name="CheckNextOwnerModify"/> - <check_box label="Copiarlo" name="CheckNextOwnerCopy"/> - <check_box label="Transferirlo" name="CheckNextOwnerTransfer" tool_tip="El próximo propietario puede dar o revender este objeto"/> + <check_box label="Modificar" name="CheckNextOwnerModify"/> + <check_box label="Copiar" name="CheckNextOwnerCopy"/> + <check_box label="Transferir" name="CheckNextOwnerTransfer" tool_tip="El próximo propietario puede dar o revender este objeto"/> </panel> <check_box label="En venta" name="CheckPurchase"/> <combo_box name="combobox sale copy"> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 392e289a75..9f5f1f99e7 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -645,6 +645,9 @@ <string name="worldmap_offline"> Sin conexión </string> + <string name="worldmap_item_tooltip_format"> + [PRICE] L$ por [AREA] m² + </string> <string name="worldmap_results_none_found"> No se ha encontrado. </string> @@ -1034,6 +1037,7 @@ <string name="AnimFlagStop" value="Parar la animación:"/> <string name="AnimFlagStart" value="Empezar la animación:"/> <string name="Wave" value="Onda"/> + <string name="GestureActionNone" value="Ninguno"/> <string name="HelloAvatar" value="¡Hola, avatar!"/> <string name="ViewAllGestures" value="Ver todos >>"/> <string name="GetMoreGestures" value="Obtener más >>"/> @@ -1116,12 +1120,12 @@ <string name="InvFolder Favorite"> Favoritos </string> - <string name="InvFolder favorite"> - Favoritos - </string> <string name="InvFolder Current Outfit"> Vestuario actual </string> + <string name="InvFolder Initial Outfits"> + Vestuario inicial + </string> <string name="InvFolder My Outfits"> Mis vestuarios </string> @@ -1441,6 +1445,7 @@ <string name="SummaryForTheWeek" value="Resumen de esta semana, empezando el"/> <string name="NextStipendDay" value="El próximo día de pago es el"/> <string name="GroupIndividualShare" value="Grupo Aportaciones individuales"/> + <string name="GroupColumn" value="Grupo"/> <string name="Balance"> Saldo </string> @@ -1654,6 +1659,12 @@ <string name="BusyModeResponseDefault"> El Residente al que has enviado un mensaje ha solicitado que no se le moleste porque está en modo ocupado. Podrá ver tu mensaje más adelante, ya que éste aparecerá en su panel de MI. </string> + <string name="NoOutfits"> + Todavía no tienes vestuario. Intenta con [secondlife:///app/search/all/ Buscar] + </string> + <string name="NoOutfitsTabsMatched"> + ¿No encuentras lo que buscas? Intenta con [secondlife:///app/search/all/[SEARCH_TERM] Buscar]. + </string> <string name="MuteByName"> (Por el nombre) </string> @@ -3574,6 +3585,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="group_role_owners"> Propietarios </string> + <string name="group_member_status_online"> + Conectado/a + </string> <string name="uploading_abuse_report"> Subiendo... @@ -3627,9 +3641,15 @@ Denuncia de infracción <string name="Invalid Wearable"> No se puede poner </string> + <string name="New Gesture"> + Gesto nuevo + </string> <string name="New Script"> Script nuevo </string> + <string name="New Note"> + Nota nueva + </string> <string name="New Folder"> Carpeta nueva </string> @@ -3687,6 +3707,15 @@ Denuncia de infracción <string name="Male - Wow"> Varón - Admiración </string> + <string name="Female - Chuckle"> + Mujer - Risa suave + </string> + <string name="Female - Cry"> + Mujer - Llorar + </string> + <string name="Female - Embarrassed"> + Mujer - Ruborizada + </string> <string name="Female - Excuse me"> Mujer - Disculpa </string> @@ -3705,9 +3734,21 @@ Denuncia de infracción <string name="Female - Hey"> Mujer - ¡Eh! </string> + <string name="Female - Hey baby"> + Mujer - ¡Eh, encanto! + </string> <string name="Female - Laugh"> Mujer - Risa </string> + <string name="Female - Looking good"> + Mujer - Buen aspecto + </string> + <string name="Female - Over here"> + Mujer - Por aquí + </string> + <string name="Female - Please"> + Mujer - Por favor + </string> <string name="Female - Repulsed"> Mujer - Rechazo </string> @@ -3757,4 +3798,46 @@ Denuncia de infracción <string name="dateTimePM"> PM </string> + <string name="LocalEstimateUSD"> + [AMOUNT] dólares estadounidenses + </string> + <string name="Membership"> + Membresía + </string> + <string name="Roles"> + Roles + </string> + <string name="Group Identity"> + Indentidad de grupo + </string> + <string name="Parcel Management"> + Gestión de la parcela + </string> + <string name="Parcel Identity"> + Identidad de la parcela + </string> + <string name="Parcel Settings"> + Configuración de la parcela + </string> + <string name="Parcel Powers"> + Poder de la parcela + </string> + <string name="Parcel Access"> + Acceso a la parcela + </string> + <string name="Parcel Content"> + Contenido de la parcela + </string> + <string name="Object Management"> + Manejo de objetos + </string> + <string name="Accounting"> + Contabilidad + </string> + <string name="Notices"> + Avisos + </string> + <string name="Chat"> + Chat + </string> </strings> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml index 4fa91b87ef..82f5bac047 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml @@ -13,13 +13,13 @@ Attendre : </floater.string> <floater.string name="stop_txt"> - Stop + Arrêter </floater.string> <floater.string name="preview_txt"> Prévisualiser </floater.string> <floater.string name="none_text"> - -- Aucune -- + - Aucun choix - </floater.string> <floater.string name="Title"> Geste : [NAME] @@ -42,7 +42,12 @@ <text name="library_label"> Bibliothèque : </text> - <scroll_list name="library_list"/> + <scroll_list name="library_list"> + <scroll_list.rows name="action_animation" value="Animation"/> + <scroll_list.rows name="action_sound" value="Son"/> + <scroll_list.rows name="action_chat" value="Chat"/> + <scroll_list.rows name="action_wait" value="Attente"/> + </scroll_list> <button label="Ajouter >>" name="add_btn"/> <text name="steps_label"> Étapes : diff --git a/indra/newview/skins/default/xui/fr/floater_world_map.xml b/indra/newview/skins/default/xui/fr/floater_world_map.xml index 0047a3bb04..f5dab91924 100644 --- a/indra/newview/skins/default/xui/fr/floater_world_map.xml +++ b/indra/newview/skins/default/xui/fr/floater_world_map.xml @@ -19,12 +19,12 @@ <text name="land_sale_label"> Vente de terrains </text> - <text name="by_owner_label"> - propriétaire - </text> <text name="auction_label"> enchères </text> + <text name="by_owner_label"> + propriétaire + </text> <button name="Go Home" tool_tip="Me téléporter jusqu’à mon domicile"/> <text name="Home_label"> Domicile @@ -58,6 +58,9 @@ <search_editor label="Régions par nom" name="location" tool_tip="Tapez le nom d'une région"/> <button label="Trouver" name="DoSearch" tool_tip="Rechercher une région"/> <button name="Clear" tool_tip="Effacer les lignes de suivi et réinitialiser la carte"/> + <text name="events_label"> + Endroit : + </text> <button label="Téléporter" name="Teleport" tool_tip="Me téléporter à l'emplacement sélectionné"/> <button label="Copier la SLurl" name="copy_slurl" tool_tip="Copie l’emplacement actuel sous la forme d’une SLurl à utiliser sur le Web."/> <button label="Afficher la sélection" name="Show Destination" tool_tip="Centrer la carte sur l'emplacement sélectionné"/> diff --git a/indra/newview/skins/default/xui/fr/language_settings.xml b/indra/newview/skins/default/xui/fr/language_settings.xml index 117ae16ee8..bd272e1f28 100644 --- a/indra/newview/skins/default/xui/fr/language_settings.xml +++ b/indra/newview/skins/default/xui/fr/language_settings.xml @@ -17,6 +17,7 @@ datetimeToCodes["month"] = "%B"; // August datetimeToCodes["mthnum"] = "%m"; // 08 datetimeToCodes["day"] = "%d"; // 31 + datetimeToCodes["sday"] = "%-d"; // 9 datetimeToCodes["hour24"] = "%H"; // 14 datetimeToCodes["hour"] = "%H"; // 14 datetimeToCodes["hour12"] = "%I"; // 02 diff --git a/indra/newview/skins/default/xui/fr/menu_gesture_gear.xml b/indra/newview/skins/default/xui/fr/menu_gesture_gear.xml index 4512d1bf7e..062dd0f005 100644 --- a/indra/newview/skins/default/xui/fr/menu_gesture_gear.xml +++ b/indra/newview/skins/default/xui/fr/menu_gesture_gear.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_gesture_gear"> - <menu_item_call label="Ajouter/Supprimer des Favoris" name="activate"/> + <menu_item_call label="Ajouter/Supprimer des favoris" name="activate"/> <menu_item_call label="Copier" name="copy_gesture"/> <menu_item_call label="Coller" name="paste"/> <menu_item_call label="Copier l'UUID" name="copy_uuid"/> diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index 6338fa0cd0..cd0e41e496 100644 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -94,6 +94,7 @@ <menu_item_call label="Définir les scripts sur Pas d'exécution" name="Set Scripts to Not Running"/> </menu> <menu label="Options" name="Options"> + <menu_item_call label="Définir les droits de chargement par défaut" name="perm prefs"/> <menu_item_check label="Afficher les droits avancés" name="DebugPermissions"/> <menu_item_check label="Sélectionner mes objets uniquement" name="Select Only My Objects"/> <menu_item_check label="Sélectionner les objets déplaçables uniquement" name="Select Only Movable Objects"/> @@ -111,7 +112,6 @@ <menu_item_call label="Son ([COST] L$)..." name="Upload Sound"/> <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/> <menu_item_call label="Lot ([COST] L$ par fichier)..." name="Bulk Upload"/> - <menu_item_call label="Définir les droits de chargement par défaut" name="perm prefs"/> </menu> </menu> <menu label="Aide" name="Help"> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index 5cb42a0435..6cfc2b5c66 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -358,7 +358,7 @@ Voulez-vous vraiment continuer ? <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> </notification> <notification name="DeleteOutfits"> - Supprimer la tenue sélectionnée ? + Supprimer la ou les tenues sélectionnées ? <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> </notification> <notification name="PromptGoToEventsPage"> @@ -2746,7 +2746,7 @@ Départ de l'avatar [NAME] entièrement chargé. </notification> <notification name="AvatarRezSelfBakeNotification"> ([EXISTENCE] secondes d'existence) -Texture figée de [RESOLUTION] chargée pour [BODYREGION] au bout de [TIME] secondes. +Vous avez [ACTION] une texture figée de [RESOLUTION] pour [BODYREGION] au bout de [TIME] secondes. </notification> <notification name="ConfirmLeaveCall"> Voulez-vous vraiment quitter cet appel ? @@ -2784,4 +2784,7 @@ Si vous avez toujours des problèmes, veuillez consulter la page [SUPPORT_SITE]. Si vous possédez un terrain, vous pouvez le définir comme domicile. Sinon, consultez la carte et trouvez les " infohubs ". </global> + <global name="You died and have been teleported to your home location"> + Vous êtes mort et avez été téléporté à votre domicile. + </global> </notifications> diff --git a/indra/newview/skins/default/xui/fr/panel_group_notices.xml b/indra/newview/skins/default/xui/fr/panel_group_notices.xml index 5fc1397763..bcf2cc8ec9 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_notices.xml @@ -21,7 +21,7 @@ Vous pouvez désactiver la réception des notices dans l'onglet Général. <text name="notice_list_none_found"> Aucun résultat </text> - <button label="Créer une notice" label_selected="Créer une notice" name="create_new_notice" tool_tip="Créer une notice"/> + <button label="Nouvelle notice" label_selected="Créer une notice" name="create_new_notice" tool_tip="Créer une notice"/> <button label="Rafraîchir" label_selected="Rafraîchir la liste" name="refresh_notices" tool_tip="Actualiser la liste des notices"/> <panel label="Créer une notice" name="panel_create_new_notice"> <text name="lbl"> diff --git a/indra/newview/skins/default/xui/fr/panel_group_roles.xml b/indra/newview/skins/default/xui/fr/panel_group_roles.xml index e1eeaa8601..0bd2e0bdab 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_roles.xml @@ -12,6 +12,9 @@ Vous pouvez ajouter ou supprimer les rôles assignés aux membres. Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la touche Ctrl enfoncée. </panel.string> + <panel.string name="donation_area"> + [AREA] m² + </panel.string> <filter_editor label="Filtrer les membres" name="filter_input"/> <name_list name="member_list"> <name_list.columns label="Membre" name="name"/> diff --git a/indra/newview/skins/default/xui/fr/panel_landmark_info.xml b/indra/newview/skins/default/xui/fr/panel_landmark_info.xml index bd29bd676c..60507f191d 100644 --- a/indra/newview/skins/default/xui/fr/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/fr/panel_landmark_info.xml @@ -16,7 +16,7 @@ Les informations sur ce lieu ne sont pas disponibles car l'accès y est restreint. Veuillez vérifier vos droits avec le propriétaire de la parcelle. </string> <string name="acquired_date"> - [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + [weekday,datetime,local] [sday,datetime,local] [month,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] </string> <button name="back_btn" tool_tip="Précédent"/> <text name="title" value="Profil du lieu"/> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml index c9676c898b..b82d8bcd18 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml @@ -11,8 +11,8 @@ <check_box label="Activé" name="enable_media"/> <slider label="Chat vocal" name="Voice Volume"/> <check_box label="Activé" name="enable_voice_check"/> - <check_box label="Autoriser la lecture automatique du média" name="media_auto_play_btn" tool_tip="Cochez pour autoriser la lecture automatique du média"/> - <check_box label="Jouer le média aux autres avatars" name="media_show_on_others_btn" tool_tip="Décochez pour masquer le média aux autres avatars près de vous"/> + <check_box label="Autoriser la lecture automatique du média" name="media_auto_play_btn" tool_tip="Cochez pour autoriser la lecture automatique du média" value="true"/> + <check_box label="Jouer le média aux autres avatars" name="media_show_on_others_btn" tool_tip="Décochez pour masquer le média aux autres avatars près de vous" value="true"/> <text name="voice_chat_settings"> Paramètres du chat vocal </text> @@ -28,6 +28,12 @@ <panel.string name="default_text"> Défaut </panel.string> + <panel.string name="default system device"> + Périphérique système par défaut + </panel.string> + <panel.string name="no device"> + Aucun périphérique + </panel.string> <text name="Input"> Entrée </text> diff --git a/indra/newview/skins/default/xui/fr/panel_status_bar.xml b/indra/newview/skins/default/xui/fr/panel_status_bar.xml index 3c56fa68e7..85429a18c7 100644 --- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml @@ -16,7 +16,7 @@ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] </panel.string> <panel.string name="timeTooltip"> - [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + [weekday, datetime, slt] [sday, datetime, slt] [month, datetime, slt] [year, datetime, slt] </panel.string> <panel.string name="buycurrencylabel"> [AMT] L$ diff --git a/indra/newview/skins/default/xui/fr/panel_teleport_history.xml b/indra/newview/skins/default/xui/fr/panel_teleport_history.xml index bfd7a869c5..1586c201da 100644 --- a/indra/newview/skins/default/xui/fr/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/fr/panel_teleport_history.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="Teleport History"> <accordion name="history_accordion"> + <no_matched_tabs_text name="no_matched_teleports_msg" value="Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/Rechercher [SEARCH_TERM]]."/> + <no_visible_tabs_text name="no_teleports_msg" value="L'historique des téléportations est vide. Essayez [secondlife:///app/search/places/ Rechercher]."/> <accordion_tab name="today" title="Aujourd'hui"/> <accordion_tab name="yesterday" title="Hier"/> <accordion_tab name="2_days_ago" title="Il y a 2 jours"/> diff --git a/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml index 0350ea5116..77c6f4877c 100644 --- a/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml @@ -23,10 +23,9 @@ </panel.string> <text name="title" value="Profil de l'article"/> <text name="origin" value="(inventaire)"/> - <panel label="" - name="item_profile"> + <panel label="" name="item_profile"> <text name="LabelItemNameTitle"> - Nom : + Nom : </text> <text name="LabelItemDescTitle"> Description : @@ -37,12 +36,12 @@ <text name="LabelCreatorName"/> <button label="Profil" name="BtnCreator"/> <text name="LabelOwnerTitle"> - Propriétaire : + Propriétaire : </text> <text name="LabelOwnerName"/> <button label="Profil" name="BtnOwner"/> <text name="LabelAcquiredTitle"> - Acquis : + Acquis le : </text> <text name="LabelAcquiredDate"/> <panel name="perms_inv"> @@ -53,26 +52,26 @@ <check_box label="Copier" name="CheckOwnerCopy"/> <check_box label="Transférer" name="CheckOwnerTransfer"/> <text name="AnyoneLabel"> - N'importe qui : + N'importe qui : </text> <check_box label="Copier" name="CheckEveryoneCopy"/> <text name="GroupLabel"> - Groupe : + Groupe : </text> - <check_box label="Partager" name="CheckShareWithGroup" tool_tip="Autorisez tous les membres du groupe choisi à utiliser et à partager vos droits pour cet objet. Pour activer les restrictions de rôles, vous devez d'abord cliquer sur Transférer."/> + <check_box label="Partager" name="CheckShareWithGroup" tool_tip="Autoriser tous les membres du groupe choisi à partager vos droits de modification pour cet objet. Pour activer les restrictions de rôles, vous devez d'abord cliquer sur Céder."/> <text name="NextOwnerLabel"> - Le prochain propriétaire : + Prochain propriétaire : </text> <check_box label="Modifier" name="CheckNextOwnerModify"/> <check_box label="Copier" name="CheckNextOwnerCopy"/> - <check_box label="Transférer" name="CheckNextOwnerTransfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/> + <check_box label="Transférer" name="CheckNextOwnerTransfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet."/> </panel> <check_box label="À vendre" name="CheckPurchase"/> <combo_box name="combobox sale copy"> <combo_box.item label="Copier" name="Copy"/> <combo_box.item label="Original" name="Original"/> </combo_box> - <spinner label="Prix : L$" name="Edit Cost"/> + <spinner label="Prix : L$" name="Edit Cost"/> </panel> <panel name="button_panel"> <button label="Annuler" name="cancel_btn"/> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 7aadaed209..6cab902ab6 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -541,7 +541,7 @@ Va te faire voir ! </string> <string name="anim_express_kiss"> - Baiser + Envoyer un baiser </string> <string name="anim_laugh_short"> Rire @@ -663,6 +663,9 @@ <string name="worldmap_offline"> Hors ligne </string> + <string name="worldmap_item_tooltip_format"> + [AREA] m² [PRICE] L$ + </string> <string name="worldmap_results_none_found"> Aucun résultat. </string> @@ -1061,6 +1064,7 @@ <string name="AnimFlagStop" value=" Arrêter l'animation :"/> <string name="AnimFlagStart" value=" Démarrer l'animation :"/> <string name="Wave" value=" Faire signe"/> + <string name="GestureActionNone" value="Aucune"/> <string name="HelloAvatar" value=" Bonjour, avatar !"/> <string name="ViewAllGestures" value=" Tout afficher >>"/> <string name="GetMoreGestures" value="Plus >>"/> @@ -1143,12 +1147,12 @@ <string name="InvFolder Favorite"> Favoris </string> - <string name="InvFolder favorite"> - Favoris - </string> <string name="InvFolder Current Outfit"> Tenue actuelle </string> + <string name="InvFolder Initial Outfits"> + Tenues initiales + </string> <string name="InvFolder My Outfits"> Mes tenues </string> @@ -1468,6 +1472,7 @@ <string name="SummaryForTheWeek" value="Récapitulatif de la semaine, début le "/> <string name="NextStipendDay" value="Prochaine prime le "/> <string name="GroupIndividualShare" value=" Groupe Part individuelle"/> + <string name="GroupColumn" value="Groupe"/> <string name="Balance"> Solde </string> @@ -1687,6 +1692,12 @@ <string name="BusyModeResponseDefault"> Le résident auquel vous avez envoyé un message est en mode Occupé, ce qui signifie qu'il a demandé à ne pas être dérangé. Votre message restera affiché dans son panneau IM afin qu'il puisse le lire ultérieurement. </string> + <string name="NoOutfits"> + Aucune tenue n'est actuellement en votre possession. Essayez [secondlife:///app/search/all Rechercher]. + </string> + <string name="NoOutfitsTabsMatched"> + Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/Rechercher [SEARCH_TERM]]. + </string> <string name="MuteByName"> (par nom) </string> @@ -3676,6 +3687,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. <string name="group_role_owners"> Propriétaires </string> + <string name="group_member_status_online"> + En ligne + </string> <string name="uploading_abuse_report"> Chargement en cours... @@ -3729,9 +3743,15 @@ de l'infraction signalée <string name="Invalid Wearable"> Objet à porter non valide </string> + <string name="New Gesture"> + Nouveau geste + </string> <string name="New Script"> Nouveau script </string> + <string name="New Note"> + Nouvelle note + </string> <string name="New Folder"> Nouveau dossier </string> @@ -3789,6 +3809,15 @@ de l'infraction signalée <string name="Male - Wow"> Homme - Ouah ! </string> + <string name="Female - Chuckle"> + Femme - Glousser + </string> + <string name="Female - Cry"> + Femme - Pleurer + </string> + <string name="Female - Embarrassed"> + Femme - Gêne + </string> <string name="Female - Excuse me"> Femme - Demander pardon </string> @@ -3807,9 +3836,21 @@ de l'infraction signalée <string name="Female - Hey"> Femme - Hé ! </string> + <string name="Female - Hey baby"> + Femme - Hey baby + </string> <string name="Female - Laugh"> Femme - Rire </string> + <string name="Female - Looking good"> + Femme - Looking good + </string> + <string name="Female - Over here"> + Femme - Over here + </string> + <string name="Female - Please"> + Femme - Please + </string> <string name="Female - Repulsed"> Femme - Dégoût </string> @@ -3859,5 +3900,46 @@ de l'infraction signalée <string name="dateTimePM"> PM </string> - <string name="LocalEstimateUSD">[AMOUNT] US$</string> + <string name="LocalEstimateUSD"> + [AMOUNT] US$ + </string> + <string name="Membership"> + Inscription + </string> + <string name="Roles"> + Rôles + </string> + <string name="Group Identity"> + Identité du groupe + </string> + <string name="Parcel Management"> + Gestion des parcelles + </string> + <string name="Parcel Identity"> + Identité des parcelles + </string> + <string name="Parcel Settings"> + Paramètres des parcelles + </string> + <string name="Parcel Powers"> + Pouvoirs sur les parcelles + </string> + <string name="Parcel Access"> + Accès aux parcelles + </string> + <string name="Parcel Content"> + Contenu des parcelles + </string> + <string name="Object Management"> + Gestion des objets + </string> + <string name="Accounting"> + Comptabilité + </string> + <string name="Notices"> + Notices + </string> + <string name="Chat"> + Chat + </string> </strings> diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml index cc9d42b3cb..9c4006b4e6 100644 --- a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml @@ -42,7 +42,12 @@ <text name="library_label"> Libreria: </text> - <scroll_list name="library_list"/> + <scroll_list name="library_list"> + <scroll_list.rows name="action_animation" value="Animazione"/> + <scroll_list.rows name="action_sound" value="Suono"/> + <scroll_list.rows name="action_chat" value="Chat"/> + <scroll_list.rows name="action_wait" value="Attendi"/> + </scroll_list> <button label="Aggiungi >>" name="add_btn"/> <text name="steps_label"> Fasi: diff --git a/indra/newview/skins/default/xui/it/floater_world_map.xml b/indra/newview/skins/default/xui/it/floater_world_map.xml index a6bd4ffbaf..8da17a4034 100644 --- a/indra/newview/skins/default/xui/it/floater_world_map.xml +++ b/indra/newview/skins/default/xui/it/floater_world_map.xml @@ -19,12 +19,12 @@ <text name="land_sale_label"> Vendita terreno </text> - <text name="by_owner_label"> - da parte del proprietario - </text> <text name="auction_label"> asta di terreni </text> + <text name="by_owner_label"> + da parte del proprietario + </text> <button name="Go Home" tool_tip="Teleport a casa"/> <text name="Home_label"> Home @@ -35,7 +35,7 @@ <text name="pg_label"> Generale </text> - <check_box name="events_mature_chk"/> + <check_box initial_value="true" name="events_mature_chk"/> <text name="events_mature_label"> Moderato </text> @@ -58,6 +58,9 @@ <search_editor label="Regioni secondo il nome" name="location" tool_tip="Digita il nome di una regione"/> <button label="Trova" name="DoSearch" tool_tip="Cerca la regione"/> <button name="Clear" tool_tip="Elimina le linee di monitoraggio e reimposta la mappa"/> + <text name="events_label"> + Luogo: + </text> <button label="Teleport" name="Teleport" tool_tip="Teleport al luogo selezionato"/> <button label="Copia SLurl" name="copy_slurl" tool_tip="Copia la posizione attuale come un SLurl da usare nel Web."/> <button label="Mostra la selezione" name="Show Destination" tool_tip="Centra la mappa sul luogo selezionato"/> diff --git a/indra/newview/skins/default/xui/it/language_settings.xml b/indra/newview/skins/default/xui/it/language_settings.xml index 82cf789a6b..312b8e21aa 100644 --- a/indra/newview/skins/default/xui/it/language_settings.xml +++ b/indra/newview/skins/default/xui/it/language_settings.xml @@ -17,6 +17,7 @@ datetimeToCodes["month"] = "%B"; // August datetimeToCodes["mthnum"] = "%m"; // 08 datetimeToCodes["day"] = "%d"; // 31 + datetimeToCodes["sday"] = "%-d"; // 9 datetimeToCodes["hour24"] = "%H"; // 14 datetimeToCodes["hour"] = "%H"; // 14 datetimeToCodes["hour12"] = "%I"; // 02 diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml index f0dd035b5d..6290b79211 100644 --- a/indra/newview/skins/default/xui/it/menu_viewer.xml +++ b/indra/newview/skins/default/xui/it/menu_viewer.xml @@ -94,6 +94,7 @@ <menu_item_call label="Imposta script come non in esecuzione" name="Set Scripts to Not Running"/> </menu> <menu label="Opzioni" name="Options"> + <menu_item_call label="Definisci diritti di caricamento predefiniti" name="perm prefs"/> <menu_item_check label="Mostra autorizzazioni avanzate" name="DebugPermissions"/> <menu_item_check label="Seleziona solo i miei oggetti" name="Select Only My Objects"/> <menu_item_check label="Seleziona solo gli oggetti spostabili" name="Select Only Movable Objects"/> @@ -111,7 +112,6 @@ <menu_item_call label="Suono ([COST] L$)..." name="Upload Sound"/> <menu_item_call label="Animazione ([COST] L$)..." name="Upload Animation"/> <menu_item_call label="In blocco ([COST] L$ per file)..." name="Bulk Upload"/> - <menu_item_call label="Definisci diritti di caricamento predefiniti" name="perm prefs"/> </menu> </menu> <menu label="Aiuto" name="Help"> diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml index 44b8211bdb..474bdca55f 100644 --- a/indra/newview/skins/default/xui/it/notifications.xml +++ b/indra/newview/skins/default/xui/it/notifications.xml @@ -2749,7 +2749,7 @@ Avatar '[NAME]' è partito completamente caricato. </notification> <notification name="AvatarRezSelfBakeNotification"> ( in esistenza da [EXISTENCE] secondi ) -Hai caricato una texture [RESOLUTION] completata per '[BODYREGION]' dopo [TIME] secondi. +Effettuata l'azione: [ACTION] di una texture [RESOLUTION] completata per '[BODYREGION]' dopo [TIME] secondi. </notification> <notification name="ConfirmLeaveCall"> Sei sicuro di volere uscire dalla chiamata? @@ -2787,4 +2787,7 @@ Se continui ad avere problemi, visita la pagina [SUPPORT_SITE]. Se sei proprietario di un appezzamento di terreno, puoi definirlo come la tua posizione iniziale. In alternativa, puoi guardare sulla mappa e trovare luoghi segnalati come "Infohub". </global> + <global name="You died and have been teleported to your home location"> + Sei deceduto e sei stato teleportato a casa tua. + </global> </notifications> diff --git a/indra/newview/skins/default/xui/it/panel_group_notices.xml b/indra/newview/skins/default/xui/it/panel_group_notices.xml index 8dd945830e..2e2f0dc7b0 100644 --- a/indra/newview/skins/default/xui/it/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/it/panel_group_notices.xml @@ -19,7 +19,7 @@ Massimo 200 per gruppo al giorno <text name="notice_list_none_found"> Nessuno trovato </text> - <button label="Crea un nuovo avviso" label_selected="Crea una nuova notice" name="create_new_notice" tool_tip="Crea un nuovo avviso"/> + <button label="Nuovo avviso" label_selected="Crea una nuova notice" name="create_new_notice" tool_tip="Crea un nuovo avviso"/> <button label="Aggiorna" label_selected="Aggiorna l'elenco" name="refresh_notices" tool_tip="Aggiorna la lista degli avvisi"/> <panel label="Crea una nuova notice" name="panel_create_new_notice"> <text name="lbl"> diff --git a/indra/newview/skins/default/xui/it/panel_group_roles.xml b/indra/newview/skins/default/xui/it/panel_group_roles.xml index 1769ef748d..478b35e628 100644 --- a/indra/newview/skins/default/xui/it/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/it/panel_group_roles.xml @@ -13,6 +13,9 @@ Seleziona più membri tenendo premuto il tasto Ctrl e cliccando sui loro nomi. </panel.string> + <panel.string name="donation_area"> + [AREA] m² + </panel.string> <filter_editor label="Filtra Membri" name="filter_input"/> <name_list name="member_list"> <name_list.columns label="Socio" name="name"/> @@ -66,21 +69,15 @@ in questo gruppo. C'è una vasta gamma di abilità. <text name="static"> Nome del ruolo </text> - <line_editor name="role_name"> - Addetti - </line_editor> + <line_editor name="role_name"/> <text name="static3"> Titolo del ruolo </text> - <line_editor name="role_title"> - (attendi) - </line_editor> + <line_editor name="role_title"/> <text name="static2"> Descrizione </text> - <text_editor name="role_description"> - (attendi) - </text_editor> + <text_editor name="role_description"/> <text name="static4"> Ruoli assegnati </text> @@ -91,9 +88,6 @@ in questo gruppo. C'è una vasta gamma di abilità. <scroll_list name="role_allowed_actions" tool_tip="Per i dettagli di ogni abilità consentita vedi la scheda abilità."/> </panel> <panel name="actions_footer"> - <text name="static"> - Descrizione abilità - </text> <text_editor name="action_description"> Questa abilità è 'Espelli i membri dal gruppo'. Solo un Capogruppo puo espellere un'altro Capogruppo. </text_editor> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml index 9f8a13fedc..2ddb226020 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml @@ -11,8 +11,8 @@ <check_box label="Abilitato" name="enable_media"/> <slider label="Chat vocale" name="Voice Volume"/> <check_box label="Abilitato" name="enable_voice_check"/> - <check_box label="Consenti riproduzione multimediale automatica" name="media_auto_play_btn" tool_tip="Seleziona qui per consentire la riproduzione multimediale automatica"/> - <check_box label="Riproduci media in uso da altri avatar" name="media_show_on_others_btn" tool_tip="Deseleziona qui per nascondere i media in uso dagli altri avatar nei dintorni"/> + <check_box label="Consenti riproduzione multimediale automatica" name="media_auto_play_btn" tool_tip="Seleziona qui per consentire la riproduzione multimediale automatica" value="true"/> + <check_box label="Riproduci media in uso da altri avatar" name="media_show_on_others_btn" tool_tip="Deseleziona qui per nascondere i media in uso dagli altri avatar nei dintorni" value="true"/> <text name="voice_chat_settings"> Impostazioni Chat vocale </text> @@ -28,6 +28,12 @@ <panel.string name="default_text"> Predefinito </panel.string> + <panel.string name="default system device"> + Dispositivo di sistema predefinito + </panel.string> + <panel.string name="no device"> + Nessun dispositivo + </panel.string> <text name="Input"> Input </text> diff --git a/indra/newview/skins/default/xui/it/panel_teleport_history.xml b/indra/newview/skins/default/xui/it/panel_teleport_history.xml index 85f8f87e68..f4fa59babe 100644 --- a/indra/newview/skins/default/xui/it/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/it/panel_teleport_history.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="Teleport History"> <accordion name="history_accordion"> + <no_matched_tabs_text name="no_matched_teleports_msg" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/places/[SEARCH_TERM] Cerca]."/> + <no_visible_tabs_text name="no_teleports_msg" value="La cronologia dei teleport è vuota. Prova [secondlife:///app/search/places/ Cerca]."/> <accordion_tab name="today" title="Oggi"/> <accordion_tab name="yesterday" title="Ieri"/> <accordion_tab name="2_days_ago" title="2 giorni fa"/> - 5 <accordion_tab name="3_days_ago" title="3 giorni fa"/> <accordion_tab name="4_days_ago" title="4 giorni fa"/> <accordion_tab name="5_days_ago" title="5 giorni fa"/> diff --git a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml index 627aeb5cb5..6f650ea55d 100644 --- a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml @@ -23,8 +23,7 @@ </panel.string> <text name="title" value="Profilo articolo"/> <text name="origin" value="(Inventario)"/> - <panel label="" - name="item_profile"> + <panel label="" name="item_profile"> <text name="LabelItemNameTitle"> Nome: </text> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 69c84be22c..fb479b4653 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -651,6 +651,9 @@ <string name="worldmap_offline"> Offline </string> + <string name="worldmap_item_tooltip_format"> + L$ [PRICE] - [AREA] m² + </string> <string name="worldmap_results_none_found"> Nessun risultato. </string> @@ -1040,6 +1043,7 @@ <string name="AnimFlagStop" value="Ferma l'animazione :"/> <string name="AnimFlagStart" value="Inizia l'animazione :"/> <string name="Wave" value="Saluta con la mano"/> + <string name="GestureActionNone" value="Nessuna"/> <string name="HelloAvatar" value="Ciao, avatar!"/> <string name="ViewAllGestures" value="Visualizza tutto >>"/> <string name="GetMoreGestures" value="Altre >>"/> @@ -1122,12 +1126,12 @@ <string name="InvFolder Favorite"> Preferiti </string> - <string name="InvFolder favorite"> - Preferiti - </string> <string name="InvFolder Current Outfit"> Abbigliamento attuale </string> + <string name="InvFolder Initial Outfits"> + Vestiario iniziale + </string> <string name="InvFolder My Outfits"> Il mio vestiario </string> @@ -1447,6 +1451,7 @@ <string name="SummaryForTheWeek" value="Riassunto della settimana, partendo dal"/> <string name="NextStipendDay" value="Il prossimo giorno di stipendio è"/> <string name="GroupIndividualShare" value="Gruppo Dividendi individuali"/> + <string name="GroupColumn" value="Gruppo"/> <string name="Balance"> Saldo </string> @@ -1660,6 +1665,12 @@ <string name="BusyModeResponseDefault"> Il residente al quale hai inviato un messaggio è in modalità 'occupato', ovvero ha chiesto di non essere disturbato. Il tuo messaggio comparirà nel suo pannello IM, dove potrà essere letto in un secondo momento. </string> + <string name="NoOutfits"> + Non hai ancora vestiario da indossare. Prova [secondlife:///app/search/all Cerca]. + </string> + <string name="NoOutfitsTabsMatched"> + Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/all/[SEARCH_TERM] Cerca]. + </string> <string name="MuteByName"> (In base al nome) </string> @@ -3580,6 +3591,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="group_role_owners"> Proprietari </string> + <string name="group_member_status_online"> + Online + </string> <string name="uploading_abuse_report"> Caricamento in corso... @@ -3633,9 +3647,15 @@ Segnala abuso <string name="Invalid Wearable"> Capo da indossare non valido </string> + <string name="New Gesture"> + Nuova gesture + </string> <string name="New Script"> Nuovo script </string> + <string name="New Note"> + Nuovo appunto + </string> <string name="New Folder"> Nuova cartella </string> @@ -3693,6 +3713,15 @@ Segnala abuso <string name="Male - Wow"> Maschio - Accipicchia </string> + <string name="Female - Chuckle"> + Femmina - Risatina + </string> + <string name="Female - Cry"> + Femmina - Pianto + </string> + <string name="Female - Embarrassed"> + Femmina - Imbarazzata + </string> <string name="Female - Excuse me"> Femmina - Chiedere scusa </string> @@ -3711,9 +3740,21 @@ Segnala abuso <string name="Female - Hey"> Femmina - Ehi </string> + <string name="Female - Hey baby"> + Femmina - Ehi tu + </string> <string name="Female - Laugh"> Femmina - Ridere </string> + <string name="Female - Looking good"> + Femmina - Sei in forma + </string> + <string name="Female - Over here"> + Femmina - Per di qua + </string> + <string name="Female - Please"> + Femmina - Per cortesia + </string> <string name="Female - Repulsed"> Femmina - Disgustata </string> @@ -3763,4 +3804,46 @@ Segnala abuso <string name="dateTimePM"> pomeridiane </string> + <string name="LocalEstimateUSD"> + US$ [AMOUNT] + </string> + <string name="Membership"> + Abbonamento + </string> + <string name="Roles"> + Ruoli + </string> + <string name="Group Identity"> + Identità gruppo + </string> + <string name="Parcel Management"> + Gestione lotto + </string> + <string name="Parcel Identity"> + Identità lotto + </string> + <string name="Parcel Settings"> + Impostazioni lotto + </string> + <string name="Parcel Powers"> + Poteri lotto + </string> + <string name="Parcel Access"> + Accesso al lotto + </string> + <string name="Parcel Content"> + Contenuto lotto + </string> + <string name="Object Management"> + Gestione oggetti + </string> + <string name="Accounting"> + Contabilità + </string> + <string name="Notices"> + Avvisi + </string> + <string name="Chat"> + Chat + </string> </strings> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml index 88e67862c8..59ce36b022 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml @@ -42,7 +42,12 @@ <text name="library_label"> ライブラリ: </text> - <scroll_list name="library_list"/> + <scroll_list name="library_list"> + <scroll_list.rows name="action_animation" value="アニメーション"/> + <scroll_list.rows name="action_sound" value="サウンド"/> + <scroll_list.rows name="action_chat" value="チャット"/> + <scroll_list.rows name="action_wait" value="待機"/> + </scroll_list> <button label="追加>>" name="add_btn"/> <text name="steps_label"> 手順: diff --git a/indra/newview/skins/default/xui/ja/floater_world_map.xml b/indra/newview/skins/default/xui/ja/floater_world_map.xml index 62670251d6..cc07596adc 100644 --- a/indra/newview/skins/default/xui/ja/floater_world_map.xml +++ b/indra/newview/skins/default/xui/ja/floater_world_map.xml @@ -22,12 +22,12 @@ <text name="land_sale_label"> 土地販売 </text> - <text name="by_owner_label"> - 所有者の販売 - </text> <text name="auction_label"> 土地オークション </text> + <text name="by_owner_label"> + 所有者の販売 + </text> <button label="ホームへ" label_selected="ホームへ" name="Go Home" tool_tip="「ホーム」にテレポートします"/> <text name="Home_label"> ホーム @@ -67,6 +67,9 @@ <scroll_list.columns label="" name="icon"/> <scroll_list.columns label="" name="sim_name"/> </scroll_list> + <text name="events_label"> + 場所: + </text> <button label="テレポート" label_selected="テレポート" name="Teleport" tool_tip="選択した場所にテレポートします"/> <button label="SLurl をコピー" name="copy_slurl" tool_tip="現在地の SLurl をコピーして Web で使用します"/> <button label="選択を表示する" label_selected="目的地を表示" name="Show Destination" tool_tip="選択した場所を地図の中心に表示します"/> diff --git a/indra/newview/skins/default/xui/ja/language_settings.xml b/indra/newview/skins/default/xui/ja/language_settings.xml index 72382417d9..a6023f9b56 100644 --- a/indra/newview/skins/default/xui/ja/language_settings.xml +++ b/indra/newview/skins/default/xui/ja/language_settings.xml @@ -17,6 +17,7 @@ datetimeToCodes["month"] = "%B"; // August datetimeToCodes["mthnum"] = "%m"; // 08 datetimeToCodes["day"] = "%d"; // 31 + datetimeToCodes["sday"] = "%-d"; // 9 datetimeToCodes["hour24"] = "%H"; // 14 datetimeToCodes["hour"] = "%H"; // 14 datetimeToCodes["hour12"] = "%I"; // 02 diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml index 164341ad2f..f6476857d2 100644 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -94,6 +94,7 @@ <menu_item_call label="スクリプトを実行停止にする" name="Set Scripts to Not Running"/> </menu> <menu label="オプション" name="Options"> + <menu_item_call label="デフォルトのアップロード権限を設定" name="perm prefs"/> <menu_item_check label="権限の詳細を表示する" name="DebugPermissions"/> <menu_item_check label="私のオブジェクトだけを選択する" name="Select Only My Objects"/> <menu_item_check label="動的オブジェクトだけを選択する" name="Select Only Movable Objects"/> @@ -111,7 +112,6 @@ <menu_item_call label="サウンド(L$[COST])..." name="Upload Sound"/> <menu_item_call label="アニメーション(L$[COST])..." name="Upload Animation"/> <menu_item_call label="一括 (ファイルにつきL$[COST])..." name="Bulk Upload"/> - <menu_item_call label="デフォルトのアップロード権限を設定" name="perm prefs"/> </menu> </menu> <menu label="ヘルプ" name="Help"> diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index 8fceaa2817..709797cb58 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -2800,8 +2800,8 @@ M キーを押して変更します。 アバター「 NAME 」が完全に読み込まれました。 </notification> <notification name="AvatarRezSelfBakeNotification"> - (作成後[EXISTENCE]秒経過) -'[BODYREGION]'の[RESOLUTION]のベークドテクスチャは[TIME]秒後にアップロードされました。 + ( 作成後[EXISTENCE]秒経過) +'[BODYREGION]' の[RESOLUTION]のベークドテクスチャは[TIME]秒後に[ACTION]されました。 </notification> <notification name="ConfirmLeaveCall"> このコールから抜けますか? @@ -2839,4 +2839,7 @@ M キーを押して変更します。 自分の土地をお持ちの場合、「ホーム」に設定できます。 お持ちでない場合は、地図で「インフォハブ」をお探しください。 </global> + <global name="You died and have been teleported to your home location"> + 死んでしまったので、ホームにテレポートされました。 + </global> </notifications> diff --git a/indra/newview/skins/default/xui/ja/panel_group_notices.xml b/indra/newview/skins/default/xui/ja/panel_group_notices.xml index 0b508bd79d..96e0382975 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_notices.xml @@ -21,7 +21,7 @@ <text name="notice_list_none_found"> 見つかりませんでした </text> - <button label="新しい通知を作成" label_selected="新しい通知を作成" name="create_new_notice" tool_tip="新しい通知を作成します"/> + <button label="新しい通知" label_selected="新しい通知を作成" name="create_new_notice" tool_tip="新しい通知を作成します"/> <button label="更新" label_selected="リスト更新" name="refresh_notices" tool_tip="通知リストを更新します"/> <panel label="新しい通知を作成" name="panel_create_new_notice"> <text name="lbl"> diff --git a/indra/newview/skins/default/xui/ja/panel_group_roles.xml b/indra/newview/skins/default/xui/ja/panel_group_roles.xml index 8a629be910..be203b0761 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_roles.xml @@ -13,6 +13,9 @@ Ctrl キーを押しながらメンバー名をクリックすると 複数の人を選択できます。 </panel.string> + <panel.string name="donation_area"> + [AREA] 平方メートル + </panel.string> <filter_editor label="メンバーを選別" name="filter_input"/> <name_list name="member_list"> <name_list.columns label="メンバー" name="name"/> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml index abbd29286b..4f29ae7b44 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml @@ -28,6 +28,12 @@ <panel.string name="default_text"> デフォルト </panel.string> + <panel.string name="default system device"> + デフォルトのシステム機器 + </panel.string> + <panel.string name="no device"> + 機器が設定されていません + </panel.string> <text name="Input"> 入力 </text> diff --git a/indra/newview/skins/default/xui/ja/panel_teleport_history.xml b/indra/newview/skins/default/xui/ja/panel_teleport_history.xml index c1bf81f7e7..58e396877c 100644 --- a/indra/newview/skins/default/xui/ja/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/ja/panel_teleport_history.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="Teleport History"> <accordion name="history_accordion"> + <no_matched_tabs_text name="no_matched_teleports_msg" value="お探しのものは見つかりましたか?[secondlife:///app/search/places/[SEARCH_TERM]をお試しください。"/> + <no_visible_tabs_text name="no_teleports_msg" value="テレポートの履歴には何も情報がありません。[secondlife:///app/search/places/ Search]をお試しください。"/> <accordion_tab name="today" title="今日"/> <accordion_tab name="yesterday" title="昨日"/> <accordion_tab name="2_days_ago" title="2日前"/> diff --git a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml index 414eba0509..519b69799b 100644 --- a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml @@ -23,8 +23,7 @@ </panel.string> <text name="title" value="アイテムのプロフィール"/> <text name="origin" value="(持ち物)"/> - <panel label="" - name="item_profile"> + <panel label="" name="item_profile"> <text name="LabelItemNameTitle"> 名前: </text> @@ -59,20 +58,20 @@ <text name="GroupLabel"> グループ: </text> - <check_box label="共有" name="CheckShareWithGroup" tool_tip="設定したグループのメンバー全員にこのオブジェクトの修正権限を与えます。 譲渡しない限り、役割制限を有効にはできません。"/> + <check_box label="共有" name="CheckShareWithGroup" tool_tip="設定したグループのメンバー全員にこのオブジェクトの修正権限を与えます。譲渡しない限り、役割制限を有効にはできません。"/> <text name="NextOwnerLabel"> 次の所有者: </text> <check_box label="修正" name="CheckNextOwnerModify"/> <check_box label="コピー" name="CheckNextOwnerCopy"/> - <check_box label="再販・プレゼント" name="CheckNextOwnerTransfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販することができます"/> + <check_box label="再販・プレゼント" name="CheckNextOwnerTransfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販できます"/> </panel> - <check_box label="販売する" name="CheckPurchase"/> + <check_box label="販売中" name="CheckPurchase"/> <combo_box name="combobox sale copy"> <combo_box.item label="コピー" name="Copy"/> <combo_box.item label="オリジナル" name="Original"/> </combo_box> - <spinner label="価格: L$" name="Edit Cost"/> + <spinner label="価格:L$" name="Edit Cost"/> </panel> <panel name="button_panel"> <button label="キャンセル" name="cancel_btn"/> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index 350a98aaf0..b68b68a4f8 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -663,6 +663,9 @@ <string name="worldmap_offline"> オフライン </string> + <string name="worldmap_item_tooltip_format"> + [AREA] 平方メートル L$[PRICE] + </string> <string name="worldmap_results_none_found"> 見つかりませんでした。 </string> @@ -1061,6 +1064,7 @@ <string name="AnimFlagStop" value=" アニメーションを停止:"/> <string name="AnimFlagStart" value=" アニメーションを開始:"/> <string name="Wave" value=" 手を振る"/> + <string name="GestureActionNone" value="なし"/> <string name="HelloAvatar" value=" やあ、アバター!"/> <string name="ViewAllGestures" value=" すべて表示 >>"/> <string name="GetMoreGestures" value="ショッピング >>"/> @@ -1143,12 +1147,12 @@ <string name="InvFolder Favorite"> お気に入り </string> - <string name="InvFolder favorite"> - お気に入り - </string> <string name="InvFolder Current Outfit"> 着用中のアウトフィット </string> + <string name="InvFolder Initial Outfits"> + 最初のアウトフィット + </string> <string name="InvFolder My Outfits"> マイ アウトフィット </string> @@ -1468,6 +1472,7 @@ <string name="SummaryForTheWeek" value="今週のまとめ。開始日は"/> <string name="NextStipendDay" value="です。次回のお小遣い支給日:"/> <string name="GroupIndividualShare" value=" グループ 個人の割り当て"/> + <string name="GroupColumn" value="グループの設定"/> <string name="Balance"> 残高 </string> @@ -1687,6 +1692,12 @@ <string name="BusyModeResponseDefault"> メッセージを送った住人は、誰にも邪魔をされたくないため現在「取り込み中」モードです。 あなたのメッセージは、あとで確認できるように IM パネルに表示されます。 </string> + <string name="NoOutfits"> + アウトフィットがまだありません。[secondlife:///app/search/all/ Search]をお試しください + </string> + <string name="NoOutfitsTabsMatched"> + お探しのものは見つかりましたか?[secondlife:///app/search/all/[SEARCH_TERM]をお試しください。 + </string> <string name="MuteByName"> (名称別) </string> @@ -3676,6 +3687,9 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ <string name="group_role_owners"> オーナー </string> + <string name="group_member_status_online"> + オンライン + </string> <string name="uploading_abuse_report"> アップロード中... @@ -3729,9 +3743,15 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ <string name="Invalid Wearable"> 無効な着用物 </string> + <string name="New Gesture"> + ジェスチャー + </string> <string name="New Script"> 新規スクリプト </string> + <string name="New Note"> + ノート + </string> <string name="New Folder"> 新規フォルダ </string> @@ -3789,6 +3809,15 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ <string name="Male - Wow"> 男性 - Wow </string> + <string name="Female - Chuckle"> + 女性 – クスクス + </string> + <string name="Female - Cry"> + 女性 – 泣く + </string> + <string name="Female - Embarrassed"> + 女性 – 恥ずかしい + </string> <string name="Female - Excuse me"> 女性 – すみません </string> @@ -3807,9 +3836,21 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ <string name="Female - Hey"> 女性 - Hey </string> + <string name="Female - Hey baby"> + 女性 – ヘイ、ベィビー! + </string> <string name="Female - Laugh"> 女性 - 笑う </string> + <string name="Female - Looking good"> + 女性 – いい感じ + </string> + <string name="Female - Over here"> + 女性 – こっちよ + </string> + <string name="Female - Please"> + 女性 – プリーズ + </string> <string name="Female - Repulsed"> 女性 - 拒絶 </string> @@ -3859,4 +3900,46 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ <string name="dateTimePM"> PM </string> + <string name="LocalEstimateUSD"> + US$ [AMOUNT] + </string> + <string name="Membership"> + 会員 + </string> + <string name="Roles"> + 役割 + </string> + <string name="Group Identity"> + グループの識別情報 + </string> + <string name="Parcel Management"> + 区画の管理 + </string> + <string name="Parcel Identity"> + 区画の識別情報 + </string> + <string name="Parcel Settings"> + 区画の設定 + </string> + <string name="Parcel Powers"> + 区画の権限 + </string> + <string name="Parcel Access"> + 区画へのアクセス + </string> + <string name="Parcel Content"> + 区画のコンテンツ + </string> + <string name="Object Management"> + オブジェクトの管理 + </string> + <string name="Accounting"> + 会計 + </string> + <string name="Notices"> + 通知 + </string> + <string name="Chat"> + チャット + </string> </strings> diff --git a/indra/newview/skins/default/xui/nl/language_settings.xml b/indra/newview/skins/default/xui/nl/language_settings.xml index dc4663705f..53501d5dcb 100644 --- a/indra/newview/skins/default/xui/nl/language_settings.xml +++ b/indra/newview/skins/default/xui/nl/language_settings.xml @@ -17,6 +17,7 @@ datetimeToCodes["month"] = "%B"; // August datetimeToCodes["mthnum"] = "%m"; // 08 datetimeToCodes["day"] = "%d"; // 31 + datetimeToCodes["sday"] = "%-d"; // 9 datetimeToCodes["hour24"] = "%H"; // 14 datetimeToCodes["hour"] = "%H"; // 14 datetimeToCodes["hour12"] = "%I"; // 02 diff --git a/indra/newview/skins/default/xui/pl/language_settings.xml b/indra/newview/skins/default/xui/pl/language_settings.xml index debc451a33..681b38e9cf 100644 --- a/indra/newview/skins/default/xui/pl/language_settings.xml +++ b/indra/newview/skins/default/xui/pl/language_settings.xml @@ -17,6 +17,7 @@ datetimeToCodes["month"] = "%B"; // August datetimeToCodes["mthnum"] = "%m"; // 08 datetimeToCodes["day"] = "%d"; // 31 + datetimeToCodes["sday"] = "%-d"; // 9 datetimeToCodes["hour24"] = "%H"; // 14 datetimeToCodes["hour"] = "%H"; // 14 datetimeToCodes["hour12"] = "%I"; // 02 diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml index a01bee94a1..80bdbb0fb4 100644 --- a/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml @@ -42,7 +42,12 @@ <text name="library_label"> Biblioteca: </text> - <scroll_list name="library_list" width="84"/> + <scroll_list name="library_list" width="84"> + <scroll_list.rows name="action_animation" value="Animação"/> + <scroll_list.rows name="action_sound" value="Som"/> + <scroll_list.rows name="action_chat" value="Bate-papo"/> + <scroll_list.rows name="action_wait" value="Espere"/> + </scroll_list> <button label="Incluir" left="118" name="add_btn" width="87"/> <text name="steps_label"> Passos: diff --git a/indra/newview/skins/default/xui/pt/floater_world_map.xml b/indra/newview/skins/default/xui/pt/floater_world_map.xml index 77d0c787e7..490a975e80 100644 --- a/indra/newview/skins/default/xui/pt/floater_world_map.xml +++ b/indra/newview/skins/default/xui/pt/floater_world_map.xml @@ -6,7 +6,7 @@ </text> </panel> <panel name="layout_panel_2"> - <button font="SansSerifSmall" label="Mostra minha localização" label_selected="Mostra minha localização" left_delta="91" name="Show My Location" tool_tip="Centrar o mapa na localização do meu avatar" /> + <button font="SansSerifSmall" label="Mostra minha localização" label_selected="Mostra minha localização" left_delta="91" name="Show My Location" tool_tip="Centrar o mapa na localização do meu avatar"/> <text name="me_label"> Eu </text> @@ -22,12 +22,12 @@ <text name="land_sale_label"> Terreno à venda </text> - <text name="by_owner_label"> - pelo dono - </text> <text name="auction_label"> leilão </text> + <text name="by_owner_label"> + pelo dono + </text> <button label="Voltar ao meu início" label_selected="Voltar ao meu início" name="Go Home" tool_tip="Teletransportar para meu início"/> <text name="Home_label"> Início @@ -39,7 +39,7 @@ <text name="pg_label"> Geral </text> - <check_box label="Mature" name="events_mature_chk"/> + <check_box initial_value="true" label="Mature" name="events_mature_chk"/> <text name="events_mature_label"> Moderado </text> @@ -63,6 +63,9 @@ <search_editor label="Regiões por nome" name="location" tool_tip="Digite o nome da região"/> <button label="Buscar" name="DoSearch" tool_tip="Buscar região"/> <button name="Clear" tool_tip="Limpar linhas e redefinir mapa"/> + <text name="events_label"> + Local: + </text> <button font="SansSerifSmall" label="Teletransportar" label_selected="Teletransporte" name="Teleport" tool_tip="Teletransportar para o lugar selecionado"/> <button font="SansSerifSmall" label="Copiar SLurl" name="copy_slurl" tool_tip="Copia a localização atual como um SLurl para usar na web."/> <button font="SansSerifSmall" label="Mostrar seleção" label_selected="Mostrar Destino" left_delta="91" name="Show Destination" tool_tip="Centrar mapa no local selecionado" width="135"/> diff --git a/indra/newview/skins/default/xui/pt/language_settings.xml b/indra/newview/skins/default/xui/pt/language_settings.xml index f25e77574d..e1de6ffea7 100644 --- a/indra/newview/skins/default/xui/pt/language_settings.xml +++ b/indra/newview/skins/default/xui/pt/language_settings.xml @@ -17,6 +17,7 @@ datetimeToCodes["month"] = "%B"; // August datetimeToCodes["mthnum"] = "%m"; // 08 datetimeToCodes["day"] = "%d"; // 31 + datetimeToCodes["sday"] = "%-d"; // 9 datetimeToCodes["hour24"] = "%H"; // 14 datetimeToCodes["hour"] = "%H"; // 14 datetimeToCodes["hour12"] = "%I"; // 02 diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml index d5e0808000..33fccbedcc 100644 --- a/indra/newview/skins/default/xui/pt/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml @@ -94,6 +94,7 @@ <menu_item_call label="Scripts em modo não execução" name="Set Scripts to Not Running"/> </menu> <menu label="Opções" name="Options"> + <menu_item_call label="Autorizações de upload padrão" name="perm prefs"/> <menu_item_check label="Mostrar permissões avançadas" name="DebugPermissions"/> <menu_item_check label="Só selecionar meus objetos" name="Select Only My Objects"/> <menu_item_check label="Só selecionar objetos móveis" name="Select Only Movable Objects"/> @@ -111,7 +112,6 @@ <menu_item_call label="Som (L$[COST])..." name="Upload Sound"/> <menu_item_call label="Animação (L$[COST])..." name="Upload Animation"/> <menu_item_call label="Volume (L$[COST] por arquivo)..." name="Bulk Upload"/> - <menu_item_call label="Autorizações de upload padrão" name="perm prefs"/> </menu> </menu> <menu label="Ajuda" name="Help"> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index 2a1b5f995a..a6645d8b13 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -356,7 +356,7 @@ Tem certeza de que quer prosseguir? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Apagar"/> </notification> <notification name="DeleteOutfits"> - Excluir o look selecionado? + Excluir look(s) selecionado(s)? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="PromptGoToEventsPage"> @@ -2729,7 +2729,7 @@ Avatar '[NAME]' saiu totalmente carregado. </notification> <notification name="AvatarRezSelfBakeNotification"> ( [EXISTENCE] segundos de vida ) -Você carregou uma textura com [RESOLUTION] para o(a) '[BODYREGION]' em [TIME] segundos. +[ACTION] de textura com [RESOLUTION] para o(a) '[BODYREGION]' em [TIME] segundos. </notification> <notification name="ConfirmLeaveCall"> Tem certeza de que quer sair desta ligação? @@ -2767,4 +2767,7 @@ Se você continuar a receber esta mensagem, consulte o [SUPPORT_SITE]. Se você tem um terreno, seu terreno pode ser seu início. Outra opção é procurar por lugares com a tag 'Infohub' no mapa. </global> + <global name="You died and have been teleported to your home location"> + Você morreu e foi reenviado ao seu início. + </global> </notifications> diff --git a/indra/newview/skins/default/xui/pt/panel_group_notices.xml b/indra/newview/skins/default/xui/pt/panel_group_notices.xml index 9ccb85cdf6..21136d06fb 100644 --- a/indra/newview/skins/default/xui/pt/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/pt/panel_group_notices.xml @@ -18,7 +18,7 @@ Cada grupo pode enviar no máximo 200 avisos/dia <text name="notice_list_none_found"> Nenhum resultado foi encontrado. </text> - <button label="Criar um novo aviso" label_selected="Criar nova notícia" name="create_new_notice" tool_tip="Criar um novo aviso"/> + <button label="Novo aviso" label_selected="Criar nova notícia" name="create_new_notice" tool_tip="Criar um novo aviso"/> <button label="Atualizar" label_selected="Atualizar lista" name="refresh_notices" tool_tip="Atualizar lista de avisos"/> <panel label="Criar nova notícia" name="panel_create_new_notice"> <text name="lbl"> diff --git a/indra/newview/skins/default/xui/pt/panel_group_roles.xml b/indra/newview/skins/default/xui/pt/panel_group_roles.xml index 9c3792ec43..c861e29624 100644 --- a/indra/newview/skins/default/xui/pt/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/pt/panel_group_roles.xml @@ -11,6 +11,9 @@ <panel.string name="help_text"> Você pode adicionar ou remover as funções designadas aos membros. Selecione vários membros, segurando a tecla Ctrl e clicando em seus nomes. </panel.string> + <panel.string name="donation_area"> + [AREA] m² + </panel.string> <filter_editor label="Filtrar por membro" name="filter_input"/> <name_list bottom_delta="-105" height="104" name="member_list"> <name_list.columns label="Membro" name="name"/> @@ -63,21 +66,15 @@ Há uma grande variedade de habilidades. <text name="static"> Nome da função </text> - <line_editor name="role_name"> - Empregados - </line_editor> + <line_editor name="role_name"/> <text name="static3"> Título da função </text> - <line_editor name="role_title"> - (esperando) - </line_editor> + <line_editor name="role_title"/> <text name="static2"> Descrição </text> - <text_editor name="role_description"> - (esperando) - </text_editor> + <text_editor name="role_description"/> <text name="static4"> Cargos desempenhados </text> @@ -88,9 +85,6 @@ Há uma grande variedade de habilidades. <scroll_list name="role_allowed_actions" tool_tip="Clique na guia Funções para ver mais detalhes"/> </panel> <panel name="actions_footer"> - <text name="static"> - Descrição da função - </text> <text_editor name="action_description"> Essa habilidade permite tirar alguem do grupo. Somente o dono do grupo poderá retirar outro dono do grupo. </text_editor> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml index 43c970841a..5be07f4d1f 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml @@ -11,8 +11,8 @@ <check_box label="Ativado" name="enable_media"/> <slider label="Bate-papo de voz" name="Voice Volume"/> <check_box label="Ativado" name="enable_voice_check"/> - <check_box label="Autorizar auto-play de mídias" name="media_auto_play_btn" tool_tip="Marque esta opção para auto-executar mídias, se elas quiserem"/> - <check_box label="Tocar mídia anexada em outros avatares" name="media_show_on_others_btn" tool_tip="Desmarque esta opção para ocultar mídias anexadas em avatares por perto"/> + <check_box label="Autorizar auto-play de mídias" name="media_auto_play_btn" tool_tip="Marque esta opção para auto-executar mídias, se elas quiserem" value="true"/> + <check_box label="Tocar mídia anexada em outros avatares" name="media_show_on_others_btn" tool_tip="Desmarque esta opção para ocultar mídias anexadas em avatares por perto" value="true"/> <text name="voice_chat_settings"> Configuração de bate-papo de voz </text> @@ -28,6 +28,12 @@ <panel.string name="default_text"> Padrão </panel.string> + <panel.string name="default system device"> + Dispositivo padrão do sistema + </panel.string> + <panel.string name="no device"> + Nenhum + </panel.string> <text name="Input"> Entrada </text> diff --git a/indra/newview/skins/default/xui/pt/panel_teleport_history.xml b/indra/newview/skins/default/xui/pt/panel_teleport_history.xml index ba83fee7ba..b77064a1ff 100644 --- a/indra/newview/skins/default/xui/pt/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/pt/panel_teleport_history.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="Teleport History"> <accordion name="history_accordion"> + <no_matched_tabs_text name="no_matched_teleports_msg" value="Não encontrou o que procura? Tente fazer uma [secondlife:///app/search/groups/[SEARCH_TERM] Busca]."/> + <no_visible_tabs_text name="no_teleports_msg" value="Histórico de teletransportes vazio. Tente fazer uma [secondlife:///app/search/groups Busca]."/> <accordion_tab name="today" title="Hoje"/> <accordion_tab name="yesterday" title="Ontem"/> <accordion_tab name="2_days_ago" title="2 dias atrás"/> - 5 <accordion_tab name="3_days_ago" title="3 dias atrás"/> <accordion_tab name="4_days_ago" title="4 dias atrás"/> <accordion_tab name="5_days_ago" title="5 dias atrás"/> diff --git a/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml index d2050f4660..5af3a73d3d 100644 --- a/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml @@ -23,8 +23,7 @@ </panel.string> <text name="title" value="Perfil do item"/> <text name="origin" value="(Inventário)"/> - <panel label="" - name="item_profile"> + <panel label="" name="item_profile"> <text name="LabelItemNameTitle"> Nome: </text> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index f0a4a4e2a6..4bf2bda248 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -645,6 +645,9 @@ <string name="worldmap_offline"> Offline </string> + <string name="worldmap_item_tooltip_format"> + L$[PRICE] por [AREA] m² + </string> <string name="worldmap_results_none_found"> Nenhum encontrado. </string> @@ -1034,6 +1037,7 @@ <string name="AnimFlagStop" value="Parar animação"/> <string name="AnimFlagStart" value="Iniciar animação"/> <string name="Wave" value="Acenar"/> + <string name="GestureActionNone" value="Nenhum"/> <string name="HelloAvatar" value="Olá, avatar!"/> <string name="ViewAllGestures" value="Ver todos>>"/> <string name="GetMoreGestures" value="Mais >>"/> @@ -1116,12 +1120,12 @@ <string name="InvFolder Favorite"> Favoritos </string> - <string name="InvFolder favorite"> - Favoritos - </string> <string name="InvFolder Current Outfit"> Look atual </string> + <string name="InvFolder Initial Outfits"> + Looks iniciais + </string> <string name="InvFolder My Outfits"> Meus looks </string> @@ -1441,6 +1445,7 @@ <string name="SummaryForTheWeek" value="Resumo para esta semana, com início em"/> <string name="NextStipendDay" value="Próximo dia de salário é"/> <string name="GroupIndividualShare" value="Grupo Divisão individualI"/> + <string name="GroupColumn" value="Grupo"/> <string name="Balance"> Balanço </string> @@ -1654,6 +1659,12 @@ <string name="BusyModeResponseDefault"> O residente para o qual escreveu está no modo 'ocupado', ou seja, ele prefere não receber nada no momento. Sua mensagem será exibida como uma MI mais tarde. </string> + <string name="NoOutfits"> + Você ainda não tem nenhum look. Tente encontrar um na [secondlife:///app/search/groups Busca]. + </string> + <string name="NoOutfitsTabsMatched"> + Não encontrou o que procura? Tente fazer uma [secondlife:///app/search/people/[SEARCH_TERM] Busca]. + </string> <string name="MuteByName"> (por nome) </string> @@ -3573,6 +3584,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="group_role_owners"> Proprietários </string> + <string name="group_member_status_online"> + Conectado + </string> <string name="uploading_abuse_report"> Carregando... @@ -3626,9 +3640,15 @@ Denunciar abuso <string name="Invalid Wearable"> Item inválido </string> + <string name="New Gesture"> + Novo gesto + </string> <string name="New Script"> Novo script </string> + <string name="New Note"> + Nova nota + </string> <string name="New Folder"> Nova pasta </string> @@ -3686,6 +3706,15 @@ Denunciar abuso <string name="Male - Wow"> Wow - masculino </string> + <string name="Female - Chuckle"> + Engraçado - Feminino + </string> + <string name="Female - Cry"> + Chorar - Feminino + </string> + <string name="Female - Embarrassed"> + Com vergonha - Feminino + </string> <string name="Female - Excuse me"> Perdão - fem </string> @@ -3704,9 +3733,21 @@ Denunciar abuso <string name="Female - Hey"> Ôpa - feminino </string> + <string name="Female - Hey baby"> + E aí, beliza? - Feminino + </string> <string name="Female - Laugh"> Risada - feminina </string> + <string name="Female - Looking good"> + Que chique - Feminino + </string> + <string name="Female - Over here"> + Acenar - Feminino + </string> + <string name="Female - Please"> + Por favor - Feminino + </string> <string name="Female - Repulsed"> Quero distância! - feminino </string> @@ -3756,4 +3797,46 @@ Denunciar abuso <string name="dateTimePM"> PM </string> + <string name="LocalEstimateUSD"> + US$ [AMOUNT] + </string> + <string name="Membership"> + Plano + </string> + <string name="Roles"> + Cargos + </string> + <string name="Group Identity"> + Identidade do lote + </string> + <string name="Parcel Management"> + Gestão do lote + </string> + <string name="Parcel Identity"> + ID do lote + </string> + <string name="Parcel Settings"> + Configurações do lote + </string> + <string name="Parcel Powers"> + Poderes do lote + </string> + <string name="Parcel Access"> + Acesso ao lote + </string> + <string name="Parcel Content"> + Conteúdo do lote + </string> + <string name="Object Management"> + Gestão de objetos + </string> + <string name="Accounting"> + Contabilidade + </string> + <string name="Notices"> + Avisos + </string> + <string name="Chat"> + Bate-papo + </string> </strings> diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp index 7a544debb2..166905c37c 100644 --- a/indra/test_apps/llplugintest/llmediaplugintest.cpp +++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp @@ -961,6 +961,23 @@ mediaPanel* LLMediaPluginTest::findMediaPanel( LLPluginClassMedia* source ) //////////////////////////////////////////////////////////////////////////////// // +mediaPanel* LLMediaPluginTest::findMediaPanel( const std::string &target_name ) +{ + mediaPanel *result = NULL; + + for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel ) + { + if ( mMediaPanels[ panel ]->mTarget == target_name ) + { + result = mMediaPanels[ panel ]; + } + } + + return result; +} + +//////////////////////////////////////////////////////////////////////////////// +// void LLMediaPluginTest::navigateToNewURI( std::string uri ) { if ( uri.length() ) @@ -1571,7 +1588,7 @@ std::string LLMediaPluginTest::pluginNameFromMimeType( std::string& mime_type ) //////////////////////////////////////////////////////////////////////////////// // -void LLMediaPluginTest::addMediaPanel( std::string url ) +mediaPanel* LLMediaPluginTest::addMediaPanel( std::string url ) { // Get the plugin filename using the URL std::string mime_type = mimeTypeFromUrl( url ); @@ -1603,7 +1620,7 @@ void LLMediaPluginTest::addMediaPanel( std::string url ) if (NULL == getcwd( cwd, FILENAME_MAX - 1 )) { std::cerr << "Couldn't get cwd - probably too long - failing to init." << std::endl; - return; + return NULL; } std::string user_data_path = std::string( cwd ) + "/"; #endif @@ -1673,6 +1690,8 @@ void LLMediaPluginTest::addMediaPanel( std::string url ) std::cout << "Adding new media panel for " << url << "(" << media_width << "x" << media_height << ") with index " << panel->mId << " - total panels = " << mMediaPanels.size() << std::endl; } + + return panel; } //////////////////////////////////////////////////////////////////////////////// @@ -1778,15 +1797,15 @@ void LLMediaPluginTest::updateMediaPanel( mediaPanel* panel ) //////////////////////////////////////////////////////////////////////////////// // -void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url ) +mediaPanel* LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url ) { // no media panels so we can't change anything - have to add if ( mMediaPanels.size() == 0 ) - return; + return NULL; // sanity check if ( ! panel ) - return; + return NULL; int index; for(index = 0; index < (int)mMediaPanels.size(); index++) @@ -1798,7 +1817,7 @@ void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url ) if(index >= (int)mMediaPanels.size()) { // panel isn't in mMediaPanels - return; + return NULL; } std::cout << "Replacing media panel with index " << panel->mId << std::endl; @@ -1840,7 +1859,7 @@ void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url ) if (NULL == getcwd( cwd, FILENAME_MAX - 1 )) { std::cerr << "Couldn't get cwd - probably too long - failing to init." << std::endl; - return; + return NULL; } std::string user_data_path = std::string( cwd ) + "/"; #endif @@ -1880,6 +1899,8 @@ void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url ) // load and start the URL panel->mMediaSource->loadURI( url ); panel->mMediaSource->start(); + + return panel; } //////////////////////////////////////////////////////////////////////////////// @@ -2139,7 +2160,46 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e break; case MEDIA_EVENT_CLICK_LINK_HREF: - std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, uri is " << self->getClickURL() << std::endl; + { + std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, uri is " << self->getClickURL() << ", target is " << self->getClickTarget() << std::endl; + // retrieve the event parameters + std::string url = self->getClickURL(); + std::string target = self->getClickTarget(); + U32 target_type = self->getClickTargetType(); + + switch (target_type) + { + case LLPluginClassMedia::TARGET_NONE: + // ignore this click + break; + + case LLPluginClassMedia::TARGET_EXTERNAL: + // this should open in an external browser, but since this is a test app we don't care. + break; + + case LLPluginClassMedia::TARGET_BLANK: + // Create a new panel with the specified URL. + addMediaPanel(url); + break; + + case LLPluginClassMedia::TARGET_OTHER: + mediaPanel *target_panel = findMediaPanel(target); + if(target_panel) + { + target_panel = replaceMediaPanel(target_panel, url); + } + else + { + target_panel = addMediaPanel(url); + } + + if(target_panel) + { + target_panel->mTarget = target; + } + break; + } + } break; case MEDIA_EVENT_CLICK_LINK_NOFOLLOW: diff --git a/indra/test_apps/llplugintest/llmediaplugintest.h b/indra/test_apps/llplugintest/llmediaplugintest.h index 5d08e42148..ecd6cbfc4f 100644 --- a/indra/test_apps/llplugintest/llmediaplugintest.h +++ b/indra/test_apps/llplugintest/llmediaplugintest.h @@ -56,6 +56,7 @@ struct mediaPanel int mId; std::string mStartUrl; std::string mMimeType; + std::string mTarget; LLPluginClassMedia *mMediaSource; int mMediaWidth; int mMediaHeight; @@ -96,16 +97,17 @@ class LLMediaPluginTest : public LLPluginClassMediaOwner void draw( int draw_type ); void windowPosToTexturePos( int window_x, int window_y, int& media_x, int& media_y, int& id ); - void addMediaPanel( std::string url ); + mediaPanel* addMediaPanel( std::string url ); void updateMediaPanel( mediaPanel* panel ); void remMediaPanel( mediaPanel* panel ); - void replaceMediaPanel( mediaPanel* panel, std::string url ); + mediaPanel* replaceMediaPanel( mediaPanel* panel, std::string url ); void getRandomMediaSize( int& width, int& height, std::string mime_type ); void navigateToNewURI( std::string uri ); void initUrlHistory( std::string uri ); void selectPanelById( int id ); void selectPanel( mediaPanel* panel ); mediaPanel* findMediaPanel( LLPluginClassMedia* panel ); + mediaPanel* findMediaPanel( const std::string &target_name ); void makePickTexture( int id, GLuint* texture_handle, unsigned char** texture_pixels ); void makeChrome(); void resetView(); |