diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 192fc58e23..d797315272 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -17968,15 +17968,13 @@ Change of this parameter will affect the layout of buttons in notification toast
DebugWebRTCRequireEstablishedSpatialSession
Comment
- Test for FIRE-36672
+ Only report proximal channel when a spatial session is established (FIRE-36672)
Persist
1
Type
Boolean
Value
- 0
- Backup
- 0
+ 1
VivoxVoiceHost
diff --git a/indra/newview/fsfloatergrouptitles.cpp b/indra/newview/fsfloatergrouptitles.cpp
index 7334d852cf..3629a0f848 100644
--- a/indra/newview/fsfloatergrouptitles.cpp
+++ b/indra/newview/fsfloatergrouptitles.cpp
@@ -106,7 +106,8 @@ bool FSFloaterGroupTitles::postBuild()
mSetRegionButton = getChild("btnSetRegion");
mSetRegionManualButton = getChild("btnSetRegionManual");
mClearRegionButton = getChild("btnClearRegion");
- mNoneOnUnassigned = getChild("none_on_unassigned");
+ mSetDefaultButton = getChild("btnSetDefault");
+ mUseDefaultCheck = getChild("use_default_title");
mTitleList = getChild("title_list");
mFilterEditor = getChild("filter_input");
@@ -116,19 +117,21 @@ bool FSFloaterGroupTitles::postBuild()
mSetRegionButton->setCommitCallback(boost::bind(&FSFloaterGroupTitles::onSetRegion, this));
mSetRegionManualButton->setCommitCallback(boost::bind(&FSFloaterGroupTitles::onSetRegionManual, this));
mClearRegionButton->setCommitCallback(boost::bind(&FSFloaterGroupTitles::onClearRegion, this));
- mNoneOnUnassigned->setCommitCallback(boost::bind(&FSFloaterGroupTitles::onNoneOnUnassignedToggle, this));
+ mSetDefaultButton->setCommitCallback(boost::bind(&FSFloaterGroupTitles::onSetAsDefault, this));
+ mUseDefaultCheck->setCommitCallback(boost::bind(&FSFloaterGroupTitles::onUseDefaultToggle, this));
mTitleList->setDoubleClickCallback(boost::bind(&FSFloaterGroupTitles::activateGroupTitle, this));
mTitleList->setCommitCallback(boost::bind(&FSFloaterGroupTitles::selectedTitleChanged, this));
mFilterEditor->setCommitCallback(boost::bind(&FSFloaterGroupTitles::onFilterEdit, this, _2));
- mNoneOnUnassigned->set(FSGroupTitleRegionMgr::getInstance()->getNoneOnUnassigned());
mSetRegionButton->setEnabled(false);
mSetRegionManualButton->setEnabled(false);
mClearRegionButton->setEnabled(false);
+ mSetDefaultButton->setEnabled(false);
+ mUseDefaultCheck->set(FSGroupTitleRegionMgr::getInstance()->getEnabled());
mAssignmentsChangedConnection = FSGroupTitleRegionMgr::getInstance()->setAssignmentsChangedCallback([this]() { updateRegionColumn(); });
mTitleList->sortByColumn("title_sort_column", true);
- mTitleList->setFilterColumn(0);
+ mTitleList->setFilterColumn(mTitleList->getColumn("filter_text")->mIndex);
refreshGroupTitles();
@@ -219,6 +222,13 @@ void FSFloaterGroupTitles::addListItem(const LLUUID& group_id, const LLUUID& rol
item["columns"][6]["column"] = "name_sort_column";
item["columns"][6]["type"] = "text";
item["columns"][6]["value"] = (is_group ? ("1_" + group_name) : "0");
+ item["columns"][7]["column"] = "filter_text";
+ item["columns"][7]["type"] = "text";
+ item["columns"][7]["value"] = title + " " + group_name + " " + region_name;
+ item["columns"][8]["column"] = "default_marker";
+ item["columns"][8]["type"] = "icon";
+ item["columns"][8]["halign"] = "center";
+ item["columns"][8]["value"] = LLStringUtil::null;
mTitleList->addElement(item);
@@ -250,6 +260,7 @@ void FSFloaterGroupTitles::processGroupTitleResults(const LLGroupData& group_dat
}
mTitleList->scrollToShowSelected();
+ updateDefaultColumn();
// Remove observer
observer_map_t::iterator found_it = mGroupTitleObserverMap.find(group_data.mID);
@@ -297,6 +308,8 @@ void FSFloaterGroupTitles::refreshGroupTitles()
mGroupTitleObserverMap[group_data.mID] = roleObserver;
LLGroupMgr::getInstance()->sendGroupTitlesRequest(group_data.mID);
}
+
+ updateDefaultColumn();
}
void FSFloaterGroupTitles::selectedTitleChanged()
@@ -311,12 +324,14 @@ void FSFloaterGroupTitles::selectedTitleChanged()
mSetRegionButton->setEnabled(true);
mSetRegionManualButton->setEnabled(true);
mClearRegionButton->setEnabled(has_region);
+ mSetDefaultButton->setEnabled(true);
}
else
{
mSetRegionButton->setEnabled(false);
mSetRegionManualButton->setEnabled(false);
mClearRegionButton->setEnabled(false);
+ mSetDefaultButton->setEnabled(false);
}
}
@@ -442,14 +457,65 @@ void FSFloaterGroupTitles::onClearRegion()
menu->show(screen_x, screen_y, mClearRegionButton);
}
-void FSFloaterGroupTitles::onNoneOnUnassignedToggle()
+void FSFloaterGroupTitles::onUseDefaultToggle()
{
- FSGroupTitleRegionMgr::getInstance()->setNoneOnUnassigned(mNoneOnUnassigned->get());
+ FSGroupTitleRegionMgr::getInstance()->setEnabled(mUseDefaultCheck->get());
+ updateDefaultColumn();
+}
+
+void FSFloaterGroupTitles::onSetAsDefault()
+{
+ LLScrollListItem* selected_item = mTitleList->getFirstSelected();
+ if (!selected_item)
+ {
+ return;
+ }
+ const LLUUID group_id = selected_item->getColumn(mTitleList->getColumn("group_id")->mIndex)->getValue().asUUID();
+ const LLUUID role_id = selected_item->getColumn(mTitleList->getColumn("role_id")->mIndex)->getValue().asUUID();
+ auto* mgr = FSGroupTitleRegionMgr::getInstance();
+ mgr->setDefaultTitle(group_id, role_id);
+ mgr->setEnabled(true);
+ mUseDefaultCheck->set(true);
+ updateDefaultColumn();
+}
+
+void FSFloaterGroupTitles::updateDefaultColumn()
+{
+ LLScrollListColumn* default_col = mTitleList->getColumn("default_marker");
+ if (!default_col)
+ {
+ return;
+ }
+
+ const auto default_col_idx = default_col->mIndex;
+ const auto group_id_col_idx = mTitleList->getColumn("group_id")->mIndex;
+ const auto role_id_col_idx = mTitleList->getColumn("role_id")->mIndex;
+
+ auto* mgr = FSGroupTitleRegionMgr::getInstance();
+ const bool enabled = mgr->getEnabled();
+ const LLUUID default_group = mgr->getDefaultGroupID();
+ const LLUUID default_role = mgr->getDefaultRoleID();
+
+ for (auto* item : mTitleList->getAllData())
+ {
+ auto* cell = item->getColumn(default_col_idx);
+ if (!cell)
+ {
+ continue;
+ }
+ const LLUUID group_id = item->getColumn(group_id_col_idx)->getValue().asUUID();
+ const LLUUID role_id = item->getColumn(role_id_col_idx)->getValue().asUUID();
+ const bool is_default = enabled && group_id == default_group && role_id == default_role;
+ cell->setValue(is_default ? LLSD("Check_Mark") : LLSD(LLStringUtil::null));
+ }
}
void FSFloaterGroupTitles::updateRegionColumn()
{
const auto region_col_idx = mTitleList->getColumn("regionname")->mIndex;
+ const auto title_col_idx = mTitleList->getColumn("grouptitle")->mIndex;
+ const auto group_col_idx = mTitleList->getColumn("groupname")->mIndex;
+ const auto filter_col_idx = mTitleList->getColumn("filter_text")->mIndex;
const auto group_id_col_idx = mTitleList->getColumn("group_id")->mIndex;
const auto role_id_col_idx = mTitleList->getColumn("role_id")->mIndex;
auto* mgr = FSGroupTitleRegionMgr::getInstance();
@@ -457,10 +523,18 @@ void FSFloaterGroupTitles::updateRegionColumn()
{
const auto group_id = item->getColumn(group_id_col_idx)->getValue().asUUID();
const auto role_id = item->getColumn(role_id_col_idx)->getValue().asUUID();
+ const std::string region_name = mgr->getRegionForTitle(group_id, role_id);
if (auto* cell = item->getColumn(region_col_idx))
{
- cell->setValue(mgr->getRegionForTitle(group_id, role_id));
+ cell->setValue(region_name);
+ }
+
+ if (auto* filter_cell = item->getColumn(filter_col_idx))
+ {
+ const std::string title = item->getColumn(title_col_idx)->getValue().asString();
+ const std::string group_name = item->getColumn(group_col_idx)->getValue().asString();
+ filter_cell->setValue(title + " " + group_name + " " + region_name);
}
}
}
diff --git a/indra/newview/fsfloatergrouptitles.h b/indra/newview/fsfloatergrouptitles.h
index 50b0440d1d..782bcb80b0 100644
--- a/indra/newview/fsfloatergrouptitles.h
+++ b/indra/newview/fsfloatergrouptitles.h
@@ -85,7 +85,9 @@ private:
void onSetRegion();
void onSetRegionManual();
void onClearRegion();
- void onNoneOnUnassignedToggle();
+ void onUseDefaultToggle();
+ void onSetAsDefault();
+ void updateDefaultColumn();
void updateRegionColumn();
LLButton* mActivateButton;
@@ -94,7 +96,8 @@ private:
LLButton* mSetRegionButton;
LLButton* mSetRegionManualButton;
LLButton* mClearRegionButton;
- LLCheckBoxCtrl* mNoneOnUnassigned;
+ LLButton* mSetDefaultButton;
+ LLCheckBoxCtrl* mUseDefaultCheck;
LLScrollListCtrl* mTitleList;
LLFilterEditor* mFilterEditor;
diff --git a/indra/newview/fsgrouptitleregionmgr.cpp b/indra/newview/fsgrouptitleregionmgr.cpp
index 2b84296bff..c537659338 100644
--- a/indra/newview/fsgrouptitleregionmgr.cpp
+++ b/indra/newview/fsgrouptitleregionmgr.cpp
@@ -92,7 +92,9 @@ void FSGroupTitleRegionMgr::loadFromDisk()
}
mAssignments.clear();
- mNoneOnUnassigned = false;
+ mEnabled = false;
+ mDefaultGroupID.setNull();
+ mDefaultRoleID.setNull();
mLastAppliedRegion.clear();
const auto filename = getFilename();
@@ -120,7 +122,20 @@ void FSGroupTitleRegionMgr::loadFromDisk()
}
file.close();
- mNoneOnUnassigned = data["none_on_unassigned"].asBoolean();
+ if (data.has("none_on_unassigned"))
+ {
+ mEnabled = data["none_on_unassigned"].asBoolean();
+ }
+
+ if (data.has("default_group_id"))
+ {
+ mDefaultGroupID = data["default_group_id"].asUUID();
+ }
+
+ if (data.has("default_role_id"))
+ {
+ mDefaultRoleID = data["default_role_id"].asUUID();
+ }
if (data.has("assignments") && data["assignments"].isMap())
{
@@ -175,7 +190,9 @@ void FSGroupTitleRegionMgr::saveToDisk()
}
LLSD data;
- data["none_on_unassigned"] = mNoneOnUnassigned;
+ data["none_on_unassigned"] = mEnabled;
+ data["default_group_id"] = mDefaultGroupID;
+ data["default_role_id"] = mDefaultRoleID;
data["assignments"] = assignments;
llofstream file(filename.c_str());
@@ -305,9 +322,24 @@ bool FSGroupTitleRegionMgr::getAssignmentForRegion(const std::string& region_nam
// Preferences
// ---------------------------------------------------------------------------
-void FSGroupTitleRegionMgr::setNoneOnUnassigned(bool enabled)
+void FSGroupTitleRegionMgr::setEnabled(bool enabled)
{
- mNoneOnUnassigned = enabled;
+ if (enabled == mEnabled)
+ {
+ return;
+ }
+ mEnabled = enabled;
+ saveToDisk();
+}
+
+void FSGroupTitleRegionMgr::setDefaultTitle(const LLUUID& group_id, const LLUUID& role_id)
+{
+ if (group_id == mDefaultGroupID && role_id == mDefaultRoleID)
+ {
+ return;
+ }
+ mDefaultGroupID = group_id;
+ mDefaultRoleID = role_id;
saveToDisk();
}
@@ -483,6 +515,41 @@ void FSGroupTitleRegionMgr::onValidationTimeout()
// Region change handler
// ---------------------------------------------------------------------------
+void FSGroupTitleRegionMgr::applyGroupTitle(const LLUUID& group_id, const LLUUID& role_id)
+{
+ if (group_id.notNull() && !gAgent.isInGroup(group_id))
+ {
+ LL_WARNS() << "Requested group title belongs to a group we are no longer in, skipping" << LL_ENDL;
+ return;
+ }
+
+ bool title_already_active = false;
+ if (group_id.notNull())
+ {
+ if (const auto* group_data = LLGroupMgr::getInstance()->getGroupData(group_id))
+ {
+ for (const auto& title : group_data->mTitles)
+ {
+ if (title.mRoleID == role_id && title.mSelected)
+ {
+ title_already_active = true;
+ break;
+ }
+ }
+ }
+ }
+
+ if (group_id.notNull() && !title_already_active)
+ {
+ LLGroupMgr::getInstance()->sendGroupTitleUpdate(group_id, role_id);
+ }
+
+ if (gAgent.getGroupID() != group_id)
+ {
+ LLGroupActions::activate(group_id);
+ }
+}
+
void FSGroupTitleRegionMgr::onRegionChanged()
{
if (!mDataLoaded)
@@ -518,43 +585,16 @@ void FSGroupTitleRegionMgr::onRegionChanged()
LLUUID role_id;
if (getAssignmentForRegion(region_name, group_id, role_id))
{
- if (group_id.notNull() && !gAgent.isInGroup(group_id))
- {
- LL_WARNS() << "Region '" << region->getName() << "' has a title assignment for a group we are no longer in, skipping" << LL_ENDL;
- return;
- }
-
- bool title_already_active = false;
- if (group_id.notNull())
- {
- if (const auto* group_data = LLGroupMgr::getInstance()->getGroupData(group_id))
- {
- for (const auto& title : group_data->mTitles)
- {
- if (title.mRoleID == role_id && title.mSelected)
- {
- title_already_active = true;
- break;
- }
- }
- }
- }
-
- LL_INFOS() << "Region '" << region->getName() << "', switching to assigned group title" << LL_ENDL;
-
- if (group_id.notNull() && !title_already_active)
- {
- LLGroupMgr::getInstance()->sendGroupTitleUpdate(group_id, role_id);
- }
-
- if (gAgent.getGroupID() != group_id)
- {
- LLGroupActions::activate(group_id);
- }
+ LL_DEBUGS() << "Region '" << region->getName() << "' has an assigned group title, applying it" << LL_ENDL;
+ applyGroupTitle(group_id, role_id);
+ return;
}
- else if (mNoneOnUnassigned && gAgent.getGroupID().notNull())
+
+ if (!mEnabled)
{
- LL_INFOS() << "Region '" << region->getName() << "' has no title preset, deactivating group" << LL_ENDL;
- LLGroupActions::activate(LLUUID::null);
+ return;
}
+
+ LL_DEBUGS() << "Region '" << region->getName() << "' is unassigned, applying default group title" << LL_ENDL;
+ applyGroupTitle(mDefaultGroupID, mDefaultRoleID);
}
diff --git a/indra/newview/fsgrouptitleregionmgr.h b/indra/newview/fsgrouptitleregionmgr.h
index 70032b8478..913e3a35cd 100644
--- a/indra/newview/fsgrouptitleregionmgr.h
+++ b/indra/newview/fsgrouptitleregionmgr.h
@@ -59,8 +59,11 @@ public:
std::string getRegionForTitle(const LLUUID& group_id, const LLUUID& role_id) const;
std::vector getRegionDisplayNamesForTitle(const LLUUID& group_id, const LLUUID& role_id) const;
bool getAssignmentForRegion(const std::string& region_name, LLUUID& group_id, LLUUID& role_id) const;
- void setNoneOnUnassigned(bool enabled);
- bool getNoneOnUnassigned() const { return mNoneOnUnassigned; }
+ void setEnabled(bool enabled);
+ bool getEnabled() const { return mEnabled; }
+ void setDefaultTitle(const LLUUID& group_id, const LLUUID& role_id);
+ const LLUUID& getDefaultGroupID() const { return mDefaultGroupID; }
+ const LLUUID& getDefaultRoleID() const { return mDefaultRoleID; }
void showRegionInputDialog(const LLUUID& group_id, const LLUUID& role_id);
static std::string sanitizeRegionName(const std::string& input);
@@ -69,6 +72,7 @@ public:
private:
void validateAndSetAssignment(const LLUUID& group_id, const LLUUID& role_id, const std::string& region_name);
+ void applyGroupTitle(const LLUUID& group_id, const LLUUID& role_id);
void onRegionChanged();
void cancelPendingValidation();
void onValidationResult(U64 region_handle);
@@ -76,7 +80,9 @@ private:
std::string getFilename() const;
static std::string normalizeRegionName(const std::string& name);
static bool onRegionInputCallback(const LLSD& notification, const LLSD& response);
- bool mNoneOnUnassigned = false;
+ bool mEnabled = false;
+ LLUUID mDefaultGroupID;
+ LLUUID mDefaultRoleID;
bool mDataLoaded = false;
std::string mLastAppliedRegion;
diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp
index ede91032c2..8349eb7d15 100644
--- a/indra/newview/llvoicewebrtc.cpp
+++ b/indra/newview/llvoicewebrtc.cpp
@@ -1569,7 +1569,7 @@ void LLWebRTCVoiceClient::processChannels(bool process)
bool LLWebRTCVoiceClient::inProximalChannel()
{
- // Test for FIRE-36672, disabled by default
+ // FIRE-36672: Voice status indicator behavior change
// inSpatialChannel() defaults to true with no session (parcel voice disabled), which keeps the conversation voice indicator green
// Only report proximal when a spatial session is established
static LLCachedControl require_established_session(gSavedSettings, "DebugWebRTCRequireEstablishedSpatialSession", false);
diff --git a/indra/newview/skins/default/xui/az/floater_fs_group_titles.xml b/indra/newview/skins/default/xui/az/floater_fs_group_titles.xml
index d3bbc05c5f..9a1ee80561 100644
--- a/indra/newview/skins/default/xui/az/floater_fs_group_titles.xml
+++ b/indra/newview/skins/default/xui/az/floater_fs_group_titles.xml
@@ -14,5 +14,4 @@
-
diff --git a/indra/newview/skins/default/xui/de/floater_fs_group_titles.xml b/indra/newview/skins/default/xui/de/floater_fs_group_titles.xml
index c028c628a1..c5f3e7cedf 100644
--- a/indra/newview/skins/default/xui/de/floater_fs_group_titles.xml
+++ b/indra/newview/skins/default/xui/de/floater_fs_group_titles.xml
@@ -4,6 +4,7 @@
+
@@ -14,5 +15,6 @@
-
+
+
diff --git a/indra/newview/skins/default/xui/en/floater_fs_group_titles.xml b/indra/newview/skins/default/xui/en/floater_fs_group_titles.xml
index 06db1f907c..b4cccdd316 100644
--- a/indra/newview/skins/default/xui/en/floater_fs_group_titles.xml
+++ b/indra/newview/skins/default/xui/en/floater_fs_group_titles.xml
@@ -36,6 +36,11 @@
right="-5"
left="5"
height="255">
+
+
+ top_pad="6"
+ name="use_default_title"
+ label="Use default title in regions without assignment"
+ tool_tip="When you enter a region with no title assignment, switch to the title marked as default. A default of <No group title> wears no tag."
+ width="350" />
+
diff --git a/indra/newview/skins/default/xui/es/floater_fs_group_titles.xml b/indra/newview/skins/default/xui/es/floater_fs_group_titles.xml
index cbff7bd112..1ca79832a9 100644
--- a/indra/newview/skins/default/xui/es/floater_fs_group_titles.xml
+++ b/indra/newview/skins/default/xui/es/floater_fs_group_titles.xml
@@ -13,5 +13,4 @@
-
diff --git a/indra/newview/skins/default/xui/fr/floater_fs_group_titles.xml b/indra/newview/skins/default/xui/fr/floater_fs_group_titles.xml
index e9c028c8e3..2d58e97d70 100644
--- a/indra/newview/skins/default/xui/fr/floater_fs_group_titles.xml
+++ b/indra/newview/skins/default/xui/fr/floater_fs_group_titles.xml
@@ -13,5 +13,4 @@
-
diff --git a/indra/newview/skins/default/xui/it/floater_fs_group_titles.xml b/indra/newview/skins/default/xui/it/floater_fs_group_titles.xml
index 24a723b202..2e2ad9d2fe 100644
--- a/indra/newview/skins/default/xui/it/floater_fs_group_titles.xml
+++ b/indra/newview/skins/default/xui/it/floater_fs_group_titles.xml
@@ -14,5 +14,4 @@
-
diff --git a/indra/newview/skins/default/xui/ja/floater_fs_group_titles.xml b/indra/newview/skins/default/xui/ja/floater_fs_group_titles.xml
index eaf01f40e4..4a11ca4bea 100644
--- a/indra/newview/skins/default/xui/ja/floater_fs_group_titles.xml
+++ b/indra/newview/skins/default/xui/ja/floater_fs_group_titles.xml
@@ -14,5 +14,4 @@
-
diff --git a/indra/newview/skins/default/xui/pl/floater_fs_group_titles.xml b/indra/newview/skins/default/xui/pl/floater_fs_group_titles.xml
index 67e2663f09..52bf6de09a 100644
--- a/indra/newview/skins/default/xui/pl/floater_fs_group_titles.xml
+++ b/indra/newview/skins/default/xui/pl/floater_fs_group_titles.xml
@@ -4,6 +4,7 @@
+
@@ -14,5 +15,6 @@
-
+
+
diff --git a/indra/newview/skins/default/xui/pt/floater_fs_group_titles.xml b/indra/newview/skins/default/xui/pt/floater_fs_group_titles.xml
index 8f1c306b82..2b1b978bbf 100644
--- a/indra/newview/skins/default/xui/pt/floater_fs_group_titles.xml
+++ b/indra/newview/skins/default/xui/pt/floater_fs_group_titles.xml
@@ -14,5 +14,4 @@
-
diff --git a/indra/newview/skins/default/xui/ru/floater_fs_group_titles.xml b/indra/newview/skins/default/xui/ru/floater_fs_group_titles.xml
index 4436b400aa..1e7872cc5a 100644
--- a/indra/newview/skins/default/xui/ru/floater_fs_group_titles.xml
+++ b/indra/newview/skins/default/xui/ru/floater_fs_group_titles.xml
@@ -14,5 +14,4 @@
-
diff --git a/indra/newview/skins/default/xui/zh/floater_ao.xml b/indra/newview/skins/default/xui/zh/floater_ao.xml
index 72a5a9ff37..8b9a573696 100644
--- a/indra/newview/skins/default/xui/zh/floater_ao.xml
+++ b/indra/newview/skins/default/xui/zh/floater_ao.xml
@@ -1,12 +1,8 @@
-
- 未載入設定
-
-
- 未載入動畫
-
-
- 帶有 AO 設定的記事卡&只能拖放到最大化的視窗中。點擊工具圖示可最大化視窗。
-
+ 未載入設定
+ 未載入動畫
+ 帶有 AO 設定的記事卡&只能拖放到最大化的視窗中。點擊工具圖示可最大化視窗。
+ 新建空白動畫集...
+ 複製目前動畫集...
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/zh/floater_fs_area_search.xml b/indra/newview/skins/default/xui/zh/floater_fs_area_search.xml
index 61b6841dec..77461670af 100644
--- a/indra/newview/skins/default/xui/zh/floater_fs_area_search.xml
+++ b/indra/newview/skins/default/xui/zh/floater_fs_area_search.xml
@@ -48,6 +48,7 @@
+
diff --git a/indra/newview/skins/default/xui/zh/floater_fs_contact_set_configuration.xml b/indra/newview/skins/default/xui/zh/floater_fs_contact_set_configuration.xml
index 5c4ae17ab3..4662047693 100644
--- a/indra/newview/skins/default/xui/zh/floater_fs_contact_set_configuration.xml
+++ b/indra/newview/skins/default/xui/zh/floater_fs_contact_set_configuration.xml
@@ -17,7 +17,10 @@
全域設定:
+
+
+
在線通知:
diff --git a/indra/newview/skins/default/xui/zh/floater_fs_group_titles.xml b/indra/newview/skins/default/xui/zh/floater_fs_group_titles.xml
index 42302ba902..93941e39e0 100644
--- a/indra/newview/skins/default/xui/zh/floater_fs_group_titles.xml
+++ b/indra/newview/skins/default/xui/zh/floater_fs_group_titles.xml
@@ -14,5 +14,4 @@
-
diff --git a/indra/newview/skins/default/xui/zh/floater_preview_notecard.xml b/indra/newview/skins/default/xui/zh/floater_preview_notecard.xml
index ad3c8bc9b0..53f715679c 100644
--- a/indra/newview/skins/default/xui/zh/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/zh/floater_preview_notecard.xml
@@ -17,10 +17,7 @@
-
+
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_colors.xml b/indra/newview/skins/default/xui/zh/panel_preferences_colors.xml
index e614fbfb28..cb312b9b2c 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_colors.xml
@@ -16,6 +16,7 @@
網址
網址路徑
管理
+ 來自伺服器的群組聊天記錄
發件人:
化身
物件