summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.tx/config22
-rw-r--r--README.md5
-rw-r--r--app/src/custom/res/values-zh-rTW/strings.xml5
-rw-r--r--app/src/main/res/values-el/strings.xml2
-rw-r--r--app/src/main/res/values-ja/strings.xml7
-rw-r--r--app/src/main/res/values-zh-rTW/strings.xml184
-rwxr-xr-xscripts/fetch-play-metadata.py144
-rwxr-xr-xscripts/prepareForTx.py108
-rw-r--r--src/README.md43
-rw-r--r--src/custom/fastlane/metadata/de/store-meta-de.json5
-rw-r--r--src/custom/fastlane/metadata/el/store-meta-el.json5
-rw-r--r--src/custom/fastlane/metadata/en-US/changelogs/169000.txt9
-rw-r--r--src/custom/fastlane/metadata/en-US/full_description.txt7
-rw-r--r--src/custom/fastlane/metadata/en-US/images/sevenInchScreenshots/1_en-US.pngbin0 -> 162001 bytes
-rw-r--r--src/custom/fastlane/metadata/en-US/images/sevenInchScreenshots/2_en-US.pngbin0 -> 269807 bytes
-rw-r--r--src/custom/fastlane/metadata/en-US/images/sevenInchScreenshots/3_en-US.pngbin0 -> 248841 bytes
-rw-r--r--src/custom/fastlane/metadata/en-US/short_description.txt1
-rw-r--r--src/custom/fastlane/metadata/en-US/title.txt1
-rw-r--r--src/custom/fastlane/metadata/en-US/video.txt (renamed from src/custom/fastlane/metadata/android/README.md)0
-rw-r--r--src/custom/fastlane/metadata/fr/store-meta-fr.json5
-rw-r--r--src/custom/fastlane/metadata/nl/full_description.txt3
-rw-r--r--src/custom/fastlane/metadata/nl/short_description.txt1
-rw-r--r--src/custom/fastlane/metadata/nl/store-meta-nl.json5
-rw-r--r--src/custom/fastlane/metadata/nl/title.txt1
-rw-r--r--src/custom/fastlane/metadata/tr/store-meta-tr.json5
-rw-r--r--src/normal/fastlane/metadata/el/full_description.txt12
-rw-r--r--src/normal/fastlane/metadata/el/short_description.txt2
-rw-r--r--src/normal/fastlane/metadata/el/store-meta-el.json5
-rw-r--r--src/normal/fastlane/metadata/el/title.txt1
-rw-r--r--src/normal/fastlane/metadata/en-US/changelogs/168000.txt8
-rw-r--r--src/normal/fastlane/metadata/en-US/full_description.txt12
-rw-r--r--src/normal/fastlane/metadata/en-US/short_description.txt2
-rw-r--r--src/normal/fastlane/metadata/en-US/title.txt1
-rw-r--r--src/normal/fastlane/metadata/en-US/video.txt (renamed from src/normal/fastlane/metadata/android/README.md)0
-rw-r--r--src/normal/fastlane/metadata/nl-NL/video.txt0
-rw-r--r--src/normal/fastlane/metadata/nl/full_description.txt11
-rw-r--r--src/normal/fastlane/metadata/nl/short_description.txt1
-rw-r--r--src/normal/fastlane/metadata/nl/store-meta-nl.json5
-rw-r--r--src/normal/fastlane/metadata/nl/title.txt1
-rw-r--r--src/normal/fastlane/metadata/tr/full_description.txt12
-rw-r--r--src/normal/fastlane/metadata/tr/short_description.txt2
-rw-r--r--src/normal/fastlane/metadata/tr/store-meta-tr.json5
-rw-r--r--src/normal/fastlane/metadata/tr/title.txt1
-rw-r--r--src/normal/fastlane/metadata/tr/tx-values-tr.json1
44 files changed, 633 insertions, 17 deletions
diff --git a/.tx/config b/.tx/config
index 197fe03a..0ae99599 100644
--- a/.tx/config
+++ b/.tx/config
@@ -1,18 +1,34 @@
[main]
-host = https://www.transifex.com
+host = https://rest.api.transifex.com
lang_map = es_AR: es-rAR, fa_IR: fa-rIR, kn_IN: kn-rIN, pt_BR: pt-rBR, pt_PT: pt-rPT, zh: zh-rCN, zh_TW: zh-rTW, nb: no
-[bitmask.strings]
+[o:otf:p:bitmask:r:strings]
file_filter = app/src/main/res/values-<lang>/strings.xml
minimum_perc = 75
source_file = app/src/main/res/values/strings.xml
source_lang = en
type = ANDROID
+resource_name = Bitmask Android
-[bitmask.riseupvpn]
+[o:otf:p:bitmask:r:riseupvpn]
file_filter = app/src/custom/res/values-<lang>/strings.xml
minimum_perc = 75
source_file = app/src/custom/res/values/strings.xml
source_lang = en
type = ANDROID
+resource_name = RiseupVPN Android
+
+[o:otf:p:bitmask:r:bitmask-playstore-listing]
+source_file = se.leap.bitmasakclient.json
+type = KEYVALUEJSON
+resource_name = Bitmask details in Appstore
+file_filter = src/normal/fastlane/metadata/<lang>/store-meta-<lang>.json
+minimum_perc = 96
+
+[o:otf:p:bitmask:r:riseupvpn-playstore-listing]
+source_file = se.leap.riseupvpn-desc.json
+type = KEYVALUEJSON
+resource_name = RiseupVPN details in Appstore
+file_filter = src/custom/fastlane/metadata/<lang>/store-meta-<lang>.json
+minimum_perc = 96
diff --git a/README.md b/README.md
index e596b192..61384eb6 100644
--- a/README.md
+++ b/README.md
@@ -23,6 +23,7 @@ Please see the [issues](https://0xacab.org/leap/bitmask_android/issues) section
* [Debug APKs](#debug-apks)
* [Release APKs](#release-apks)
* [Signed Release APKs](#signed-release-apks)
+ * [Localization](#localize)
* [Supported Versions](#supported-versions)
* [Acknowledgments](#acknowledgments)
* [Contributing](#contributing)
@@ -198,6 +199,10 @@ You can execute all unit tests from the command line with:
./gradlew testCustomProductionFatReleaseUnitTest testNormalProductionFatReleaseUnitTest
```
+## Localization and translate <a name="Localization"></a>
+
+All the localizations happen in Transifex. How to generate, push, pull the translations are detailed in src/README.md
+
## Supported Versions <a name="supported-versions"></a>
Currently API 16 (Android 4.1) - API 30 (Android 11) are officially supported. Keep backwards compatibility in mind if you plan to contribute new features.
diff --git a/app/src/custom/res/values-zh-rTW/strings.xml b/app/src/custom/res/values-zh-rTW/strings.xml
new file mode 100644
index 00000000..08cb8c08
--- /dev/null
+++ b/app/src/custom/res/values-zh-rTW/strings.xml
@@ -0,0 +1,5 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="donate_message">RiseupVPN 是一項快速而安全的 VPN 服務,由 riseup.net 提供。RiseupVPN 不需要使用者帳號,也不會以任何方式儲存您的資料或追蹤您。本服務完全依賴和您一樣的使用者捐助來運作。請在 https://riseup.net/vpn/donate 提供捐助。 </string>
+ <string name="terms_of_service">使用本程式,代表您已同意 https://riseup.net/tos 的服務條款。本服務是以現狀 (as-is) 提供,不提供任何擔保,並以支援讓世界更美好而工作的人們為宗旨。</string>
+</resources>
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index a56891e0..5c6b6078 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="retry">Ξαναδοκίμασε</string>
+ <string name="retry">Επανάληψη</string>
<string name="repository_url_text">Ο πηγαίος κώδικας είναι διαθέσιμος στο https://0xacab.org/leap/bitmask_android</string>
<string name="leap_tracker">Ο ιχνηλάτης τεχνικών θεμάτων είναι διαθέσιμος στο https://0xacab.org/leap/bitmask_android/issues</string>
<string name="translation_project_text">Οι μεταφράσεις είναι ευπρόσδεκτες. Δείτε τη σελίδα μας στο Transifex στο https://www.transifex.com/projects/p/bitmask/</string>
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 015772ed..b7aa5f61 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -39,7 +39,7 @@
<string name="error_not_valid_password_user_message">8文字以上入力してください。</string>
<string name="error_client_http_user_message">再度実行してください: クライアントHTTPエラー</string>
<string name="error_io_exception_user_message">再度実行してください: I/Oエラー</string>
- <string name="error_json_exception_user_message">再度実行してください: サーバーからのレスポンスが正しくありません</string>
+ <string name="error_json_exception_user_message">再度実行してください: サーバーからの応答が正しくありません</string>
<string name="error_no_such_algorithm_exception_user_message">暗号化アルゴリズムが見つかりません。Androidをアップデートしてください!</string>
<string name="signup_or_login_button">サインアップ/ログイン</string>
<string name="login_button">ログイン</string>
@@ -67,6 +67,9 @@
<string name="authentication_failed_message">認証に失敗しました</string>
<string name="registration_failed_message">登録に失敗しました。</string>
<string name="eip_status_start_pending">接続を初期化中</string>
+ <string name="eip_status_connecting">VPNに接続中</string>
+ <string name="eip_status_unsecured">保護されてない接続</string>
+ <string name="eip_status_secured">保護された接続</string>
<string name="eip_cancel_connect_title">接続をキャンセルしますか?</string>
<string name="eip_cancel_connect_text">試行中の接続があります。それをキャンセルしますか?</string>
<string name="eip.warning.browser_inconsistency">VPN接続をオフにしますか? VPNをオフにすると、お使いのインターネットプロバイダーやローカルネットワークに個人情報を漏洩することがあります。</string>
@@ -193,4 +196,6 @@
<string name="disabled_while_udp_on">UDPがオンの間は無効化されます。</string>
<string name="advanced_settings">詳細な設定</string>
<string name="cancel_connection">切断</string>
+ <string name="unknown_location">未知の場所</string>
+ <string name="splash_footer">LEAPによって開発されました</string>
</resources>
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index fc0eeadd..4d89e775 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -1,48 +1,208 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="retry">重試</string>
+ <string name="repository_url_text">原始碼請參閱 https://0xacab.org/leap/bitmask_android</string>
+ <string name="leap_tracker">議題追蹤 (Issue tracker) 請參閱 https://0xacab.org/leap/bitmask_android/issues</string>
+ <string name="translation_project_text">我們非常歡迎並感謝您提供翻譯。請參閱我們的 Transifex 專案 https://www.transifex.com/projects/p/bitmask/</string>
+ <string name="switch_provider_menu_option">切換服務提供者</string>
<string name="info">資訊</string>
- <string name="show_connection_details">顯示連線的詳細資訊</string>
- <string name="routes_info">路徑: %s</string>
+ <string name="show_connection_details">顯示連線的詳細資料</string>
+ <string name="connection_details">連線詳細資料</string>
+ <string name="routes_info">路由:%s</string>
+ <string name="routes_info6">IPv6 路由:%s</string>
<string name="error_empty_username">使用者名稱不能為空。</string>
+ <string name="cert_from_keystore">已從憑證庫取得 \'%s\' 憑證</string>
+ <string name="provider_label">服務提供者:</string>
+ <string name="provider_label_none">未指定服務提供者</string>
+ <string name="status_unknown">狀態未知。</string>
+ <string name="eip_service_label">加密的 VPN 網路連線</string>
+ <string name="configuration_wizard_title">選擇一個服務提供者</string>
+ <string name="add_provider">新增服務提供者</string>
+ <string name="introduce_new_provider">新增服務提供者</string>
<string name="save">儲存</string>
- <string name="new_provider_uri">網域名</string>
- <string name="username_hint">用戶名</string>
+ <string name="new_provider_uri">網域名稱</string>
+ <string name="valid_url_entered">該 URL 有效</string>
+ <string name="not_valid_url_entered">URL 格式錯誤</string>
+ <string name="provider_details_title">服務提供者詳細資料</string>
+ <string name="use_anonymously_button">匿名使用</string>
+ <string name="username_hint">使用者名稱</string>
+ <string name="username_ask">請輸入您的使用者名稱</string>
<string name="password_ask">請輸入密碼</string>
<string name="password_hint">密碼</string>
<string name="password_match">密碼相符</string>
<string name="password_mismatch">密碼不符</string>
+ <string name="user_message">使用者訊息</string>
<string name="about_fragment_title">關於</string>
- <string name="error_bad_user_password_user_message">不正確的用戶帳號和密碼</string>
+ <string name="exclude_apps_fragment_title">排除於 VPN 之外的程式</string>
+ <string name="error_srp_math_error_user_message">請重試:伺服器運算錯誤</string>
+ <string name="error_bad_user_password_user_message">錯誤的使用者名稱或密碼</string>
+ <string name="error_not_valid_password_user_message">長度必須至少為 8 個字元</string>
+ <string name="error_client_http_user_message">請重試:用戶端 HTTP 錯誤</string>
+ <string name="error_io_exception_user_message">請重試:I/O 錯誤</string>
+ <string name="error_json_exception_user_message">請重試:伺服器回應錯誤</string>
+ <string name="error_no_such_algorithm_exception_user_message">找不到加密演算法。請升級 Android!</string>
+ <string name="signup_or_login_button">註冊/登入</string>
<string name="login_button">登入</string>
+ <string name="login_to_profile">登入設定檔</string>
<string name="logout_button">登出</string>
<string name="signup_button">註冊</string>
+ <string name="create_profile">建立設定檔</string>
+ <string name="setup_provider">設定服務提供者</string>
+ <string name="setup_error_title">設定錯誤</string>
<string name="setup_error_configure_button">設定</string>
<string name="setup_error_close_button">離開</string>
+ <string name="setup_error_text">您選擇的服務提供者於設定 %s 時發生錯誤。\n\n您可以重新指定,或結束程式並於下次啟動時再變更設定。</string>
+ <string name="setup_error_text_custom">設定 %s 時發生錯誤。\n\n您可以重新指定,或結束程式。</string>
+ <string name="server_unreachable_message">無法連線到該伺服器,請再試一次。</string>
+ <string name="error.security.pinnedcertificate">安全性錯誤,請升級程式或選擇其他服務提供者。</string>
+ <string name="malformed_url">這似乎不是 %s 服務提供者。</string>
+ <string name="certificate_error">這不是受信任的 %s 服務提供者。</string>
+ <string name="service_is_down_error">該服務已停止。</string>
+ <string name="configuring_provider">正在設定服務提供者</string>
+ <string name="incorrectly_downloaded_certificate_message">未下載您的匿名憑證</string>
+ <string name="downloading_certificate_message">正在下載 VPN 憑證</string>
+ <string name="updating_certificate_message">正在更新 VPN 憑證</string>
+ <string name="login.riseup.warning">Riseup 使用者必須建立另一個帳戶來使用本 VPN 服務</string>
<string name="succesful_authentication_message">已驗證</string>
- <string name="authentication_failed_message">認證失敗</string>
+ <string name="authentication_failed_message">無法驗證</string>
+ <string name="registration_failed_message">無法註冊</string>
+ <string name="eip_status_start_pending">正在初始化連線</string>
+ <string name="eip_status_connecting">正在連線到 VPN</string>
+ <string name="eip_status_unsecured">不安全的連線</string>
+ <string name="eip_status_secured">安全連線</string>
+ <string name="eip_cancel_connect_title">取消連線?</string>
+ <string name="eip_cancel_connect_text">已在嘗試連線中。您想要取消嗎?</string>
+ <string name="eip.warning.browser_inconsistency">關閉 VPN 連線?當 VPN 關閉時,您的個人資料可能會曝露於網路服務提供者或區域網路。</string>
+ <string name="eip_state_not_connected">未執行!連線不安全!</string>
+ <string name="eip_state_connected">連線安全</string>
+ <string name="provider_problem">該服務提供者似乎出現問題。</string>
+ <string name="try_another_provider">請嘗試使用其他服務提供者,或聯繫您的服務提供者。</string>
<string name="default_username">匿名</string>
+ <string name="logging_in">正在登入</string>
+ <string name="signing_up">正在註冊</string>
<string name="vpn.button.turn.on">開啟</string>
<string name="vpn.button.turn.off">關閉</string>
+ <string name="vpn_button_turn_off_blocking">停止阻擋</string>
+ <string name="vpn_securely_routed">您的流量已使用安全的路由傳輸:</string>
+ <string name="vpn_securely_routed_no_internet">沒有偵測到網際網路連線,當您恢復連線時,我們將使用安全路由來傳輸您的流量:</string>
<string name="log_fragment_title">日誌</string>
<string name="vpn_fragment_title">VPN</string>
<string name="navigation_drawer_open">開啟導航抽屜</string>
<string name="navigation_drawer_close">關閉導航抽屜</string>
+ <string name="action_example">操作範例</string>
<string name="action_settings">設定</string>
- <string name="always_on_vpn">一直啟用 VPN</string>
- <string name="donate_title">捐贈</string>
- <string name="donate_button_donate">捐贈</string>
- <string name="nav_drawer_obfuscated_connection">使用網橋</string>
+ <string name="void_vpn_establish">%s 會封鎖所有連出的網路流量。</string>
+ <string name="void_vpn_error_establish">無法阻擋所有網路流量。</string>
+ <string name="void_vpn_stopped">已停止阻擋所有連出的網路流量。</string>
+ <string name="void_vpn_title">正在阻擋流量</string>
+ <string name="update_provider_details">更新服務提供者的詳細資料</string>
+ <string name="update_certificate">更新憑證</string>
+ <string name="warning_eip_json_corrupted">無法更新服務提供者設定。</string>
+ <string name="eip_json_corrupted_user_message">無法更新服務提供者設定。請於登入後再試一次。</string>
+ <string name="warning_client_parsing_error_gateways">無法辨識服務提供者閘道。對方的設定可能不正確。</string>
+ <string name="warning_corrupted_provider_details">儲存的服務提供者詳細資料已損毀。您可以更新 %s (建議),或使用商用憑證授權機構 (CA) 的憑證來更新服務提供者憑證。</string>
+ <string name="warning_corrupted_provider_cert">儲存的服務提供者憑證無效。您可以更新 %s (建議),或使用商用憑證授權機構 (CA) 的憑證來更新服務提供者憑證。</string>
+ <string name="warning_expired_provider_cert">儲存的服務提供者憑證已過期。您可以更新 %s (建議),或使用商用憑證授權機構 (CA) 的憑證來更新服務提供者憑證。</string>
+ <string name="downloading_vpn_certificate_failed">無法下載 VPN 憑證。請再試一次或選擇其他服務提供者。</string>
+ <string name="vpn_certificate_is_invalid">無效的 VPN 憑證。請嘗試下載新憑證。</string>
+ <string name="vpn_certificate_user_message">該 VPN 憑證無效。請登入以下載新憑證。</string>
+ <string name="save_battery">省電模式</string>
+ <string name="subtitle_save_battery">VPN 熱點開啟時停用</string>
+ <string name="save_battery_message">當您未使用手機時,背景資料傳輸將進入休眠狀態。</string>
+ <string name="always_on_vpn">永久連線的 VPN</string>
+ <string name="subtitle_always_on_vpn">開啟 Android 系統設定</string>
+ <string name="tethering">VPN 熱點</string>
+ <string name="ipv6Firewall">封鎖 IPv6</string>
+ <string name="require_root">需要 root 權限</string>
+ <string name="show_experimental">顯示實驗性功能</string>
+ <string name="hide_experimental">隱藏實驗性功能</string>
+ <string name="experimental_features">實驗性功能</string>
+ <string name="tethering_enabled_message">請先確認已於 <![CDATA[<b>系統設定</b>]]> 啟用網路分享。</string>
+ <string name="tethering_message">透過以下方式與其他裝置分享您的 VPN:</string>
+ <string name="tethering_wifi">Wi-Fi 熱點</string>
+ <string name="tethering_usb">USB 網路分享</string>
+ <string name="tethering_bluetooth">藍牙網路分享</string>
+ <string name="do_not_show_again">不再顯示</string>
+ <string name="always_on_vpn_user_message">若要啟用永久連線的 VPN,請在 Android VPN 設定中點選該圖示 [img src] 並選擇開啟。</string>
+ <string name="always_on_blocking_vpn_user_message">為了最大程度保障您的隱私,您也應該啟用「封鎖未使用 VPN 的連線」選項。</string>
+ <string name="donate_title">捐助</string>
+ <string name="donate_default_message">如果您重視讓使用者與服務提供者皆能輕鬆且安全的通訊,請捐助本服務。</string>
+ <string name="donate_message">LEAP 仰賴捐助及補助來運作。如果您重視讓使用者與服務提供者皆能輕鬆且安全的通訊,請捐助本服務。</string>
+ <string name="donate_button_remind_later">稍後提醒</string>
+ <string name="donate_button_donate">捐助</string>
+ <string name="obfuscated_connection">正在使用混淆連線。</string>
+ <string name="obfuscated_connection_try">正在嘗試使用混淆連線。</string>
+ <string name="nav_drawer_obfuscated_connection">使用橋接</string>
+ <string name="nav_drawer_subtitle_obfuscated_connection">規避 VPN 過濾</string>
+ <string name="warning_exclude_apps_message">請小心設定排除於 VPN 之外的程式。這會曝露您的身分並危害到安全性。</string>
+ <plurals name="subtitle_exclude_apps">
+ <item quantity="other">%d 未受保護的程式</item>
+ </plurals>
+ <string name="warning_no_more_gateways_use_pt">%s 無法連線。原因可能是 VPN 連線被封鎖。您想嘗試使用混淆連線嗎?</string>
+ <string name="warning_no_more_gateways_no_pt">%s 無法連線。您想再試一次嗎?</string>
+ <string name="warning_no_more_gateways_use_ovpn">%s 無法使用混淆的 VPN 連線。您想嘗試使用標準 VPN 連線嗎?</string>
+ <string name="warning_no_more_gateways_manual_gw_selection">%1$s 無法連線到 %2$s。您想嘗試自動連線到最佳地理位置嗎?</string>
+ <string name="warning_option_try_best">嘗試最佳地理位置</string>
+ <string name="warning_option_try_pt">嘗試使用混淆連線</string>
+ <string name="warning_option_try_ovpn">嘗試使用標準連線</string>
+ <string name="vpn_error_establish">Android 無法建立 VPN 服務。</string>
+ <string name="root_permission_error">若無 root 權限,%s 無法執行如 VPN 熱點或 IPv6 防火牆等功能。</string>
+ <string name="qs_enable_vpn">啟動 %s</string>
+ <string name="version_update_found">按這裡以開始下載。</string>
+ <string name="version_update_title">有新版本的 %s 可用。</string>
+ <string name="version_update_apk_description">正在下載新版本的 %s</string>
+ <string name="version_update_download_title">已下載新版本的 %s。</string>
+ <string name="version_update_download_description">按這裡以安裝更新。</string>
+ <string name="version_update_error_pgp_verification">PGP 驗證錯誤。將忽略該下載。</string>
+ <string name="version_update_error">無法更新。</string>
+ <string name="version_update_error_permissions">沒有安裝程式的權限。</string>
+ <string name="gateway_selection_title">選擇地理位置</string>
+ <string name="gateway_selection_recommended_location">建議的地理位置</string>
<string name="gateway_selection_recommended">(建議)</string>
<string name="gateway_selection_manually">手動選擇</string>
<string name="gateway_selection_automatic_location">自動使用最佳的連線</string>
- <string name="gateway_selection_automatic">竹</string>
+ <string name="gateway_selection_automatic">自動</string>
+ <string name="reconnecting">正在重新連線…</string>
+ <string name="tor_starting">正在啟動橋接以規避網路審查…</string>
+ <string name="tor_stopping">正在停止橋接</string>
+ <string name="tor_started">正在使用橋接以規避網路審查</string>
+ <string name="log_conn_done_pt">已連線到可插拔式傳輸</string>
+ <string name="log_conn_pt">正在連線到可插拔式傳輸</string>
+ <string name="log_conn_done">已連線到中繼</string>
+ <string name="log_handshake">正在和中繼交涉連線</string>
+ <string name="log_handshake_done">已完成中繼連線交涉</string>
<string name="log_onehop_create">正在建立加密的目錄連線</string>
+ <string name="log_requesting_status">正在請求網路狀態一致性</string>
+ <string name="log_loading_status">正在載入網路狀態一致性</string>
<string name="log_loading_keys">正在載入授權憑證</string>
- <string name="log_circuit_create">正在建立洋蔥路由迴路</string>
+ <string name="log_requesting_descriptors">正在請求中繼描述元</string>
+ <string name="log_loading_descriptors">正在載入中繼描述元</string>
+ <string name="log_enough_dirinfo">已載入足以建立迴路的目錄資料</string>
+ <string name="log_ap_handshake_done">已和中繼完成建立連線的交涉</string>
+ <string name="log_circuit_create">正在建立 Tor 迴路連線</string>
<string name="log_done">執行</string>
+ <string name="channel_name_tor_service">%s 橋接服務</string>
+ <string name="channel_description_tor_service">設定 %s 時顯示橋接的使用情況。</string>
+ <string name="error_tor_timeout">無法啟動橋接。您想再試一次,或改用未混淆的連線繼續設定 %s 嗎?</string>
+ <string name="retry_unobfuscated">重試使用未混淆的連線</string>
<string name="hide">隱藏</string>
+ <string name="error_network_connection">%s 沒有連線到網際網路。請檢查您的 WiFi 和行動數據設定。</string>
+ <string name="censorship_circumvention">規避網路審查</string>
<string name="use_snowflake">使用 Snowflake</string>
+ <string name="snowflake_description">保護設定程式免於網路審查。</string>
+ <string name="vpn_settings">VPN 設置</string>
+ <string name="prefer_udp">可用時使用 UDP</string>
+ <string name="prefer_udp_subtitle">UDP 於串流時更快速也更好,但並不適用於所有網路。</string>
+ <string name="disabled_while_bridges_on">使用橋接時停用。</string>
+ <string name="hint_bridges">目前只有支援橋接的地理位置可供選擇。</string>
+ <string name="option_disable_bridges">停用橋接</string>
+ <string name="eip_state_insecure">連線不安全</string>
+ <string name="connection_not_connected">您的個人資料可能正曝露於網路服務提供者或區域網路。</string>
+ <string name="eip_state_no_network">您目前沒有連線到網際網路。當您恢復連線時,將自動連線到</string>
+ <string name="eip_state_blocking">%1$s 正在封鎖所有網路流量。</string>
+ <string name="disabled_while_udp_on">UDP 開啟時停用。</string>
<string name="advanced_settings">進階設定</string>
<string name="cancel_connection">中斷連缐</string>
+ <string name="unknown_location">未知的地理位置</string>
+ <string name="splash_footer">由 LEAP 開發</string>
</resources>
diff --git a/scripts/fetch-play-metadata.py b/scripts/fetch-play-metadata.py
new file mode 100755
index 00000000..7c65b648
--- /dev/null
+++ b/scripts/fetch-play-metadata.py
@@ -0,0 +1,144 @@
+import os
+import argparse
+import json
+from googleapiclient.discovery import build
+from google.oauth2 import service_account
+
+# Load API key from environment variable
+api_key = os.environ.get('GOOGLE_PLAY_API_KEY')
+
+# Load command-line arguments
+parser = argparse.ArgumentParser(description='Fetch app details from Google Play Store.')
+parser.add_argument('package_name', help='Package name of the app')
+parser.add_argument('--source-language', action='store_true', help='Fetch app description in source language')
+parser.add_argument('--list-languages', action='store_true', help='List all supported languages')
+parser.add_argument('--extract-details', action='store_true', help='Extract and save app details as JSON')
+parser.add_argument('--extract-changelog', action='store_true', help='Extract and save changelog as JSON')
+args = parser.parse_args()
+
+# Create a service account credentials object
+credentials = service_account.Credentials.from_service_account_file(
+ '/home/kwadronaut/dev/leap/secrets/android-api.json',
+ scopes=['https://www.googleapis.com/auth/androidpublisher']
+)
+
+# Build the service object for the Google Play Developer API
+service = build('androidpublisher', 'v3', credentials=credentials, cache_discovery=False)
+
+# Fetch app details
+def fetch_app_details(package_name, language):
+ # Create a new edit
+ edit_request = service.edits().insert(body={}, packageName=package_name)
+ edit_response = edit_request.execute()
+ edit_id = edit_response['id']
+
+ # Fetch the app listing for the specified language within the edit
+ app_details = service.edits().listings().get(
+ packageName=package_name,
+ editId=edit_id,
+ language=language
+ ).execute()
+
+ # Commit the edit (optional)
+ service.edits().commit(
+ packageName=package_name,
+ editId=edit_id
+ ).execute()
+
+ return app_details, edit_id
+
+# Fetch changelog for a specific version
+def fetch_changelog(package_name, edit_id):
+ # Fetch the tracks for the package
+ tracks = service.edits().tracks().list(packageName=package_name, editId=edit_id).execute()
+ track = tracks['tracks'][0]['track']
+
+ # Fetch the changelog for the track
+ changelog = service.edits().tracks().get(packageName=package_name, editId=edit_id, track=track).execute()
+
+ return changelog
+
+# Package name
+package_name = args.package_name
+
+# Fetch app details
+try:
+ #app_details, edit_id = fetch_app_details(package_name, 'en-US')
+ app_details, edit_id = fetch_app_details(package_name, 'nl-NL')
+ print("App Details:")
+ print(app_details)
+except Exception as e:
+ print("An error occurred:", str(e))
+
+# List all supported languages
+if args.list_languages:
+ try:
+ # Create a new edit
+ edit_request = service.edits().insert(body={}, packageName=package_name)
+ edit_response = edit_request.execute()
+ edit_id = edit_response['id']
+
+ # Fetch the app listings for the edit
+ listings = service.edits().listings().list(packageName=package_name, editId=edit_id).execute()
+ supported_languages = [listing['language'] for listing in listings['listings']]
+ print("Supported Languages:")
+ for language in supported_languages:
+ print(language)
+
+ # Commit the edit
+ service.edits().commit(packageName=package_name, editId=edit_id).execute()
+ except Exception as e:
+ print("An error occurred:", str(e))
+
+# Extract and save app details as JSON
+if args.extract_details:
+ try:
+ # Extract the text fields from app details
+ title = app_details['title']
+ full_description = app_details['fullDescription']
+ short_description = app_details['shortDescription']
+
+ # Create a dictionary to hold the extracted app details
+ extracted_details = {
+ 'title': title,
+ 'full_description': full_description,
+ 'short_description': short_description
+ }
+
+ # Determine the output file path based on the language
+ language = 'en-US' # Update with the desired language
+ json_file_path = f"locale/{language}/transifex.json"
+
+ # Create the output directory if it doesn't exist
+ os.makedirs(os.path.dirname(json_file_path), exist_ok=True)
+
+ # Save the extracted details as JSON
+ with open(json_file_path, 'w', encoding='utf-8') as json_file:
+ json.dump(extracted_details, json_file, ensure_ascii=False, indent=4)
+
+ print(f"App details extracted and saved to {json_file_path} as JSON successfully.")
+ except Exception as e:
+ print("An error occurred:", str(e))
+
+# Extract and save changelog as JSON
+if args.extract_changelog:
+ try:
+ changelog = fetch_changelog(package_name, edit_id)
+ print("Changelog:")
+ print(changelog)
+
+ # Determine the output file path based on the language
+ language = 'en-US' # Update with the desired language
+ json_file_path = f"locale/{language}/transifex.json"
+
+ # Create the output directory if it doesn't exist
+ os.makedirs(os.path.dirname(json_file_path), exist_ok=True)
+
+ # Save the changelog as JSON
+ with open(json_file_path, 'w', encoding='utf-8') as json_file:
+ json.dump(changelog, json_file, ensure_ascii=False, indent=4)
+
+ print(f"Changelog extracted and saved to {json_file_path} as JSON successfully.")
+ except Exception as e:
+ print("An error occurred:", str(e))
+
diff --git a/scripts/prepareForTx.py b/scripts/prepareForTx.py
new file mode 100755
index 00000000..ec4c7314
--- /dev/null
+++ b/scripts/prepareForTx.py
@@ -0,0 +1,108 @@
+#!/usr/bin/env python3
+""
+__author__ = "kwadronaut"
+__copyright__ = "Copyright 2023, LEAP"
+__license__ = "GPL3 or later3 or later3 or later"
+__version__ = "1"
+
+import os
+import re
+import argparse
+import json
+
+# Set the path to the res directory containing different language folders
+main_res_dir = "../app/src/main/res"
+custom_res_dir = "../app/src/custom/res"
+
+# List all valid locale folders in the res directory
+# We don't want to create a translated store listing without localized app
+def list_locales(app_type):
+ locales = []
+ if app_type == "main":
+ res_dir = main_res_dir
+ elif app_type == "custom":
+ res_dir = custom_res_dir
+ else:
+ raise ValueError("Invalid app type. Use 'main' or 'custom'.")
+
+ valid_locale_pattern = re.compile(r'^values-(?P<language>[a-z]{2})(-(?P<script>[a-zA-Z]{4}))?(-r(?P<region>[a-zA-Z]{2}))?$')
+ for folder in os.listdir(res_dir):
+ if valid_locale_pattern.match(folder):
+ locale_code = valid_locale_pattern.match(folder).group(0)
+ locales.append(locale_code)
+ return locales
+
+# Create empty JSON file for each locale metadata directory
+# If there's no file, tx will skip the translations
+def create_metadata_files(locales, app_type):
+ if app_type == "main":
+ metadata_dir = "../src/normal/fastlane/metadata"
+ elif app_type == "custom":
+ metadata_dir = "../src/custom/fastlane/metadata"
+ else:
+ raise ValueError("Invalid app type. Use 'main' or 'custom'.")
+
+ for locale_code in locales:
+ # Remove "values-" prefix from the locale directory name
+ locale_dir_name = locale_code.replace("values-", "")
+ file_path = os.path.join(metadata_dir, locale_dir_name, f"store-meta-{locale_dir_name}.json")
+ if not os.path.exists(file_path): # Check if the file already exists
+ os.makedirs(os.path.dirname(file_path), exist_ok=True)
+ with open(file_path, "w", encoding="utf-8") as file:
+ file.write("{}") # Write an empty JSON object to the file
+
+# Split JSON data and save to separate files for each locale
+def split_json_and_save(locales, metadata_dir):
+ for locale_code in locales:
+ locale_dir_name = locale_code.replace("values-", "")
+ json_file_path = os.path.join(metadata_dir, locale_dir_name, f"store-meta-{locale_dir_name}.json")
+
+ if os.path.exists(json_file_path):
+ with open(json_file_path, "r", encoding="utf-8") as json_file:
+ json_data = json.load(json_file)
+
+ title = json_data.get("title")
+ full_description = json_data.get("full_description")
+ short_description = json_data.get("short_description")
+
+ if title:
+ title_file_path = os.path.join(metadata_dir, locale_dir_name, "title.txt")
+ with open(title_file_path, "w", encoding="utf-8") as title_file:
+ title_file.write(title)
+
+ if full_description:
+ full_description_file_path = os.path.join(metadata_dir, locale_dir_name, "full_description.txt")
+ with open(full_description_file_path, "w", encoding="utf-8") as full_description_file:
+ full_description_file.write(full_description)
+
+ if short_description:
+ short_description_file_path = os.path.join(metadata_dir, locale_dir_name, "short_description.txt")
+ with open(short_description_file_path, "w", encoding="utf-8") as short_description_file:
+ short_description_file.write(short_description)
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description='Create metadata directories and empty JSON files for different locales.')
+ parser.add_argument('app_type', choices=['main', 'custom'], help='Type of the app (main or custom)')
+ args = parser.parse_args()
+
+ if args.app_type == "main":
+ metadata_dir = "../src/normal/fastlane/metadata"
+ elif args.app_type == "custom":
+ metadata_dir = "../src/custom/fastlane/metadata"
+ else:
+ raise ValueError("Invalid app type. Use 'main' or 'custom'.")
+
+ locales_list = list_locales(args.app_type)
+ if locales_list:
+ print("List of Locales:")
+ for locale_code in locales_list:
+ print(locale_code)
+
+ create_metadata_files(locales_list, args.app_type)
+ print(f"Empty JSON files created for each locale in the '{args.app_type}' app.")
+
+ split_json_and_save(locales_list, metadata_dir)
+ print(f"JSON data split and saved to separate files for each locale in the '{args.app_type}' app.")
+ else:
+ print(f"No valid locales found in the '{args.app_type}' app's 'res' directory.")
+
diff --git a/src/README.md b/src/README.md
index dfdcf286..b8155a4b 100644
--- a/src/README.md
+++ b/src/README.md
@@ -1,7 +1,50 @@
+# Updating l10n, metadata, f-droid, google play store
+
# F-Droid compatible fastlane metadata directory
This source folder only contains the generated metadata for f-droid builds for both Bitmask and a custom flavored client.
Currently neither F-Droid nor Fastlane support metadata dirs directly within build flavor dirs of a module, like
`/<module>/src/<buildFlavor>/fastlane/metadata/android/` (which would be preferable).
+Transifex wants 1 file, play store wants 1 file, fastlane uses text files.
Keep an eye on this [issue](https://gitlab.com/fdroid/fdroidserver/-/issues/829) to track the state of the fastlane improvements for F-Droid.
+
+## Updating l10n'ed app store listings
+
+1. Fetch content from google play (en_US) with scripts/fetch-play-metadata.py
+1. Check if there are changes with what fastlane creates in src/normal/fastlane/metadata/..
+1. Use scripts/prepareForTx.py to check what localized app versions exist in the Android app, prepare for transifex upload
+1. tx push se.leap.riseupvpn-desc.json -l en
+1. wait for localization, answer questions, fix wording. Repeat when necessary.
+1. Pull from transifex: tx pull -f --keep-new-files
+1. prepare for upload and store digestion: scripts/prepareForTx.py
+1. use fastlane to push to the google store
+
+## Notes:
+
+Translations that aren't completed (enough), won't be downloaded. Configure in .tx/config
+The scripts create empty json files, because transifex needs them to even check.
+Keep your API tokens at hand.
+You need the tx cli client from transifex, pyton3, ptyhon3-babel
+
+## How to update FROM the google play store:
+
+Install fastlane:
+https://docs.fastlane.tools/getting-started/android/setup/
+update bundle
+
+This will fetch the existing metadata. If you updated something through your browser, you can fetch that. There's no 'merge' functionality!
+You can also use this when adding a new provider.
+
+You need an API token from the Google Play store. If you don't have one yet, we have some links below that should help you get started.
+fastlane supply init -j <YOUR-API-DETAILS.json> -p se.leap.<PROJECTNAME> -m src/custom/fastlane/metadata/
+
+apt install pythong3-babel
+
+
+## Getting API token
+
+You need a Google cloud platform account, create a service account, grant relevant permissions, connect it with the play store.
+https://medium.com/@Codeible/generating-the-json-web-token-for-the-google-play-developer-api-f6be6439b1af
+https://developers.google.com/android-publisher/authorization
+
diff --git a/src/custom/fastlane/metadata/de/store-meta-de.json b/src/custom/fastlane/metadata/de/store-meta-de.json
new file mode 100644
index 00000000..c1ad30cd
--- /dev/null
+++ b/src/custom/fastlane/metadata/de/store-meta-de.json
@@ -0,0 +1,5 @@
+{
+ "title": "RiseupVPN",
+ "full_description": "RiseupVPN ist ein leicht benutzbarer, schneller und sicherer VPN-Dienst von https://riseup.net. RiseupVPN benötigt keinen Benutzer*innenkonto, es speichert keine Logs und keine Daten von dir. Dieser Service wird ausschließlich über Spenden von Nutzer*innen wie dir finanziert.\n\nhttps://riseup.net/vpn/donate",
+ "short_description": "RiseupVPN: anonymes VPN. Unterstützt von Bitmask."
+} \ No newline at end of file
diff --git a/src/custom/fastlane/metadata/el/store-meta-el.json b/src/custom/fastlane/metadata/el/store-meta-el.json
new file mode 100644
index 00000000..35f23c9d
--- /dev/null
+++ b/src/custom/fastlane/metadata/el/store-meta-el.json
@@ -0,0 +1,5 @@
+{
+ "title": "RiseupVPN",
+ "full_description": "Το RiseupVPN είναι μια γρήγορη, εύκολη και ασφαλής υπηρεσία VPN από το https://riseup.net. Δε χρειάζεται λογαριασμός για τη χρήση του RiseupVPN, δε διατηρεί αρχεία καταγραφής και δεν παρακολουθεί με οποιοδήποτε τρόπο. Αυτή η υπηρεσία υποστηρίζεται από δωρεές χρηστών σαν και εσάς.\n\nhttps://riseup.net/vpn/donate. ",
+ "short_description": "RiseupVPN, ανώνυμο VPN. Με την υποστήριξη του Bitmask."
+} \ No newline at end of file
diff --git a/src/custom/fastlane/metadata/en-US/changelogs/169000.txt b/src/custom/fastlane/metadata/en-US/changelogs/169000.txt
new file mode 100644
index 00000000..9cdf3a40
--- /dev/null
+++ b/src/custom/fastlane/metadata/en-US/changelogs/169000.txt
@@ -0,0 +1,9 @@
+Since the last releases were not fully rolled-out, a summary of version 1.1.6 - 1.1.8:
+* updated design
+* improved circumvention capabilities
+* updated dependencies (openvpn, tor, snowflake etc.)
+* updated translations
+* fixed crashes and other bugs
+* support for Message of the Day
+* 1.1.7 fix: hiding debugging entries in settings
+* 1.1.8 fix: uploaded correct google playstore version \ No newline at end of file
diff --git a/src/custom/fastlane/metadata/en-US/full_description.txt b/src/custom/fastlane/metadata/en-US/full_description.txt
new file mode 100644
index 00000000..c4ba7305
--- /dev/null
+++ b/src/custom/fastlane/metadata/en-US/full_description.txt
@@ -0,0 +1,7 @@
+RiseupVPN is an easy, fast, and secure VPN service from https://riseup.net. RiseupVPN does not require a user account, keep logs, or track you in any way. The service is paid for entirely by donations from users like you.
+
+https://riseup.net/vpn/donate
+
+It's developed by LEAP and the open source code can be explored here: https://0xacab.org/leap/bitmask_android
+
+Translations greatly appreciated at our Transifex project: Transifex project https://app.transifex.com/otf/bitmask/dashboard/ \ No newline at end of file
diff --git a/src/custom/fastlane/metadata/en-US/images/sevenInchScreenshots/1_en-US.png b/src/custom/fastlane/metadata/en-US/images/sevenInchScreenshots/1_en-US.png
new file mode 100644
index 00000000..04ad4c9a
--- /dev/null
+++ b/src/custom/fastlane/metadata/en-US/images/sevenInchScreenshots/1_en-US.png
Binary files differ
diff --git a/src/custom/fastlane/metadata/en-US/images/sevenInchScreenshots/2_en-US.png b/src/custom/fastlane/metadata/en-US/images/sevenInchScreenshots/2_en-US.png
new file mode 100644
index 00000000..e7bd728c
--- /dev/null
+++ b/src/custom/fastlane/metadata/en-US/images/sevenInchScreenshots/2_en-US.png
Binary files differ
diff --git a/src/custom/fastlane/metadata/en-US/images/sevenInchScreenshots/3_en-US.png b/src/custom/fastlane/metadata/en-US/images/sevenInchScreenshots/3_en-US.png
new file mode 100644
index 00000000..c8893dee
--- /dev/null
+++ b/src/custom/fastlane/metadata/en-US/images/sevenInchScreenshots/3_en-US.png
Binary files differ
diff --git a/src/custom/fastlane/metadata/en-US/short_description.txt b/src/custom/fastlane/metadata/en-US/short_description.txt
new file mode 100644
index 00000000..1df82a44
--- /dev/null
+++ b/src/custom/fastlane/metadata/en-US/short_description.txt
@@ -0,0 +1 @@
+RiseupVPN, anonymous VPN. Powered by Bitmask. \ No newline at end of file
diff --git a/src/custom/fastlane/metadata/en-US/title.txt b/src/custom/fastlane/metadata/en-US/title.txt
new file mode 100644
index 00000000..8d2e228a
--- /dev/null
+++ b/src/custom/fastlane/metadata/en-US/title.txt
@@ -0,0 +1 @@
+RiseupVPN \ No newline at end of file
diff --git a/src/custom/fastlane/metadata/android/README.md b/src/custom/fastlane/metadata/en-US/video.txt
index e69de29b..e69de29b 100644
--- a/src/custom/fastlane/metadata/android/README.md
+++ b/src/custom/fastlane/metadata/en-US/video.txt
diff --git a/src/custom/fastlane/metadata/fr/store-meta-fr.json b/src/custom/fastlane/metadata/fr/store-meta-fr.json
new file mode 100644
index 00000000..af63f77c
--- /dev/null
+++ b/src/custom/fastlane/metadata/fr/store-meta-fr.json
@@ -0,0 +1,5 @@
+{
+ "title": "RiseupVPN",
+ "full_description": "RiseupVPN est un service VPN facile d'utilisation, rapide et sécurisé proposé par https://riseup.net. RiseupVPN ne nécessite pas de compte utilisateur, ne garde pas d'historique et ne te trace d' aucune manière. Le service est financé entièrement par des dons d'utilisateurs comme toi.\n\nhttps://riseup.net/fr/vpn/donate",
+ "short_description": "RiseupVPN, un VPN anonyme. Basé sur Bitmask."
+} \ No newline at end of file
diff --git a/src/custom/fastlane/metadata/nl/full_description.txt b/src/custom/fastlane/metadata/nl/full_description.txt
new file mode 100644
index 00000000..0a365ed2
--- /dev/null
+++ b/src/custom/fastlane/metadata/nl/full_description.txt
@@ -0,0 +1,3 @@
+RiseupVPN is de gemakkelijke, snelle en veilige VPN van riseup.net. RiseupVPN heeft geen gebruikersaccount nodig, houdt geen logs bij en volgt je geen enkele manier. De dienst wordt volledig betaald door donaties van gebruikers zoals jij.
+
+https://riseup.net/vpn/donate \ No newline at end of file
diff --git a/src/custom/fastlane/metadata/nl/short_description.txt b/src/custom/fastlane/metadata/nl/short_description.txt
new file mode 100644
index 00000000..0e1b3573
--- /dev/null
+++ b/src/custom/fastlane/metadata/nl/short_description.txt
@@ -0,0 +1 @@
+RiseupVPN: anonieme VPN. Bitmask als motor. \ No newline at end of file
diff --git a/src/custom/fastlane/metadata/nl/store-meta-nl.json b/src/custom/fastlane/metadata/nl/store-meta-nl.json
new file mode 100644
index 00000000..d1923610
--- /dev/null
+++ b/src/custom/fastlane/metadata/nl/store-meta-nl.json
@@ -0,0 +1,5 @@
+{
+ "title": "RiseupVPN",
+ "full_description": "RiseupVPN is de gemakkelijke, snelle en veilige VPN van riseup.net. RiseupVPN heeft geen gebruikersaccount nodig, houdt geen logs bij en volgt je geen enkele manier. De dienst wordt volledig betaald door donaties van gebruikers zoals jij.\n\nhttps://riseup.net/vpn/donate",
+ "short_description": "RiseupVPN: anonieme VPN. Bitmask als motor."
+} \ No newline at end of file
diff --git a/src/custom/fastlane/metadata/nl/title.txt b/src/custom/fastlane/metadata/nl/title.txt
new file mode 100644
index 00000000..8d2e228a
--- /dev/null
+++ b/src/custom/fastlane/metadata/nl/title.txt
@@ -0,0 +1 @@
+RiseupVPN \ No newline at end of file
diff --git a/src/custom/fastlane/metadata/tr/store-meta-tr.json b/src/custom/fastlane/metadata/tr/store-meta-tr.json
new file mode 100644
index 00000000..7fd8fcc0
--- /dev/null
+++ b/src/custom/fastlane/metadata/tr/store-meta-tr.json
@@ -0,0 +1,5 @@
+{
+ "title": "RiseupVPN",
+ "full_description": "RiseupVPN, https://riseup.net tarafından sunulan kolay, hızlı ve güvenli bir VPN hizmetidir. RiseupVPN bir kullanıcı hesabı açılmasına gerek duymaz günlük tutmaz veya herhangi bir şekilde sizi izlemez. Bu hizmetin maliyeti tamamen sizin gibi kullanıcıların bağışlarıyla karşılanır.\n\nhttps://riseup.net/vpn/donate",
+ "short_description": "RiseupVPN, anonim VPN. Bitmask tarafından sunuluyor."
+} \ No newline at end of file
diff --git a/src/normal/fastlane/metadata/el/full_description.txt b/src/normal/fastlane/metadata/el/full_description.txt
new file mode 100644
index 00000000..aaaaf476
--- /dev/null
+++ b/src/normal/fastlane/metadata/el/full_description.txt
@@ -0,0 +1,12 @@
+Το Bitmask είναι μια εφαρμογή VPN με αυτόματη ρύθμιση παραμέτρων. Διαθέτει πολλές τεχνικές για την παράκαμψη της λογοκρισίας, τον αποκλεισμό δικτύου ή την αποφυγή επιτήρησης. Αφού επιλέξει έναν συμβατό πάροχο υπηρεσιών, θα κρυπτογραφήσει και θα δρομολογήσει με ασφάλεια όλη την κίνηση του δικτύου σας μέσω του αξιόπιστου παρόχου υπηρεσιών σας.
+
+Είστε έτοιμοι!
+
+Το Bitmask είναι ένα λογισμικό πελάτη VPN ανοιχτού κώδικα, που διανέμεται με την άδεια GPLv3. Δείτε https://0xacab.org/leap/bitmask_android
+
+Συχνές ερωτήσεις:
+
+* ποιος: το leap.se, μια συλλογική προσπάθεια που αγαπά την έννοια του δικαιώματος της ιδιωτικότητας, περίπου από το 2011.
+* Οι μεταφράσεις εκτιμούνται ιδιαίτερα για το έργο Transifex https://app.transifex.com/otf/bitmask/dashboard/
+
+Εάν αντιμετωπίζετε προβλήματα ή θέλετε να έχετε μια ειδική έκδοση, επικοινωνήστε μαζί μας στο https://matrix.to/#/#leap:libera.chat ή υποβάλλετε ένα ζήτημα στο: https://0xacab.org/leap/bitmask_android/ \ No newline at end of file
diff --git a/src/normal/fastlane/metadata/el/short_description.txt b/src/normal/fastlane/metadata/el/short_description.txt
new file mode 100644
index 00000000..4ac7309e
--- /dev/null
+++ b/src/normal/fastlane/metadata/el/short_description.txt
@@ -0,0 +1,2 @@
+Κρυπτογραφημένη επικοινωνία για τους απλούς θνητούς
+(καλοδεχούμενοι και οι υπερήρωες). \ No newline at end of file
diff --git a/src/normal/fastlane/metadata/el/store-meta-el.json b/src/normal/fastlane/metadata/el/store-meta-el.json
new file mode 100644
index 00000000..0e32bdc9
--- /dev/null
+++ b/src/normal/fastlane/metadata/el/store-meta-el.json
@@ -0,0 +1,5 @@
+{
+ "title": "Bitmask",
+ "full_description": "Το Bitmask είναι μια εφαρμογή VPN με αυτόματη ρύθμιση παραμέτρων. Διαθέτει πολλές τεχνικές για την παράκαμψη της λογοκρισίας, τον αποκλεισμό δικτύου ή την αποφυγή επιτήρησης. Αφού επιλέξει έναν συμβατό πάροχο υπηρεσιών, θα κρυπτογραφήσει και θα δρομολογήσει με ασφάλεια όλη την κίνηση του δικτύου σας μέσω του αξιόπιστου παρόχου υπηρεσιών σας.\n\nΕίστε έτοιμοι!\n\nΤο Bitmask είναι ένα λογισμικό πελάτη VPN ανοιχτού κώδικα, που διανέμεται με την άδεια GPLv3. Δείτε https://0xacab.org/leap/bitmask_android\n\nΣυχνές ερωτήσεις:\n\n* ποιος: το leap.se, μια συλλογική προσπάθεια που αγαπά την έννοια του δικαιώματος της ιδιωτικότητας, περίπου από το 2011.\n* Οι μεταφράσεις εκτιμούνται ιδιαίτερα για το έργο Transifex https://app.transifex.com/otf/bitmask/dashboard/\n\nΕάν αντιμετωπίζετε προβλήματα ή θέλετε να έχετε μια ειδική έκδοση, επικοινωνήστε μαζί μας στο https://matrix.to/#/#leap:libera.chat ή υποβάλλετε ένα ζήτημα στο: https://0xacab.org/leap/bitmask_android/",
+ "short_description": "Κρυπτογραφημένη επικοινωνία για τους απλούς θνητούς\n(καλοδεχούμενοι και οι υπερήρωες)."
+} \ No newline at end of file
diff --git a/src/normal/fastlane/metadata/el/title.txt b/src/normal/fastlane/metadata/el/title.txt
new file mode 100644
index 00000000..a953d6a6
--- /dev/null
+++ b/src/normal/fastlane/metadata/el/title.txt
@@ -0,0 +1 @@
+Bitmask \ No newline at end of file
diff --git a/src/normal/fastlane/metadata/en-US/changelogs/168000.txt b/src/normal/fastlane/metadata/en-US/changelogs/168000.txt
new file mode 100644
index 00000000..80766d7f
--- /dev/null
+++ b/src/normal/fastlane/metadata/en-US/changelogs/168000.txt
@@ -0,0 +1,8 @@
+Since the last release was not fully rolled-out, a summary of version 1.1.6 and 1.1.7:
+* updated design
+* improved circumvention capabilities
+* updated dependencies (openvpn, tor, snowflake etc.)
+* updated translations
+* fixed crashes and other bugs
+* support for Message of the Day
+* 1.1.7 fix: hiding debugging entries in settings \ No newline at end of file
diff --git a/src/normal/fastlane/metadata/en-US/full_description.txt b/src/normal/fastlane/metadata/en-US/full_description.txt
new file mode 100644
index 00000000..2fcf278a
--- /dev/null
+++ b/src/normal/fastlane/metadata/en-US/full_description.txt
@@ -0,0 +1,12 @@
+Bitmask is a VPN client with automatic configuration. It has several techniques on board to circumvent censorship, network blocking or avoid surveillance. After choosing a compatible service provider it will encrypt and route securely all your network traffic through your trusted service provider.
+
+And you're good to go!
+
+Bitmask is open source VPN client, distributed under the GPLv3 license. See https://0xacab.org/leap/bitmask_android
+
+FAQ:
+
+* who: leap.se, a collective that loves the concept of the right to whisper, around since 2011.
+* Translations greatly appreciated at our Transifex project https://app.transifex.com/otf/bitmask/dashboard/
+
+If you experience problems or want to have bleeding edge versions, please join our chat https://matrix.to/#/#leap:libera.chat or write a bug report: https://0xacab.org/leap/bitmask_android/ \ No newline at end of file
diff --git a/src/normal/fastlane/metadata/en-US/short_description.txt b/src/normal/fastlane/metadata/en-US/short_description.txt
new file mode 100644
index 00000000..6f481599
--- /dev/null
+++ b/src/normal/fastlane/metadata/en-US/short_description.txt
@@ -0,0 +1,2 @@
+Encrypted communication for mere mortals
+(superheroes welcome, too). \ No newline at end of file
diff --git a/src/normal/fastlane/metadata/en-US/title.txt b/src/normal/fastlane/metadata/en-US/title.txt
new file mode 100644
index 00000000..a953d6a6
--- /dev/null
+++ b/src/normal/fastlane/metadata/en-US/title.txt
@@ -0,0 +1 @@
+Bitmask \ No newline at end of file
diff --git a/src/normal/fastlane/metadata/android/README.md b/src/normal/fastlane/metadata/en-US/video.txt
index e69de29b..e69de29b 100644
--- a/src/normal/fastlane/metadata/android/README.md
+++ b/src/normal/fastlane/metadata/en-US/video.txt
diff --git a/src/normal/fastlane/metadata/nl-NL/video.txt b/src/normal/fastlane/metadata/nl-NL/video.txt
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/normal/fastlane/metadata/nl-NL/video.txt
diff --git a/src/normal/fastlane/metadata/nl/full_description.txt b/src/normal/fastlane/metadata/nl/full_description.txt
new file mode 100644
index 00000000..a714dff0
--- /dev/null
+++ b/src/normal/fastlane/metadata/nl/full_description.txt
@@ -0,0 +1,11 @@
+Bitmask is een VPN-client met automatische configuratie. Het kan verschillende technieken gebruiken om censuur, netwerkblokkades of surveillance te omzeilen. Nadat je een compatibele serviceprovider hebt gekozen, zal al je netwerkverkeer versleutelen en veilig via de serviceprovider van jou vertrouwen routeren.
+
+En je kunt van start!
+
+Bitmask is een open-source VPN-client, verspreid onder de GPLv3-licentie. Zie https://0xacab.org/leap/bitmask_android
+
+FAQ:
+
+wie: leap.se, een collectief dat sinds 2011 aan de slag is, gemotiveerd door het recht om te fluisteren.
+Vertalingen worden zeer gewaardeerd in ons Transifex-project: https://app.transifex.com/otf/bitmask/dashboard/
+Als je problemen ervaart of de nieuwste versies wilt proberen, neem dan deel aan onze chat: https://matrix.to/#/#leap:libera.chat of stuur een bugrapport in: https://0xacab.org/leap/bitmask_android/ \ No newline at end of file
diff --git a/src/normal/fastlane/metadata/nl/short_description.txt b/src/normal/fastlane/metadata/nl/short_description.txt
new file mode 100644
index 00000000..dd626a6c
--- /dev/null
+++ b/src/normal/fastlane/metadata/nl/short_description.txt
@@ -0,0 +1 @@
+Versleutelde communicatie voor stervelingen (superhelden zijn ook welkom). \ No newline at end of file
diff --git a/src/normal/fastlane/metadata/nl/store-meta-nl.json b/src/normal/fastlane/metadata/nl/store-meta-nl.json
new file mode 100644
index 00000000..61c9b38d
--- /dev/null
+++ b/src/normal/fastlane/metadata/nl/store-meta-nl.json
@@ -0,0 +1,5 @@
+{
+ "title": "Bitmask",
+ "full_description": "Bitmask is een VPN-client met automatische configuratie. Het kan verschillende technieken gebruiken om censuur, netwerkblokkades of surveillance te omzeilen. Nadat je een compatibele serviceprovider hebt gekozen, zal al je netwerkverkeer versleutelen en veilig via de serviceprovider van jou vertrouwen routeren.\n\nEn je kunt van start!\n\nBitmask is een open-source VPN-client, verspreid onder de GPLv3-licentie. Zie https://0xacab.org/leap/bitmask_android\n\nFAQ:\n\nwie: leap.se, een collectief dat sinds 2011 aan de slag is, gemotiveerd door het recht om te fluisteren.\nVertalingen worden zeer gewaardeerd in ons Transifex-project: https://app.transifex.com/otf/bitmask/dashboard/\nAls je problemen ervaart of de nieuwste versies wilt proberen, neem dan deel aan onze chat: https://matrix.to/#/#leap:libera.chat of stuur een bugrapport in: https://0xacab.org/leap/bitmask_android/",
+ "short_description": "Versleutelde communicatie voor stervelingen (superhelden zijn ook welkom)."
+} \ No newline at end of file
diff --git a/src/normal/fastlane/metadata/nl/title.txt b/src/normal/fastlane/metadata/nl/title.txt
new file mode 100644
index 00000000..a953d6a6
--- /dev/null
+++ b/src/normal/fastlane/metadata/nl/title.txt
@@ -0,0 +1 @@
+Bitmask \ No newline at end of file
diff --git a/src/normal/fastlane/metadata/tr/full_description.txt b/src/normal/fastlane/metadata/tr/full_description.txt
new file mode 100644
index 00000000..10418aa9
--- /dev/null
+++ b/src/normal/fastlane/metadata/tr/full_description.txt
@@ -0,0 +1,12 @@
+Bitmask otomatik yapılandırma kullanan bir VPN istemcisidir. Sansür ve ağ engellemesini aşmak veya izlenmekten kaçınmak için birçok yöntem kullanır. Uyumlu bir hizmet sağlayıcı seçtikten sonra tüm ağ trafiğinizi şifreler ve güvendiğiniz hizmet sağlayıcınız üzerinden güvenli bir şekilde yöneltir.
+
+Böylece kullanmaya başlayabilirsiniz!
+
+Bitmask açık kaynaklı bir VPN istemcisidir. GPLv3 lisansı koşulları altında dağıtılır: https://0xacab.org/leap/bitmask_android
+
+SSS
+
+* Kim: leap.se, fısıldama hakkı kavramını seven bir topluluktır. 2011 yılından beri ortalıktadır.
+* Çevirileri Transifex projemizde memnuniyetle karşılıyoruz: https://app.transifex.com/otf/bitmask/dashboard/
+
+Sorunlarla karşılaştıysanız veya güncel sürümü almak istiyorsanız, sohbetimize katılabilir https://matrix.to/#/#leap:libera.chat ya da bir hata bildiriminde bulunabilirsiniz: https://0xacab.org/leap/bitmask_android/ \ No newline at end of file
diff --git a/src/normal/fastlane/metadata/tr/short_description.txt b/src/normal/fastlane/metadata/tr/short_description.txt
new file mode 100644
index 00000000..4e042739
--- /dev/null
+++ b/src/normal/fastlane/metadata/tr/short_description.txt
@@ -0,0 +1,2 @@
+Sadece bir fani olanlar için şifrelenmiş iletişim
+(süper kahramanlar da hoş gelir) \ No newline at end of file
diff --git a/src/normal/fastlane/metadata/tr/store-meta-tr.json b/src/normal/fastlane/metadata/tr/store-meta-tr.json
new file mode 100644
index 00000000..b38b70a6
--- /dev/null
+++ b/src/normal/fastlane/metadata/tr/store-meta-tr.json
@@ -0,0 +1,5 @@
+{
+ "title": "Bitmask",
+ "full_description": "Bitmask otomatik yapılandırma kullanan bir VPN istemcisidir. Sansür ve ağ engellemesini aşmak veya izlenmekten kaçınmak için birçok yöntem kullanır. Uyumlu bir hizmet sağlayıcı seçtikten sonra tüm ağ trafiğinizi şifreler ve güvendiğiniz hizmet sağlayıcınız üzerinden güvenli bir şekilde yöneltir.\n\nBöylece kullanmaya başlayabilirsiniz!\n\nBitmask açık kaynaklı bir VPN istemcisidir. GPLv3 lisansı koşulları altında dağıtılır: https://0xacab.org/leap/bitmask_android\n\nSSS\n\n* Kim: leap.se, fısıldama hakkı kavramını seven bir topluluktır. 2011 yılından beri ortalıktadır.\n* Çevirileri Transifex projemizde memnuniyetle karşılıyoruz: https://app.transifex.com/otf/bitmask/dashboard/\n\nSorunlarla karşılaştıysanız veya güncel sürümü almak istiyorsanız, sohbetimize katılabilir https://matrix.to/#/#leap:libera.chat ya da bir hata bildiriminde bulunabilirsiniz: https://0xacab.org/leap/bitmask_android/",
+ "short_description": "Sadece bir fani olanlar için şifrelenmiş iletişim\n(süper kahramanlar da hoş gelir)"
+} \ No newline at end of file
diff --git a/src/normal/fastlane/metadata/tr/title.txt b/src/normal/fastlane/metadata/tr/title.txt
new file mode 100644
index 00000000..a953d6a6
--- /dev/null
+++ b/src/normal/fastlane/metadata/tr/title.txt
@@ -0,0 +1 @@
+Bitmask \ No newline at end of file
diff --git a/src/normal/fastlane/metadata/tr/tx-values-tr.json b/src/normal/fastlane/metadata/tr/tx-values-tr.json
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/src/normal/fastlane/metadata/tr/tx-values-tr.json
@@ -0,0 +1 @@
+{} \ No newline at end of file