diff --git a/Gemfile.lock b/Gemfile.lock
index 2288987d..94755cfa 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -17,17 +17,17 @@ GEM
artifactory (3.0.15)
atomos (0.1.3)
aws-eventstream (1.2.0)
- aws-partitions (1.551.0)
- aws-sdk-core (3.125.5)
+ aws-partitions (1.554.0)
+ aws-sdk-core (3.126.0)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.525.0)
aws-sigv4 (~> 1.1)
jmespath (~> 1.0)
- aws-sdk-kms (1.53.0)
- aws-sdk-core (~> 3, >= 3.125.0)
+ aws-sdk-kms (1.54.0)
+ aws-sdk-core (~> 3, >= 3.126.0)
aws-sigv4 (~> 1.1)
- aws-sdk-s3 (1.111.3)
- aws-sdk-core (~> 3, >= 3.125.0)
+ aws-sdk-s3 (1.112.0)
+ aws-sdk-core (~> 3, >= 3.126.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4)
aws-sigv4 (1.4.0)
@@ -86,7 +86,7 @@ GEM
escape (0.0.4)
ethon (0.15.0)
ffi (>= 1.15.0)
- excon (0.90.0)
+ excon (0.91.0)
faraday (1.9.3)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
@@ -116,7 +116,7 @@ GEM
faraday_middleware (1.2.0)
faraday (~> 1.0)
fastimage (2.2.6)
- fastlane (2.203.0)
+ fastlane (2.204.2)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@@ -155,8 +155,8 @@ GEM
xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3)
- fastlane-plugin-json (1.0.0)
- fastlane-plugin-sentry (1.11.0)
+ fastlane-plugin-json (1.1.0)
+ fastlane-plugin-sentry (1.11.1)
fastlane-plugin-versioning_android (0.1.0)
fastlane-plugin-yarn (1.2)
ffi (1.15.4)
diff --git a/package.json b/package.json
index 5c0627f1..17bf8d9c 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
"native": "220206",
"major": 3,
"minor": 4,
- "patch": 1,
+ "patch": 2,
"expo": "44.0.0"
},
"description": "tooot app for Mastodon",
diff --git a/src/components/Timeline/Shared/Filtered.tsx b/src/components/Timeline/Shared/Filtered.tsx
index c1dc2afd..82c8f2e9 100644
--- a/src/components/Timeline/Shared/Filtered.tsx
+++ b/src/components/Timeline/Shared/Filtered.tsx
@@ -46,7 +46,7 @@ export const shouldFilter = ({
let shouldFilter = false
if (!ownAccount) {
const parser = new htmlparser2.Parser({
- ontext (text: string) {
+ ontext: (text: string) => {
const checkFilter = (filter: Mastodon.Filter) => {
const escapedPhrase = filter.phrase.replace(
/[.*+?^${}()|[\]\\]/g,
@@ -54,7 +54,7 @@ export const shouldFilter = ({
) // $& means the whole matched string
switch (filter.whole_word) {
case true:
- if (new RegExp('\\b' + escapedPhrase + '\\b').test(text)) {
+ if (new RegExp('\\B' + escapedPhrase + '\\B').test(text)) {
shouldFilter = true
}
break
diff --git a/src/i18n/en/screens/tabs.json b/src/i18n/en/screens/tabs.json
index 79d5b652..838c2802 100644
--- a/src/i18n/en/screens/tabs.json
+++ b/src/i18n/en/screens/tabs.json
@@ -240,6 +240,9 @@
"cancel": "$t(common:buttons.cancel)"
}
},
+ "feedback": {
+ "heading": "Feature Requests"
+ },
"support": {
"heading": "Support tooot"
},
diff --git a/src/i18n/vi/components/parse.json b/src/i18n/vi/components/parse.json
index 3240627b..ccfb69d0 100644
--- a/src/i18n/vi/components/parse.json
+++ b/src/i18n/vi/components/parse.json
@@ -1,8 +1,8 @@
{
"HTML": {
"expanded": {
- "true": "Thu gọn {{hint}}",
- "false": "Mở rộng {{hint}}"
+ "true": "Cuộn {{hint}}",
+ "false": "Mở {{hint}}"
},
"defaultHint": "Tút"
}
diff --git a/src/i18n/vi/components/relativeTime.json b/src/i18n/vi/components/relativeTime.json
index 501807fe..c5fffdb1 100644
--- a/src/i18n/vi/components/relativeTime.json
+++ b/src/i18n/vi/components/relativeTime.json
@@ -2,7 +2,7 @@
"strings": {
"prefixAgo": "",
"prefixFromNow": "",
- "suffixAgo": "trước",
+ "suffixAgo": " trước",
"suffixFromNow": "",
"seconds": "%d giây",
"minute": "một phút",
diff --git a/src/i18n/vi/components/timeline.json b/src/i18n/vi/components/timeline.json
index 2e4d305c..2adc2b90 100644
--- a/src/i18n/vi/components/timeline.json
+++ b/src/i18n/vi/components/timeline.json
@@ -27,7 +27,7 @@
"follow_request": "{{name}} yêu cầu theo dõi bạn",
"poll": "Cuộc bình chọn đã kết thúc",
"reblog": {
- "default": "{{name}} đã chia sẻ",
+ "default": "{{name}} chia sẻ",
"notification": "{{name}} chia sẻ tút của bạn"
}
},
@@ -62,7 +62,7 @@
},
"attachment": {
"sensitive": {
- "button": "Hiện nội dung nhạy cảm"
+ "button": "NSFW"
},
"unsupported": {
"text": "Không hỗ trợ định dạng",
@@ -74,14 +74,16 @@
"accessibilityHint": "Đến trang cá nhân {{name}}"
},
"content": {
- "expandHint": "nội dung bị ẩn"
+ "expandHint": "nội dung ẩn"
},
"filtered": "Đã lọc",
"fullConversation": "Xem thêm",
"translate": {
"default": "Dịch",
"succeed": "Dịch bằng {{provider}} từ {{source}}",
- "failed": "Không thể dịch!"
+ "failed": "Không thể dịch!",
+ "source_not_supported": "không hỗ trợ ngôn ngữ tút",
+ "target_not_supported": "Ngôn ngữ đích không hỗ trợ"
},
"header": {
"shared": {
@@ -93,7 +95,7 @@
"accessibilityHint": "Tài khoản"
}
},
- "application": "Đăng bằng {{application}}",
+ "application": "via {{application}}",
"muted": {
"accessibilityLabel": "Đã ẩn tút"
},
@@ -107,7 +109,7 @@
}
},
"conversation": {
- "withAccounts": "Với",
+ "withAccounts": "Với ",
"delete": {
"function": "Xóa nhắn riêng"
}
@@ -146,16 +148,16 @@
},
"share": {
"status": {
- "heading": "Tút",
+ "heading": "Chia sẻ",
"button": "Chia sẻ URL tút"
},
"account": {
- "heading": "Chia sẻ người dùng",
+ "heading": "Chia sẻ",
"button": "Chia sẻ URL người dùng này"
}
},
"status": {
- "heading": "Về tút",
+ "heading": "Đối với tút",
"delete": {
"function": "Xóa tút",
"button": "Xóa tút này"
diff --git a/src/i18n/vi/screens/actions.json b/src/i18n/vi/screens/actions.json
index ff9993c3..e248b0aa 100644
--- a/src/i18n/vi/screens/actions.json
+++ b/src/i18n/vi/screens/actions.json
@@ -5,7 +5,7 @@
"cancel": "$t(common:buttons.cancel)"
},
"notificationsFilter": {
- "heading": "Hiện những dạng thông báo",
+ "heading": "Chỉ hiện thông báo",
"content": {
"follow": "$t(screenTabs:me.push.follow.heading)",
"favourite": "$t(screenTabs:me.push.favourite.heading)",
diff --git a/src/i18n/vi/screens/compose.json b/src/i18n/vi/screens/compose.json
index ebc28f52..09a5ae8e 100644
--- a/src/i18n/vi/screens/compose.json
+++ b/src/i18n/vi/screens/compose.json
@@ -15,7 +15,7 @@
"button": {
"default": "Tút",
"conversation": "Tin nhắn",
- "reply": "Lượt trả lời",
+ "reply": "Trả lời",
"edit": "Tút"
},
"alert": {
@@ -63,7 +63,7 @@
"option": {
"placeholder": {
"accessibilityLabel": "Tùy chọn bình chọn {{index}}",
- "single": "Chỉ được chọn một",
+ "single": "Lựa chọn",
"multiple": "Nhiều lựa chọn"
}
},
@@ -117,7 +117,7 @@
},
"visibility": {
"accessibilityLabel": "Tút thuộc dạng {{visibility}}",
- "title": "Dạng tút",
+ "title": "Kiểu tút",
"options": {
"public": "Công khai",
"unlisted": "Hạn chế",
diff --git a/src/i18n/vi/screens/tabs.json b/src/i18n/vi/screens/tabs.json
index 60ac665b..949d30ef 100644
--- a/src/i18n/vi/screens/tabs.json
+++ b/src/i18n/vi/screens/tabs.json
@@ -53,7 +53,7 @@
"name": "Thông báo đẩy"
},
"profile": {
- "name": "Trang cá nhân"
+ "name": "Cài đặt cá nhân"
},
"profileName": {
"name": "Tên hiển thị mới"
@@ -65,7 +65,7 @@
"name": "Metadata"
},
"settings": {
- "name": "Cài đặt App"
+ "name": "Thiết lập"
},
"switch": {
"name": "Chuyển đổi tài khoản"
@@ -102,22 +102,22 @@
},
"avatar": {
"title": "Ảnh đại diện",
- "description": "Sẽ tự động chuyển còn 400x400px"
+ "description": "Tự động nén xuống 400x400px"
},
"header": {
"title": "Ảnh bìa",
- "description": "Sẽ tự động chuyển còn 1500x1500px"
+ "description": "Tự động nén xuống 1500x500px"
},
"note": {
"title": "Mô tả"
},
"fields": {
"title": "Metadata",
- "total": "{{count}} trường",
- "total_plural": "{{count}} trường"
+ "total": "{{count}} mục",
+ "total_plural": "{{count}} mục"
},
"visibility": {
- "title": "Dạng tút",
+ "title": "Kiểu tút mặc định",
"options": {
"public": "Công khai",
"unlisted": "Hạn chế",
@@ -126,19 +126,19 @@
}
},
"sensitive": {
- "title": "Đăng nội dung nhạy cảm"
+ "title": "Đây là tài khoản NSFW"
},
"lock": {
"title": "Đây là tài khoản riêng tư",
"description": "Tự bạn sẽ phê duyệt người theo dõi"
},
"bot": {
- "title": "Tài khoản bot",
+ "title": "Đây là tài khoản Bot",
"description": "Tài khoản này tự động thực hiện các hành động và không được quản lý bởi người thật"
}
},
"fields": {
- "group": "Nhóm {{index}}",
+ "group": "Mục {{index}}",
"label": "Nhãn",
"content": "Nội dung"
}
@@ -250,13 +250,13 @@
"heading": "Liên hệ tooot"
},
"analytics": {
- "heading": "Đóng góp ý kiến",
- "description": "Chỉ thu thập thông tin không liên quan người dùng"
+ "heading": "Thu thập dữ liệu",
+ "description": "Giúp cải thiện chất lượng app"
},
"version": "Phiên bản {{version}}"
},
"switch": {
- "existing": "Chọn từ màn hình đăng nhập",
+ "existing": "Đã đăng nhập trước đó",
"new": "Đăng nhập máy chủ"
}
},
@@ -283,11 +283,11 @@
},
"search": {
"header": {
- "prefix": "Đang tìm...",
+ "prefix": "Tìm kiếm",
"placeholder": "về..."
},
"empty": {
- "general": "Nhập từ khóa $t(screenTabs:shared.search.sections.accounts)、$t(screenTabs:shared.search.sections.hashtags) hoặc$t(screenTabs:shared.search.sections.statuses)",
+ "general": "Tìm $t(screenTabs:shared.search.sections.accounts), $t(screenTabs:shared.search.sections.hashtags) hoặc $t(screenTabs:shared.search.sections.statuses)",
"advanced": {
"header": "Tìm kiếm nâng cao",
"example": {
@@ -310,12 +310,12 @@
},
"users": {
"accounts": {
- "following": "Đang theo dõi {{count}}",
+ "following": "{{count}} Theo dõi",
"followers": "{{count}} người theo dõi"
},
"statuses": {
- "reblogged_by": "{{count}} người chia sẻ",
- "favourited_by": "{{count}} người thích"
+ "reblogged_by": "{{count}} chia sẻ",
+ "favourited_by": "{{count}} thích"
}
}
}
diff --git a/src/i18n/zh-Hans/screens/tabs.json b/src/i18n/zh-Hans/screens/tabs.json
index 3c9ea0f6..dee9282f 100644
--- a/src/i18n/zh-Hans/screens/tabs.json
+++ b/src/i18n/zh-Hans/screens/tabs.json
@@ -240,6 +240,9 @@
"cancel": "$t(common:buttons.cancel)"
}
},
+ "feedback": {
+ "heading": "功能建议"
+ },
"support": {
"heading": "赞助 tooot 开发"
},
diff --git a/src/screens/Tabs/Me/Settings/Tooot.tsx b/src/screens/Tabs/Me/Settings/Tooot.tsx
index 08456970..06a6cdb9 100644
--- a/src/screens/Tabs/Me/Settings/Tooot.tsx
+++ b/src/screens/Tabs/Me/Settings/Tooot.tsx
@@ -11,7 +11,7 @@ import React from 'react'
import { useTranslation } from 'react-i18next'
import { useSelector } from 'react-redux'
import { getInstanceActive } from '@utils/slices/instancesSlice'
-import { isCandidate, isDevelopment } from '@utils/checkEnvironment'
+import { isDevelopment, isRelease } from '@utils/checkEnvironment'
const SettingsTooot: React.FC = () => {
const instanceActive = useSelector(getInstanceActive)
@@ -21,6 +21,21 @@ const SettingsTooot: React.FC = () => {
return (
+
+ }
+ iconBack='ChevronRight'
+ onPress={() => {
+ analytics('settings_feedback_press')
+ Linking.openURL('https://feedback.tooot.app/')
+ }}
+ />
{
Linking.openURL('https://www.buymeacoffee.com/xmflsct')
}}
/>
- {isDevelopment || isCandidate ? (
+ {isDevelopment || isRelease ? (