Merge pull request #461 from tooot-app/main

Release 4.6
This commit is contained in:
xmflsct 2022-11-14 19:00:04 +01:00 committed by GitHub
commit eedeb6394f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
146 changed files with 9512 additions and 2256 deletions

View File

@ -10,11 +10,10 @@ jobs:
runs-on: macos-12 runs-on: macos-12
steps: steps:
- name: -- Step 0 -- Extract branch name - name: -- Step 0 -- Extract branch name
shell: bash uses: tj-actions/branch-names@v6
run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
id: branch id: branch
- name: -- Step 1 -- Checkout code - name: -- Step 1 -- Checkout code
uses: actions/checkout@v2 uses: actions/checkout@v3
- name: -- Step 2 -- Setup node - name: -- Step 2 -- Setup node
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
@ -26,8 +25,8 @@ jobs:
- name: -- Step 5 -- Run fastlane - name: -- Step 5 -- Run fastlane
env: env:
DEVELOPER_DIR: /Applications/Xcode_14.1.app/Contents/Developer DEVELOPER_DIR: /Applications/Xcode_14.1.app/Contents/Developer
ENVIRONMENT: ${{ steps.branch.outputs.branch }} ENVIRONMENT: ${{ steps.branch.outputs.current_branch }}
SENTRY_ENVIRONMENT: ${{ steps.branch.outputs.branch }} SENTRY_ENVIRONMENT: ${{ steps.branch.outputs.current_branch }}
LC_ALL: en_US.UTF-8 LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8 LANG: en_US.UTF-8
SENTRY_ORGANIZATION: ${{ secrets.SENTRY_ORGANIZATION }} SENTRY_ORGANIZATION: ${{ secrets.SENTRY_ORGANIZATION }}
@ -47,11 +46,10 @@ jobs:
runs-on: macos-12 runs-on: macos-12
steps: steps:
- name: -- Step 0 -- Extract branch name - name: -- Step 0 -- Extract branch name
shell: bash uses: tj-actions/branch-names@v6
run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
id: branch id: branch
- name: -- Step 1 -- Checkout code - name: -- Step 1 -- Checkout code
uses: actions/checkout@v2 uses: actions/checkout@v3
- name: -- Step 2 -- Setup node - name: -- Step 2 -- Setup node
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
@ -67,8 +65,8 @@ jobs:
run: bundle install run: bundle install
- name: -- Step 6 -- Run fastlane - name: -- Step 6 -- Run fastlane
env: env:
ENVIRONMENT: ${{ steps.branch.outputs.branch }} ENVIRONMENT: ${{ steps.branch.outputs.current_branch }}
SENTRY_ENVIRONMENT: ${{ steps.branch.outputs.branch }} SENTRY_ENVIRONMENT: ${{ steps.branch.outputs.current_branch }}
LC_ALL: en_US.UTF-8 LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8 LANG: en_US.UTF-8
ANDROID_KEYSTORE: ${{ secrets.ANDROID_KEYSTORE }} ANDROID_KEYSTORE: ${{ secrets.ANDROID_KEYSTORE }}
@ -84,11 +82,10 @@ jobs:
needs: [build-ios, build-android] needs: [build-ios, build-android]
steps: steps:
- name: -- Step 0 -- Extract branch name - name: -- Step 0 -- Extract branch name
shell: bash uses: tj-actions/branch-names@v6
run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
id: branch id: branch
- name: -- Step 1 -- Checkout code - name: -- Step 1 -- Checkout code
uses: actions/checkout@v2 uses: actions/checkout@v3
- name: -- Step 2 -- Setup node - name: -- Step 2 -- Setup node
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
@ -104,8 +101,8 @@ jobs:
run: bundle install run: bundle install
- name: -- Step 6 -- Run fastlane - name: -- Step 6 -- Run fastlane
env: env:
ENVIRONMENT: ${{ steps.branch.outputs.branch }} ENVIRONMENT: ${{ steps.branch.outputs.current_branch }}
SENTRY_ENVIRONMENT: ${{ steps.branch.outputs.branch }} SENTRY_ENVIRONMENT: ${{ steps.branch.outputs.current_branch }}
LC_ALL: en_US.UTF-8 LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8 LANG: en_US.UTF-8
SENTRY_ORGANIZATION: ${{ secrets.SENTRY_ORGANIZATION }} SENTRY_ORGANIZATION: ${{ secrets.SENTRY_ORGANIZATION }}

1
.gitignore vendored
View File

@ -41,6 +41,7 @@ build/
local.properties local.properties
*.iml *.iml
*.hprof *.hprof
.cxx/
# node.js # node.js
# #

View File

@ -11,6 +11,8 @@ Please **do not** create a pull request to update translation. tooot's translati
## Special thanks ## Special thanks
[@pat](https://piaille.fr/@pat) for French translation
[@forenta](https://github.com/forenta) for German translation [@forenta](https://github.com/forenta) for German translation
[@andrigamerita](https://github.com/andrigamerita) for Italian translation [@andrigamerita](https://github.com/andrigamerita) for Italian translation

View File

@ -1,6 +1,7 @@
apply plugin: "com.android.application" apply plugin: "com.android.application"
import com.android.build.OutputFile import com.android.build.OutputFile
import org.apache.tools.ant.taskdefs.condition.Os
/** /**
* The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
@ -78,7 +79,7 @@ import com.android.build.OutputFile
*/ */
project.ext.react = [ project.ext.react = [
enableHermes: (findProperty('expo.jsEngine') ?: "jsc") == "hermes", enableHermes: true,
] ]
apply from: new File(["node", "--print", "require.resolve('react-native/package.json')"].execute().text.trim(), "../react.gradle") apply from: new File(["node", "--print", "require.resolve('react-native/package.json')"].execute().text.trim(), "../react.gradle")
@ -146,22 +147,14 @@ android {
versionName "0.2" versionName "0.2"
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
if (isNewArchitectureEnabled()) { if (isNewArchitectureEnabled()) {
// We configure the NDK build only if you decide to opt-in for the New Architecture. // We configure the CMake build only if you decide to opt-in for the New Architecture.
externalNativeBuild { externalNativeBuild {
ndkBuild { cmake {
arguments "APP_PLATFORM=android-21", arguments "-DPROJECT_BUILD_DIR=$buildDir",
"APP_STL=c++_shared", "-DREACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid",
"NDK_TOOLCHAIN_VERSION=clang", "-DREACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build",
"GENERATED_SRC_DIR=$buildDir/generated/source", "-DNODE_MODULES_DIR=$rootDir/../node_modules",
"PROJECT_BUILD_DIR=$buildDir", "-DANDROID_STL=c++_shared"
"REACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid",
"REACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build"
"NODE_MODULES_DIR=$rootDir/../node_modules"
cFlags "-Wall", "-Werror", "-fexceptions", "-frtti", "-DWITH_INSPECTOR=1"
cppFlags "-std=c++17"
// Make sure this target name is the same you specify inside the
// src/main/jni/Android.mk file for the `LOCAL_MODULE` variable.
targets "tooot_appmodules"
} }
} }
if (!enableSeparateBuildPerCPUArchitecture) { if (!enableSeparateBuildPerCPUArchitecture) {
@ -172,10 +165,10 @@ android {
} }
} }
if (isNewArchitectureEnabled()) { if (isNewArchitectureEnabled()) {
// We configure the NDK build only if you decide to opt-in for the New Architecture. // We configure the CMake build only if you decide to opt-in for the New Architecture.
externalNativeBuild { externalNativeBuild {
ndkBuild { cmake {
path "$projectDir/src/main/jni/Android.mk" path "$projectDir/src/main/jni/CMakeLists.txt"
} }
} }
def reactAndroidProjectDir = project(':ReactAndroid').projectDir def reactAndroidProjectDir = project(':ReactAndroid').projectDir
@ -196,15 +189,15 @@ android {
preDebugBuild.dependsOn(packageReactNdkDebugLibs) preDebugBuild.dependsOn(packageReactNdkDebugLibs)
preReleaseBuild.dependsOn(packageReactNdkReleaseLibs) preReleaseBuild.dependsOn(packageReactNdkReleaseLibs)
// Due to a bug inside AGP, we have to explicitly set a dependency // Due to a bug inside AGP, we have to explicitly set a dependency
// between configureNdkBuild* tasks and the preBuild tasks. // between configureCMakeDebug* tasks and the preBuild tasks.
// This can be removed once this is solved: https://issuetracker.google.com/issues/207403732 // This can be removed once this is solved: https://issuetracker.google.com/issues/207403732
configureNdkBuildRelease.dependsOn(preReleaseBuild) configureCMakeRelWithDebInfo.dependsOn(preReleaseBuild)
configureNdkBuildDebug.dependsOn(preDebugBuild) configureCMakeDebug.dependsOn(preDebugBuild)
reactNativeArchitectures().each { architecture -> reactNativeArchitectures().each { architecture ->
tasks.findByName("configureNdkBuildDebug[${architecture}]")?.configure { tasks.findByName("configureCMakeDebug[${architecture}]")?.configure {
dependsOn("preDebugBuild") dependsOn("preDebugBuild")
} }
tasks.findByName("configureNdkBuildRelease[${architecture}]")?.configure { tasks.findByName("configureCMakeRelWithDebInfo[${architecture}]")?.configure {
dependsOn("preReleaseBuild") dependsOn("preReleaseBuild")
} }
} }
@ -314,7 +307,7 @@ dependencies {
if (isNewArchitectureEnabled()) { if (isNewArchitectureEnabled()) {
// If new architecture is enabled, we let you build RN from source // If new architecture is enabled, we let you build RN from source
// Otherwise we fallback to a prebuilt .aar bundled in the NPM package. // Otherwise we fallback to a prebuilt .aar bundled in the NPM package.
// This will be applied to all the imported transtitive dependency. // This will be applied to all the imported transitive dependency.
configurations.all { configurations.all {
resolutionStrategy.dependencySubstitution { resolutionStrategy.dependencySubstitution {
substitute(module("com.facebook.react:react-native")) substitute(module("com.facebook.react:react-native"))

View File

@ -1,5 +1,3 @@
import org.apache.tools.ant.taskdefs.condition.Os
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
@ -9,13 +7,10 @@ buildscript {
compileSdkVersion = 31 compileSdkVersion = 31
targetSdkVersion = 31 targetSdkVersion = 31
kotlinVersion = '1.6.10' kotlinVersion = '1.6.10'
if (System.properties['os.arch'] == "aarch64") { if (System.properties['os.arch'] == "aarch64") {
// For M1 Users we need to use the NDK 24 which added support for aarch64 // For M1 Users we need to use the NDK 24 which added support for aarch64
ndkVersion = "24.0.8215888" ndkVersion = "24.0.8215888"
} else if (Os.isFamily(Os.FAMILY_WINDOWS)) {
// For Android Users, we need to use NDK 23, otherwise the build will
// fail due to paths longer than the OS limit
ndkVersion = "23.1.7779620"
} else { } else {
// Otherwise we default to the side-by-side NDK version from AGP. // Otherwise we default to the side-by-side NDK version from AGP.
ndkVersion = "21.4.7075529" ndkVersion = "21.4.7075529"
@ -24,10 +19,11 @@ buildscript {
repositories { repositories {
google() google()
mavenCentral() mavenCentral()
jcenter()
} }
dependencies { dependencies {
classpath 'com.google.gms:google-services:4.3.3' classpath 'com.google.gms:google-services:4.3.3'
classpath("com.android.tools.build:gradle:7.1.1") classpath("com.android.tools.build:gradle:7.2.1")
classpath("com.facebook.react:react-native-gradle-plugin") classpath("com.facebook.react:react-native-gradle-plugin")
classpath("de.undercouch:gradle-download-task:5.0.1") classpath("de.undercouch:gradle-download-task:5.0.1")
@ -38,20 +34,6 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
exclusiveContent {
// We get React Native's Android binaries exclusively through npm,
// from a local Maven repo inside node_modules/react-native/.
// (The use of exclusiveContent prevents looking elsewhere like Maven Central
// and potentially getting a wrong version.)
filter {
includeGroup "com.facebook.react"
}
forRepository {
maven {
url "$rootDir/../node_modules/react-native/android"
}
}
}
mavenLocal() mavenLocal()
maven { maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
@ -64,6 +46,7 @@ allprojects {
google() google()
mavenCentral() mavenCentral()
jcenter()
maven { url 'https://www.jitpack.io' } maven { url 'https://www.jitpack.io' }
} }
} }

Binary file not shown.

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@ -10,7 +10,6 @@ export default (): ExpoConfig => ({
version, version,
extra: { environment: process.env.ENVIRONMENT }, extra: { environment: process.env.ENVIRONMENT },
privacy: 'hidden', privacy: 'hidden',
jsEngine: 'hermes',
ios: { ios: {
bundleIdentifier: 'com.xmflsct.app.tooot' bundleIdentifier: 'com.xmflsct.app.tooot'
}, },

View File

@ -2,11 +2,9 @@ require File.join(File.dirname(`node --print "require.resolve('expo/package.json
require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods") require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods")
require File.join(File.dirname(`node --print "require.resolve('@react-native-community/cli-platform-ios/package.json')"`), "native_modules") require File.join(File.dirname(`node --print "require.resolve('@react-native-community/cli-platform-ios/package.json')"`), "native_modules")
platform :ios, '12.4' platform :ios, '13.0'
install! 'cocoapods', :deterministic_uuids => false install! 'cocoapods', :deterministic_uuids => false
production = ENV["PRODUCTION"] == "1"
require 'json' require 'json'
podfile_properties = JSON.parse(File.read('./Podfile.properties.json')) rescue {} podfile_properties = JSON.parse(File.read('./Podfile.properties.json')) rescue {}
@ -25,8 +23,7 @@ target 'tooot' do
use_react_native!( use_react_native!(
:path => config[:reactNativePath], :path => config[:reactNativePath],
:production => production, :hermes_enabled => true,
:hermes_enabled => podfile_properties['expo.jsEngine'] == 'hermes',
:fabric_enabled => flags[:fabric_enabled], :fabric_enabled => flags[:fabric_enabled],
:flipper_configuration => FlipperConfiguration.disabled, :flipper_configuration => FlipperConfiguration.disabled,
# An absolute path to your application root. # An absolute path to your application root.
@ -34,7 +31,12 @@ target 'tooot' do
) )
post_install do |installer| post_install do |installer|
react_native_post_install(installer) react_native_post_install(
installer,
# Set `mac_catalyst_enabled` to `true` in order to apply patches
# necessary for Mac Catalyst builds
:mac_catalyst_enabled => false
)
__apply_Xcode_12_5_M1_post_install_workaround(installer) __apply_Xcode_12_5_M1_post_install_workaround(installer)
# For share extension # For share extension
@ -65,8 +67,7 @@ end
target 'ShareExtension' do target 'ShareExtension' do
use_react_native!( use_react_native!(
:production => production, :hermes_enabled => true,
:hermes_enabled => podfile_properties['expo.jsEngine'] == 'hermes',
:flipper_configuration => FlipperConfiguration.disabled :flipper_configuration => FlipperConfiguration.disabled
) )

View File

@ -1,65 +1,64 @@
PODS: PODS:
- boost (1.76.0) - boost (1.76.0)
- DoubleConversion (1.1.6) - DoubleConversion (1.1.6)
- EXApplication (4.2.2): - EXApplication (5.0.1):
- ExpoModulesCore - ExpoModulesCore
- EXAV (12.0.4): - EXAV (13.0.1):
- ExpoModulesCore - ExpoModulesCore
- React-runtimeexecutor - ReactCommon/turbomodule/core
- ReactCommon - EXConstants (14.0.2):
- EXConstants (13.2.4):
- ExpoModulesCore - ExpoModulesCore
- EXErrorRecovery (3.2.0): - EXErrorRecovery (4.0.1):
- ExpoModulesCore - ExpoModulesCore
- EXFileSystem (14.1.0): - EXFileSystem (15.1.1):
- ExpoModulesCore - ExpoModulesCore
- EXFirebaseAnalytics (7.2.0): - EXFirebaseAnalytics (8.0.0):
- EXFirebaseCore - EXFirebaseCore
- ExpoModulesCore - ExpoModulesCore
- Firebase/Core (= 9.5.0) - Firebase/Core (= 9.5.0)
- EXFirebaseCore (5.2.0): - EXFirebaseCore (6.0.0):
- ExpoModulesCore - ExpoModulesCore
- Firebase/Core (= 9.5.0) - Firebase/Core (= 9.5.0)
- EXFont (10.2.1): - EXFont (11.0.1):
- ExpoModulesCore - ExpoModulesCore
- EXNotifications (0.16.1): - EXNotifications (0.17.0):
- ExpoModulesCore - ExpoModulesCore
- Expo (46.0.16): - Expo (47.0.3):
- ExpoModulesCore - ExpoModulesCore
- ExpoCrypto (11.0.0): - ExpoCrypto (12.0.0):
- ExpoModulesCore - ExpoModulesCore
- ExpoHaptics (11.3.0): - ExpoHaptics (12.0.1):
- ExpoModulesCore - ExpoModulesCore
- ExpoKeepAwake (10.2.0): - ExpoKeepAwake (11.0.1):
- ExpoModulesCore - ExpoModulesCore
- ExpoLocalization (13.1.0): - ExpoLocalization (14.0.0):
- ExpoModulesCore - ExpoModulesCore
- ExpoModulesCore (0.11.8): - ExpoModulesCore (1.0.2):
- React-Core - React-Core
- ReactCommon/turbomodule/core - ReactCommon/turbomodule/core
- ExpoRandom (12.3.0): - ExpoRandom (13.0.0):
- ExpoModulesCore - ExpoModulesCore
- ExpoWebBrowser (11.0.0): - ExpoStoreReview (6.0.0):
- ExpoModulesCore - ExpoModulesCore
- EXScreenCapture (4.3.0): - ExpoWebBrowser (12.0.0):
- ExpoModulesCore - ExpoModulesCore
- EXSecureStore (11.3.0): - EXScreenCapture (5.0.0):
- ExpoModulesCore - ExpoModulesCore
- EXSplashScreen (0.16.2): - EXSecureStore (12.0.0):
- ExpoModulesCore
- EXSplashScreen (0.17.4):
- ExpoModulesCore - ExpoModulesCore
- React-Core - React-Core
- EXStoreReview (5.3.0): - EXVideoThumbnails (7.0.0):
- ExpoModulesCore - ExpoModulesCore
- EXVideoThumbnails (6.4.0): - FBLazyVector (0.70.5)
- ExpoModulesCore - FBReactNativeSpec (0.70.5):
- FBLazyVector (0.69.6) - RCT-Folly (= 2021.07.22.00)
- FBReactNativeSpec (0.69.6): - RCTRequired (= 0.70.5)
- RCT-Folly (= 2021.06.28.00-v2) - RCTTypeSafety (= 0.70.5)
- RCTRequired (= 0.69.6) - React-Core (= 0.70.5)
- RCTTypeSafety (= 0.69.6) - React-jsi (= 0.70.5)
- React-Core (= 0.69.6) - ReactCommon/turbomodule/core (= 0.70.5)
- React-jsi (= 0.69.6)
- ReactCommon/turbomodule/core (= 0.69.6)
- Firebase (9.5.0): - Firebase (9.5.0):
- Firebase/Core (= 9.5.0) - Firebase/Core (= 9.5.0)
- Firebase/Core (9.5.0): - Firebase/Core (9.5.0):
@ -128,287 +127,287 @@ PODS:
- GoogleUtilities/Environment (~> 7.7) - GoogleUtilities/Environment (~> 7.7)
- nanopb (< 2.30910.0, >= 2.30908.0) - nanopb (< 2.30910.0, >= 2.30908.0)
- PromisesObjC (< 3.0, >= 1.2) - PromisesObjC (< 3.0, >= 1.2)
- GoogleUtilities (7.8.0): - GoogleUtilities (7.10.0):
- GoogleUtilities/AppDelegateSwizzler (= 7.8.0) - GoogleUtilities/AppDelegateSwizzler (= 7.10.0)
- GoogleUtilities/Environment (= 7.8.0) - GoogleUtilities/Environment (= 7.10.0)
- GoogleUtilities/ISASwizzler (= 7.8.0) - GoogleUtilities/ISASwizzler (= 7.10.0)
- GoogleUtilities/Logger (= 7.8.0) - GoogleUtilities/Logger (= 7.10.0)
- GoogleUtilities/MethodSwizzler (= 7.8.0) - GoogleUtilities/MethodSwizzler (= 7.10.0)
- GoogleUtilities/Network (= 7.8.0) - GoogleUtilities/Network (= 7.10.0)
- "GoogleUtilities/NSData+zlib (= 7.8.0)" - "GoogleUtilities/NSData+zlib (= 7.10.0)"
- GoogleUtilities/Reachability (= 7.8.0) - GoogleUtilities/Reachability (= 7.10.0)
- GoogleUtilities/SwizzlerTestHelpers (= 7.8.0) - GoogleUtilities/SwizzlerTestHelpers (= 7.10.0)
- GoogleUtilities/UserDefaults (= 7.8.0) - GoogleUtilities/UserDefaults (= 7.10.0)
- GoogleUtilities/AppDelegateSwizzler (7.8.0): - GoogleUtilities/AppDelegateSwizzler (7.10.0):
- GoogleUtilities/Environment - GoogleUtilities/Environment
- GoogleUtilities/Logger - GoogleUtilities/Logger
- GoogleUtilities/Network - GoogleUtilities/Network
- GoogleUtilities/Environment (7.8.0): - GoogleUtilities/Environment (7.10.0):
- PromisesObjC (< 3.0, >= 1.2) - PromisesObjC (< 3.0, >= 1.2)
- GoogleUtilities/ISASwizzler (7.8.0) - GoogleUtilities/ISASwizzler (7.10.0)
- GoogleUtilities/Logger (7.8.0): - GoogleUtilities/Logger (7.10.0):
- GoogleUtilities/Environment - GoogleUtilities/Environment
- GoogleUtilities/MethodSwizzler (7.8.0): - GoogleUtilities/MethodSwizzler (7.10.0):
- GoogleUtilities/Logger - GoogleUtilities/Logger
- GoogleUtilities/Network (7.8.0): - GoogleUtilities/Network (7.10.0):
- GoogleUtilities/Logger - GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib" - "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Reachability - GoogleUtilities/Reachability
- "GoogleUtilities/NSData+zlib (7.8.0)" - "GoogleUtilities/NSData+zlib (7.10.0)"
- GoogleUtilities/Reachability (7.8.0): - GoogleUtilities/Reachability (7.10.0):
- GoogleUtilities/Logger - GoogleUtilities/Logger
- GoogleUtilities/SwizzlerTestHelpers (7.8.0): - GoogleUtilities/SwizzlerTestHelpers (7.10.0):
- GoogleUtilities/MethodSwizzler - GoogleUtilities/MethodSwizzler
- GoogleUtilities/UserDefaults (7.8.0): - GoogleUtilities/UserDefaults (7.10.0):
- GoogleUtilities/Logger - GoogleUtilities/Logger
- hermes-engine (0.69.6) - hermes-engine (0.70.5)
- libevent (2.1.12) - libevent (2.1.12)
- libwebp (1.2.3): - libwebp (1.2.4):
- libwebp/demux (= 1.2.3) - libwebp/demux (= 1.2.4)
- libwebp/mux (= 1.2.3) - libwebp/mux (= 1.2.4)
- libwebp/webp (= 1.2.3) - libwebp/webp (= 1.2.4)
- libwebp/demux (1.2.3): - libwebp/demux (1.2.4):
- libwebp/webp - libwebp/webp
- libwebp/mux (1.2.3): - libwebp/mux (1.2.4):
- libwebp/demux - libwebp/demux
- libwebp/webp (1.2.3) - libwebp/webp (1.2.4)
- nanopb (2.30909.0): - nanopb (2.30909.0):
- nanopb/decode (= 2.30909.0) - nanopb/decode (= 2.30909.0)
- nanopb/encode (= 2.30909.0) - nanopb/encode (= 2.30909.0)
- nanopb/decode (2.30909.0) - nanopb/decode (2.30909.0)
- nanopb/encode (2.30909.0) - nanopb/encode (2.30909.0)
- PromisesObjC (2.1.1) - PromisesObjC (2.1.1)
- RCT-Folly (2021.06.28.00-v2): - RCT-Folly (2021.07.22.00):
- boost - boost
- DoubleConversion - DoubleConversion
- fmt (~> 6.2.1) - fmt (~> 6.2.1)
- glog - glog
- RCT-Folly/Default (= 2021.06.28.00-v2) - RCT-Folly/Default (= 2021.07.22.00)
- RCT-Folly/Default (2021.06.28.00-v2): - RCT-Folly/Default (2021.07.22.00):
- boost - boost
- DoubleConversion - DoubleConversion
- fmt (~> 6.2.1) - fmt (~> 6.2.1)
- glog - glog
- RCT-Folly/Futures (2021.06.28.00-v2): - RCT-Folly/Futures (2021.07.22.00):
- boost - boost
- DoubleConversion - DoubleConversion
- fmt (~> 6.2.1) - fmt (~> 6.2.1)
- glog - glog
- libevent - libevent
- RCTRequired (0.69.6) - RCTRequired (0.70.5)
- RCTTypeSafety (0.69.6): - RCTTypeSafety (0.70.5):
- FBLazyVector (= 0.69.6) - FBLazyVector (= 0.70.5)
- RCTRequired (= 0.69.6) - RCTRequired (= 0.70.5)
- React-Core (= 0.69.6) - React-Core (= 0.70.5)
- React (0.69.6): - React (0.70.5):
- React-Core (= 0.69.6) - React-Core (= 0.70.5)
- React-Core/DevSupport (= 0.69.6) - React-Core/DevSupport (= 0.70.5)
- React-Core/RCTWebSocket (= 0.69.6) - React-Core/RCTWebSocket (= 0.70.5)
- React-RCTActionSheet (= 0.69.6) - React-RCTActionSheet (= 0.70.5)
- React-RCTAnimation (= 0.69.6) - React-RCTAnimation (= 0.70.5)
- React-RCTBlob (= 0.69.6) - React-RCTBlob (= 0.70.5)
- React-RCTImage (= 0.69.6) - React-RCTImage (= 0.70.5)
- React-RCTLinking (= 0.69.6) - React-RCTLinking (= 0.70.5)
- React-RCTNetwork (= 0.69.6) - React-RCTNetwork (= 0.70.5)
- React-RCTSettings (= 0.69.6) - React-RCTSettings (= 0.70.5)
- React-RCTText (= 0.69.6) - React-RCTText (= 0.70.5)
- React-RCTVibration (= 0.69.6) - React-RCTVibration (= 0.70.5)
- React-bridging (0.69.6): - React-bridging (0.70.5):
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-callinvoker (0.69.6) - React-callinvoker (0.70.5)
- React-Codegen (0.69.6): - React-Codegen (0.70.5):
- FBReactNativeSpec (= 0.69.6) - FBReactNativeSpec (= 0.70.5)
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- RCTRequired (= 0.69.6) - RCTRequired (= 0.70.5)
- RCTTypeSafety (= 0.69.6) - RCTTypeSafety (= 0.70.5)
- React-Core (= 0.69.6) - React-Core (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-jsiexecutor (= 0.69.6) - React-jsiexecutor (= 0.70.5)
- ReactCommon/turbomodule/core (= 0.69.6) - ReactCommon/turbomodule/core (= 0.70.5)
- React-Core (0.69.6): - React-Core (0.70.5):
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default (= 0.69.6) - React-Core/Default (= 0.70.5)
- React-cxxreact (= 0.69.6) - React-cxxreact (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-jsiexecutor (= 0.69.6) - React-jsiexecutor (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- Yoga - Yoga
- React-Core/CoreModulesHeaders (0.69.6): - React-Core/CoreModulesHeaders (0.70.5):
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.69.6) - React-cxxreact (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-jsiexecutor (= 0.69.6) - React-jsiexecutor (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- Yoga - Yoga
- React-Core/Default (0.69.6): - React-Core/Default (0.70.5):
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-cxxreact (= 0.69.6) - React-cxxreact (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-jsiexecutor (= 0.69.6) - React-jsiexecutor (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- Yoga - Yoga
- React-Core/DevSupport (0.69.6): - React-Core/DevSupport (0.70.5):
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default (= 0.69.6) - React-Core/Default (= 0.70.5)
- React-Core/RCTWebSocket (= 0.69.6) - React-Core/RCTWebSocket (= 0.70.5)
- React-cxxreact (= 0.69.6) - React-cxxreact (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-jsiexecutor (= 0.69.6) - React-jsiexecutor (= 0.70.5)
- React-jsinspector (= 0.69.6) - React-jsinspector (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- Yoga - Yoga
- React-Core/RCTActionSheetHeaders (0.69.6): - React-Core/RCTActionSheetHeaders (0.70.5):
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.69.6) - React-cxxreact (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-jsiexecutor (= 0.69.6) - React-jsiexecutor (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- Yoga - Yoga
- React-Core/RCTAnimationHeaders (0.69.6): - React-Core/RCTAnimationHeaders (0.70.5):
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.69.6) - React-cxxreact (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-jsiexecutor (= 0.69.6) - React-jsiexecutor (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- Yoga - Yoga
- React-Core/RCTBlobHeaders (0.69.6): - React-Core/RCTBlobHeaders (0.70.5):
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.69.6) - React-cxxreact (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-jsiexecutor (= 0.69.6) - React-jsiexecutor (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- Yoga - Yoga
- React-Core/RCTImageHeaders (0.69.6): - React-Core/RCTImageHeaders (0.70.5):
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.69.6) - React-cxxreact (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-jsiexecutor (= 0.69.6) - React-jsiexecutor (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- Yoga - Yoga
- React-Core/RCTLinkingHeaders (0.69.6): - React-Core/RCTLinkingHeaders (0.70.5):
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.69.6) - React-cxxreact (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-jsiexecutor (= 0.69.6) - React-jsiexecutor (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- Yoga - Yoga
- React-Core/RCTNetworkHeaders (0.69.6): - React-Core/RCTNetworkHeaders (0.70.5):
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.69.6) - React-cxxreact (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-jsiexecutor (= 0.69.6) - React-jsiexecutor (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- Yoga - Yoga
- React-Core/RCTSettingsHeaders (0.69.6): - React-Core/RCTSettingsHeaders (0.70.5):
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.69.6) - React-cxxreact (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-jsiexecutor (= 0.69.6) - React-jsiexecutor (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- Yoga - Yoga
- React-Core/RCTTextHeaders (0.69.6): - React-Core/RCTTextHeaders (0.70.5):
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.69.6) - React-cxxreact (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-jsiexecutor (= 0.69.6) - React-jsiexecutor (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- Yoga - Yoga
- React-Core/RCTVibrationHeaders (0.69.6): - React-Core/RCTVibrationHeaders (0.70.5):
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.69.6) - React-cxxreact (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-jsiexecutor (= 0.69.6) - React-jsiexecutor (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- Yoga - Yoga
- React-Core/RCTWebSocket (0.69.6): - React-Core/RCTWebSocket (0.70.5):
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default (= 0.69.6) - React-Core/Default (= 0.70.5)
- React-cxxreact (= 0.69.6) - React-cxxreact (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-jsiexecutor (= 0.69.6) - React-jsiexecutor (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- Yoga - Yoga
- React-CoreModules (0.69.6): - React-CoreModules (0.70.5):
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- RCTTypeSafety (= 0.69.6) - RCTTypeSafety (= 0.70.5)
- React-Codegen (= 0.69.6) - React-Codegen (= 0.70.5)
- React-Core/CoreModulesHeaders (= 0.69.6) - React-Core/CoreModulesHeaders (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-RCTImage (= 0.69.6) - React-RCTImage (= 0.70.5)
- ReactCommon/turbomodule/core (= 0.69.6) - ReactCommon/turbomodule/core (= 0.70.5)
- React-cxxreact (0.69.6): - React-cxxreact (0.70.5):
- boost (= 1.76.0) - boost (= 1.76.0)
- DoubleConversion - DoubleConversion
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-callinvoker (= 0.69.6) - React-callinvoker (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-jsinspector (= 0.69.6) - React-jsinspector (= 0.70.5)
- React-logger (= 0.69.6) - React-logger (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- React-runtimeexecutor (= 0.69.6) - React-runtimeexecutor (= 0.70.5)
- React-hermes (0.69.6): - React-hermes (0.70.5):
- DoubleConversion - DoubleConversion
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- RCT-Folly/Futures (= 2021.06.28.00-v2) - RCT-Folly/Futures (= 2021.07.22.00)
- React-cxxreact (= 0.69.6) - React-cxxreact (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-jsiexecutor (= 0.69.6) - React-jsiexecutor (= 0.70.5)
- React-jsinspector (= 0.69.6) - React-jsinspector (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- React-jsi (0.69.6): - React-jsi (0.70.5):
- boost (= 1.76.0) - boost (= 1.76.0)
- DoubleConversion - DoubleConversion
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-jsi/Default (= 0.69.6) - React-jsi/Default (= 0.70.5)
- React-jsi/Default (0.69.6): - React-jsi/Default (0.70.5):
- boost (= 1.76.0) - boost (= 1.76.0)
- DoubleConversion - DoubleConversion
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-jsiexecutor (0.69.6): - React-jsiexecutor (0.70.5):
- DoubleConversion - DoubleConversion
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-cxxreact (= 0.69.6) - React-cxxreact (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- React-jsinspector (0.69.6) - React-jsinspector (0.70.5)
- React-logger (0.69.6): - React-logger (0.70.5):
- glog - glog
- react-native-blur (4.2.0): - react-native-blur (4.3.0):
- React-Core - React-Core
- react-native-blurhash (1.1.10): - react-native-blurhash (1.1.10):
- React-Core - React-Core
- react-native-cameraroll (5.0.4): - react-native-cameraroll (5.1.0):
- React-Core - React-Core
- react-native-context-menu-view (1.5.4): - react-native-context-menu-view (1.5.4):
- React - React
@ -420,7 +419,7 @@ PODS:
- React-Core - React-Core
- react-native-netinfo (9.3.6): - react-native-netinfo (9.3.6):
- React-Core - React-Core
- react-native-pager-view (6.0.2): - react-native-pager-view (6.1.0):
- React-Core - React-Core
- react-native-paste-input (0.5.1): - react-native-paste-input (0.5.1):
- React-Core - React-Core
@ -433,110 +432,79 @@ PODS:
- ReactCommon/turbomodule/core - ReactCommon/turbomodule/core
- react-native-segmented-control (2.2.2): - react-native-segmented-control (2.2.2):
- React-Core - React-Core
- React-perflogger (0.69.6) - React-perflogger (0.70.5)
- React-RCTActionSheet (0.69.6): - React-RCTActionSheet (0.70.5):
- React-Core/RCTActionSheetHeaders (= 0.69.6) - React-Core/RCTActionSheetHeaders (= 0.70.5)
- React-RCTAnimation (0.69.6): - React-RCTAnimation (0.70.5):
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- RCTTypeSafety (= 0.69.6) - RCTTypeSafety (= 0.70.5)
- React-Codegen (= 0.69.6) - React-Codegen (= 0.70.5)
- React-Core/RCTAnimationHeaders (= 0.69.6) - React-Core/RCTAnimationHeaders (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- ReactCommon/turbomodule/core (= 0.69.6) - ReactCommon/turbomodule/core (= 0.70.5)
- React-RCTBlob (0.69.6): - React-RCTBlob (0.70.5):
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-Codegen (= 0.69.6) - React-Codegen (= 0.70.5)
- React-Core/RCTBlobHeaders (= 0.69.6) - React-Core/RCTBlobHeaders (= 0.70.5)
- React-Core/RCTWebSocket (= 0.69.6) - React-Core/RCTWebSocket (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-RCTNetwork (= 0.69.6) - React-RCTNetwork (= 0.70.5)
- ReactCommon/turbomodule/core (= 0.69.6) - ReactCommon/turbomodule/core (= 0.70.5)
- React-RCTImage (0.69.6): - React-RCTImage (0.70.5):
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- RCTTypeSafety (= 0.69.6) - RCTTypeSafety (= 0.70.5)
- React-Codegen (= 0.69.6) - React-Codegen (= 0.70.5)
- React-Core/RCTImageHeaders (= 0.69.6) - React-Core/RCTImageHeaders (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-RCTNetwork (= 0.69.6) - React-RCTNetwork (= 0.70.5)
- ReactCommon/turbomodule/core (= 0.69.6) - ReactCommon/turbomodule/core (= 0.70.5)
- React-RCTLinking (0.69.6): - React-RCTLinking (0.70.5):
- React-Codegen (= 0.69.6) - React-Codegen (= 0.70.5)
- React-Core/RCTLinkingHeaders (= 0.69.6) - React-Core/RCTLinkingHeaders (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- ReactCommon/turbomodule/core (= 0.69.6) - ReactCommon/turbomodule/core (= 0.70.5)
- React-RCTNetwork (0.69.6): - React-RCTNetwork (0.70.5):
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- RCTTypeSafety (= 0.69.6) - RCTTypeSafety (= 0.70.5)
- React-Codegen (= 0.69.6) - React-Codegen (= 0.70.5)
- React-Core/RCTNetworkHeaders (= 0.69.6) - React-Core/RCTNetworkHeaders (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- ReactCommon/turbomodule/core (= 0.69.6) - ReactCommon/turbomodule/core (= 0.70.5)
- React-RCTSettings (0.69.6): - React-RCTSettings (0.70.5):
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- RCTTypeSafety (= 0.69.6) - RCTTypeSafety (= 0.70.5)
- React-Codegen (= 0.69.6) - React-Codegen (= 0.70.5)
- React-Core/RCTSettingsHeaders (= 0.69.6) - React-Core/RCTSettingsHeaders (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- ReactCommon/turbomodule/core (= 0.69.6) - ReactCommon/turbomodule/core (= 0.70.5)
- React-RCTText (0.69.6): - React-RCTText (0.70.5):
- React-Core/RCTTextHeaders (= 0.69.6) - React-Core/RCTTextHeaders (= 0.70.5)
- React-RCTVibration (0.69.6): - React-RCTVibration (0.70.5):
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-Codegen (= 0.69.6) - React-Codegen (= 0.70.5)
- React-Core/RCTVibrationHeaders (= 0.69.6) - React-Core/RCTVibrationHeaders (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- ReactCommon/turbomodule/core (= 0.69.6) - ReactCommon/turbomodule/core (= 0.70.5)
- React-runtimeexecutor (0.69.6): - React-runtimeexecutor (0.70.5):
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- ReactCommon (0.69.6): - ReactCommon/turbomodule/core (0.70.5):
- React-logger (= 0.69.6)
- ReactCommon/react_debug_core (= 0.69.6)
- ReactCommon/turbomodule (= 0.69.6)
- ReactCommon/react_debug_core (0.69.6):
- React-logger (= 0.69.6)
- ReactCommon/turbomodule (0.69.6):
- DoubleConversion - DoubleConversion
- glog - glog
- RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly (= 2021.07.22.00)
- React-bridging (= 0.69.6) - React-bridging (= 0.70.5)
- React-callinvoker (= 0.69.6) - React-callinvoker (= 0.70.5)
- React-Core (= 0.69.6) - React-Core (= 0.70.5)
- React-cxxreact (= 0.69.6) - React-cxxreact (= 0.70.5)
- React-jsi (= 0.69.6) - React-jsi (= 0.70.5)
- React-logger (= 0.69.6) - React-logger (= 0.70.5)
- React-perflogger (= 0.69.6) - React-perflogger (= 0.70.5)
- ReactCommon/turbomodule/core (= 0.69.6) - RNCAsyncStorage (1.17.11):
- ReactCommon/turbomodule/samples (= 0.69.6)
- ReactCommon/turbomodule/core (0.69.6):
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-bridging (= 0.69.6)
- React-callinvoker (= 0.69.6)
- React-Core (= 0.69.6)
- React-cxxreact (= 0.69.6)
- React-jsi (= 0.69.6)
- React-logger (= 0.69.6)
- React-perflogger (= 0.69.6)
- ReactCommon/turbomodule/samples (0.69.6):
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-bridging (= 0.69.6)
- React-callinvoker (= 0.69.6)
- React-Core (= 0.69.6)
- React-cxxreact (= 0.69.6)
- React-jsi (= 0.69.6)
- React-logger (= 0.69.6)
- React-perflogger (= 0.69.6)
- ReactCommon/turbomodule/core (= 0.69.6)
- RNCAsyncStorage (1.17.10):
- React-Core - React-Core
- RNCClipboard (1.11.1): - RNCClipboard (1.11.1):
- React-Core - React-Core
- RNFastImage (8.6.3): - RNFastImage (8.6.3):
- React-Core - React-Core
- SDWebImage (~> 5.13.5) - SDWebImage (~> 5.14.2)
- SDWebImageWebPCoder (~> 0.9.1) - SDWebImageWebPCoder (~> 0.9.1)
- RNGestureHandler (2.8.0): - RNGestureHandler (2.8.0):
- React-Core - React-Core
@ -570,22 +538,22 @@ PODS:
- RNScreens (3.18.2): - RNScreens (3.18.2):
- React-Core - React-Core
- React-RCTImage - React-RCTImage
- RNSentry (4.7.1): - RNSentry (4.8.0):
- React-Core - React-Core
- Sentry (= 7.28.0) - Sentry (= 7.29.0)
- RNShareMenu (6.0.0): - RNShareMenu (6.0.0):
- React - React
- RNSVG (13.0.0): - RNSVG (13.5.0):
- React-Core - React-Core
- SDWebImage (5.13.5): - SDWebImage (5.14.2):
- SDWebImage/Core (= 5.13.5) - SDWebImage/Core (= 5.14.2)
- SDWebImage/Core (5.13.5) - SDWebImage/Core (5.14.2)
- SDWebImageWebPCoder (0.9.1): - SDWebImageWebPCoder (0.9.1):
- libwebp (~> 1.0) - libwebp (~> 1.0)
- SDWebImage/Core (~> 5.13) - SDWebImage/Core (~> 5.13)
- Sentry (7.28.0): - Sentry (7.29.0):
- Sentry/Core (= 7.28.0) - Sentry/Core (= 7.29.0)
- Sentry/Core (7.28.0) - Sentry/Core (7.29.0)
- Swime (3.0.6) - Swime (3.0.6)
- Yoga (1.14.0) - Yoga (1.14.0)
@ -606,13 +574,13 @@ DEPENDENCIES:
- ExpoHaptics (from `../node_modules/expo-haptics/ios`) - ExpoHaptics (from `../node_modules/expo-haptics/ios`)
- ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`)
- ExpoLocalization (from `../node_modules/expo-localization/ios`) - ExpoLocalization (from `../node_modules/expo-localization/ios`)
- ExpoModulesCore (from `../node_modules/expo-modules-core/ios`) - ExpoModulesCore (from `../node_modules/expo-modules-core`)
- ExpoRandom (from `../node_modules/expo-random/ios`) - ExpoRandom (from `../node_modules/expo-random/ios`)
- ExpoStoreReview (from `../node_modules/expo-store-review/ios`)
- ExpoWebBrowser (from `../node_modules/expo-web-browser/ios`) - ExpoWebBrowser (from `../node_modules/expo-web-browser/ios`)
- EXScreenCapture (from `../node_modules/expo-screen-capture/ios`) - EXScreenCapture (from `../node_modules/expo-screen-capture/ios`)
- EXSecureStore (from `../node_modules/expo-secure-store/ios`) - EXSecureStore (from `../node_modules/expo-secure-store/ios`)
- EXSplashScreen (from `../node_modules/expo-splash-screen/ios`) - EXSplashScreen (from `../node_modules/expo-splash-screen/ios`)
- EXStoreReview (from `../node_modules/expo-store-review/ios`)
- EXVideoThumbnails (from `../node_modules/expo-video-thumbnails/ios`) - EXVideoThumbnails (from `../node_modules/expo-video-thumbnails/ios`)
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
- FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`)
@ -728,9 +696,11 @@ EXTERNAL SOURCES:
ExpoLocalization: ExpoLocalization:
:path: "../node_modules/expo-localization/ios" :path: "../node_modules/expo-localization/ios"
ExpoModulesCore: ExpoModulesCore:
:path: "../node_modules/expo-modules-core/ios" :path: "../node_modules/expo-modules-core"
ExpoRandom: ExpoRandom:
:path: "../node_modules/expo-random/ios" :path: "../node_modules/expo-random/ios"
ExpoStoreReview:
:path: "../node_modules/expo-store-review/ios"
ExpoWebBrowser: ExpoWebBrowser:
:path: "../node_modules/expo-web-browser/ios" :path: "../node_modules/expo-web-browser/ios"
EXScreenCapture: EXScreenCapture:
@ -739,8 +709,6 @@ EXTERNAL SOURCES:
:path: "../node_modules/expo-secure-store/ios" :path: "../node_modules/expo-secure-store/ios"
EXSplashScreen: EXSplashScreen:
:path: "../node_modules/expo-splash-screen/ios" :path: "../node_modules/expo-splash-screen/ios"
EXStoreReview:
:path: "../node_modules/expo-store-review/ios"
EXVideoThumbnails: EXVideoThumbnails:
:path: "../node_modules/expo-video-thumbnails/ios" :path: "../node_modules/expo-video-thumbnails/ios"
FBLazyVector: FBLazyVector:
@ -853,30 +821,30 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS: SPEC CHECKSUMS:
boost: a7c83b31436843459a1961bfd74b96033dc77234 boost: a7c83b31436843459a1961bfd74b96033dc77234
DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54
EXApplication: e418d737a036e788510f2c4ad6c10a7d54d18586 EXApplication: 034b1c40a8e9fe1bff76a1e511ee90dff64ad834
EXAV: 596506c9bee54ad52f2f3b625cdaeb9d9f2dd6b7 EXAV: 766516466675fc5fdd7c500acced5934e8b00de2
EXConstants: 7c44785d41d8e959d527d23d29444277a4d1ee73 EXConstants: 3c86653c422dd77e40d10cbbabb3025003977415
EXErrorRecovery: 74d71ee59f6814315457b09d68e86aa95cc7d05d EXErrorRecovery: ae43433feb0608a64dc5b1c8363b3e7769a9ea24
EXFileSystem: 927e0a8885aa9c49e50fc38eaba2c2389f2f1019 EXFileSystem: 60602b6eefa6873f97172c684b7537c9760b50d6
EXFirebaseAnalytics: 2e478758e153b908b67477dff7adf99ffbf37a1b EXFirebaseAnalytics: 58d70e698859b070b2450ad8664d7b5bc6c6e3e1
EXFirebaseCore: cb1e6afad20c4c32a4966432c78ebfff29d8db6b EXFirebaseCore: d0d88cb904e893af07f809ab08c0892489bc6956
EXFont: 06df627203afcb8a3b3152ec06eb2f11f46f0cff EXFont: 319606bfe48c33b5b5063fb0994afdc496befe80
EXNotifications: 9a2aa201deb19dfe1dbe0e370eeb2922de0d2422 EXNotifications: babce2a87b7922051354fcfe7a74dd279b7e272a
Expo: 7ac824960a6059d6c68e73f432c8e6bf6d92a0ef Expo: 8e4f1d149b58d5df10d302e0b5c489f9fc6623fc
ExpoCrypto: e534314db0e1a17ae12b5140d529bd0c5efcbc6a ExpoCrypto: 51e7662c7f5bfeab25b7909b8a5d545ec15d4877
ExpoHaptics: efe9e68e9dfe0d15c183c0c70a25f3874124ab9e ExpoHaptics: 5a56d30a87ea213dd00b09566dc4b441a4dff97f
ExpoKeepAwake: 0e8f18142e71bbf2c7f6aa66ebed249ba1420320 ExpoKeepAwake: 69b59d0a8d2b24de9f82759c39b3821fec030318
ExpoLocalization: 63204f4b9d4f653469d266332ceaa6c6ac8a305d ExpoLocalization: e202d1e2a4950df17ac8d0889d65a1ffd7532d7e
ExpoModulesCore: 39ec590ce622289c060183aba57f77b1e73b4e11 ExpoModulesCore: 20decc110ca3987e1728dee2ce4b3f79e147edda
ExpoRandom: f9f1faa299a40733867f344d6b7bfa2d1f4ab04d ExpoRandom: 58b7e0a5fe1adf1cb6dc1cbe503a6fe9524f36ce
ExpoWebBrowser: 5804ac42a8269d0e534bc4461993005f72535649 ExpoStoreReview: ff6d631f2949eb7e4b2d14146ef6af25a16d770d
EXScreenCapture: 23de056fdb02edd1fb8f147b0fd198c6d5cada3d ExpoWebBrowser: 073e50f16669d498fb49063b9b7fe780b24f7fda
EXSecureStore: ac4b3c89dd5810528074d9422d5fed5a9e684467 EXScreenCapture: d9f1ec31042dfef109290d06c2b4789b7444d16d
EXSplashScreen: 799bece80089219b2c989c1082d70f3b00995cda EXSecureStore: daec0117c922a67c658cb229152a9e252e5c1750
EXStoreReview: cbb6b2202bb6f831cd3234d9d8b995cec0eb32f2 EXSplashScreen: 4b57f8416a057411cb3c97db9fc9a615f8c1d5d9
EXVideoThumbnails: 486533e1a66c9859f9b9e3b2e1f9f0b275515b48 EXVideoThumbnails: 8b3e48f3716679dd0cbf949217a31eab5c555799
FBLazyVector: 739d2f9719faecb463c7aa191591af31c8c94182 FBLazyVector: affa4ba1bfdaac110a789192f4d452b053a86624
FBReactNativeSpec: 957de82f66e31f2f14bbec34e37242282fdd26de FBReactNativeSpec: fe8b5f1429cfe83a8d72dc8ed61dc7704cac8745
Firebase: 800f16f07af493d98d017446a315c27af0552f41 Firebase: 800f16f07af493d98d017446a315c27af0552f41
FirebaseAnalytics: 1b60984a408320dda637306f3f733699ef8473d7 FirebaseAnalytics: 1b60984a408320dda637306f3f733699ef8473d7
FirebaseCore: 25c0400b670fd1e2f2104349cd3b5dcce8d9418f FirebaseCore: 25c0400b670fd1e2f2104349cd3b5dcce8d9418f
@ -884,69 +852,69 @@ SPEC CHECKSUMS:
FirebaseCoreInternal: bca76517fe1ed381e989f5e7d8abb0da8d85bed3 FirebaseCoreInternal: bca76517fe1ed381e989f5e7d8abb0da8d85bed3
FirebaseInstallations: 0a115432c4e223c5ab20b0dbbe4cbefa793a0e8e FirebaseInstallations: 0a115432c4e223c5ab20b0dbbe4cbefa793a0e8e
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
glog: 3d02b25ca00c2d456734d0bcff864cbc62f6ae1a glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b
GoogleAppMeasurement: 6ee231473fbd75c11221dfce489894334024eead GoogleAppMeasurement: 6ee231473fbd75c11221dfce489894334024eead
GoogleDataTransport: 1c8145da7117bd68bbbed00cf304edb6a24de00f GoogleDataTransport: 1c8145da7117bd68bbbed00cf304edb6a24de00f
GoogleUtilities: 1d20a6ad97ef46f67bbdec158ce00563a671ebb7 GoogleUtilities: bad72cb363809015b1f7f19beb1f1cd23c589f95
hermes-engine: c2c873a670bc435451449f918c2b3ab3c39255fc hermes-engine: 7fe5fc6ef707b7fdcb161b63898ec500e285653d
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
libwebp: 60305b2e989864154bd9be3d772730f08fc6a59c libwebp: f62cb61d0a484ba548448a4bd52aabf150ff6eef
nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431 nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431
PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb
RCT-Folly: b9d9fe1fc70114b751c076104e52f3b1b5e5a95a RCT-Folly: 0080d0a6ebf2577475bda044aa59e2ca1f909cda
RCTRequired: c8c080849a3670601d5c7056023a2176067a69d8 RCTRequired: 21229f84411088e5d8538f21212de49e46cc83e2
RCTTypeSafety: 710aef40f5ae246bc5fff7e873855b17ed11c180 RCTTypeSafety: 62eed57a32924b09edaaf170a548d1fc96223086
React: b6bb382534be4de9d367ef3d04f92108c1768160 React: f0254ccddeeef1defe66c6b1bb9133a4f040792b
React-bridging: 0fca0337cef9305026814907dd29254a833a2db7 React-bridging: e46911666b7ec19538a620a221d6396cd293d687
React-callinvoker: 700e6eb96b5f7f2fdd96d7263cd4627d2fa080ed React-callinvoker: 66b62e2c34546546b2f21ab0b7670346410a2b53
React-Codegen: fd21633c4b9f47d0681bbb54b173a203963a5e4d React-Codegen: b6999435966df3bdf82afa3f319ba0d6f9a8532a
React-Core: 8ec15c9727c8c01b1e4f14cad5bd21f7c1d56d49 React-Core: dabbc9d1fe0a11d884e6ee1599789cf8eb1058a5
React-CoreModules: 79486447bf901292a83df52d4f7acbecda296723 React-CoreModules: 5b6b7668f156f73a56420df9ec68ca2ec8f2e818
React-cxxreact: 9022135650dd9960a60a1361e9add424c6c37ab9 React-cxxreact: c7ca2baee46db22a30fce9e639277add3c3f6ad1
React-hermes: b5ce7fb460ff6d39e7bb9bbe1f523272c4b85c0b React-hermes: c93e1d759ad5560dfea54d233013d7d2c725c286
React-jsi: 4ccb3599c422ad071e3895c5feab9b0afc40505d React-jsi: a565dcb49130ed20877a9bb1105ffeecbb93d02d
React-jsiexecutor: c61b60de03b3474e5749b8a8fd8e6507630d62c4 React-jsiexecutor: 31564fa6912459921568e8b0e49024285a4d584b
React-jsinspector: eaacb698c5af7a99131bc1933806372c20222dfd React-jsinspector: badd81696361249893a80477983e697aab3c1a34
React-logger: ebb4d31bbbe4f1a8a1a9b658d7429210b8f68160 React-logger: fdda34dd285bdb0232e059b19d9606fa0ec3bb9c
react-native-blur: 3e9c8e8e9f7d17fa1b94e1a0ae9fd816675f5382 react-native-blur: 50c9feabacbc5f49b61337ebc32192c6be7ec3c3
react-native-blurhash: add4df9a937b4e021a24bc67a0714f13e0bd40b7 react-native-blurhash: add4df9a937b4e021a24bc67a0714f13e0bd40b7
react-native-cameraroll: 38b40d9033e4077b6c603f92f95c6d05fa7907df react-native-cameraroll: a40b082318eb1ecd0336a2f29d9f74b7f2c8cae8
react-native-context-menu-view: b0beca02aad4bd9f9d7d932bf437e0a03baa69ef react-native-context-menu-view: b0beca02aad4bd9f9d7d932bf437e0a03baa69ef
react-native-image-picker: 4bc9ed38c8be255b515d8c88babbaf74973f91a8 react-native-image-picker: 4bc9ed38c8be255b515d8c88babbaf74973f91a8
react-native-language-detection: 0e43195ad014974f1b7a31b64820eff34a243f2d react-native-language-detection: 0e43195ad014974f1b7a31b64820eff34a243f2d
react-native-live-text-image-view: 483bacfdba464162b8cf176bba555364f18b584c react-native-live-text-image-view: 483bacfdba464162b8cf176bba555364f18b584c
react-native-netinfo: f80db8cac2151405633324cb645c60af098ee461 react-native-netinfo: f80db8cac2151405633324cb645c60af098ee461
react-native-pager-view: 592421df0259bf7a7a4fe85b74c24f3f39905605 react-native-pager-view: 7abf89f9834d9a4021b2fb6a5ef2abff570b46fb
react-native-paste-input: 183ad7dc224e192719616f4258dde5b548627d08 react-native-paste-input: 183ad7dc224e192719616f4258dde5b548627d08
react-native-safe-area-context: 99b24a0c5acd0d5dcac2b1a7f18c49ea317be99a react-native-safe-area-context: 99b24a0c5acd0d5dcac2b1a7f18c49ea317be99a
react-native-segmented-control: 65df6cd0619b780b3843d574a72d4c7cec396097 react-native-segmented-control: 65df6cd0619b780b3843d574a72d4c7cec396097
React-perflogger: 1fb1ad5333b43a5137afd7608695f7a42c5efd27 React-perflogger: e68d3795cf5d247a0379735cbac7309adf2fb931
React-RCTActionSheet: a435bd67689433575a1e5d7614b021d2c17f0726 React-RCTActionSheet: 05452c3b281edb27850253db13ecd4c5a65bc247
React-RCTAnimation: d097c5ed2d00735958508617555abd85183b94e2 React-RCTAnimation: 578eebac706428e68466118e84aeacf3a282b4da
React-RCTBlob: f43a0fceb328e1a40aa52701a4eba955635444ab React-RCTBlob: f47a0aa61e7d1fb1a0e13da832b0da934939d71a
React-RCTImage: 08f4428e931efe0eefb94443c8ca08cfb250a556 React-RCTImage: 60f54b66eed65d86b6dffaf4733d09161d44929d
React-RCTLinking: 3a8851e818652582f87e5a7577302e6ad7e1de3e React-RCTLinking: 91073205aeec4b29450ca79b709277319368ac9e
React-RCTNetwork: 19f7c66b612e2336eefdfbc7ab3a9bd8ca4e21cf React-RCTNetwork: ca91f2c9465a7e335c8a5fae731fd7f10572213b
React-RCTSettings: 9324e718a865ff01e4a96be4c65923581b2d5170 React-RCTSettings: 1a9a5d01337d55c18168c1abe0f4a589167d134a
React-RCTText: 9cadcd5d982c1d25f7439f47354b1c1b75e60105 React-RCTText: c591e8bd9347a294d8416357ca12d779afec01d5
React-RCTVibration: 285f8538386c660e6b9497e204636acd93bf7fcc React-RCTVibration: 8e5c8c5d17af641f306d7380d8d0fe9b3c142c48
React-runtimeexecutor: 0af71c94f968fa10015bf0119951bccd2e4d8865 React-runtimeexecutor: 7401c4a40f8728fd89df4a56104541b760876117
ReactCommon: fe7580b9d10f00249facf25659e0ec051320cc8a ReactCommon: c9246996e73bf75a2c6c3ff15f1e16707cdc2da9
RNCAsyncStorage: 0c357f3156fcb16c8589ede67cc036330b6698ca RNCAsyncStorage: 8616bd5a58af409453ea4e1b246521bb76578d60
RNCClipboard: 2834e1c4af68697089cdd455ee4a4cdd198fa7dd RNCClipboard: 2834e1c4af68697089cdd455ee4a4cdd198fa7dd
RNFastImage: c74e098cb862b4870c3de0b1096b65c63e492938 RNFastImage: c5dd1b551779c5826fe43b7d36788385da2021e2
RNGestureHandler: 62232ba8f562f7dea5ba1b3383494eb5bf97a4d3 RNGestureHandler: 62232ba8f562f7dea5ba1b3383494eb5bf97a4d3
RNReanimated: c3e58924b9418883b0bde9e78c4c957302f02435 RNReanimated: 2a91e85fcd343f8af3c58d3425b99fdd285590a5
RNScreens: 34cc502acf1b916c582c60003dc3089fa01dc66d RNScreens: 34cc502acf1b916c582c60003dc3089fa01dc66d
RNSentry: 694aecc3d8240e4935374974a6636e360ae06394 RNSentry: db7fd7b66efda28885e4e904a8b5e7349aec61c1
RNShareMenu: cb9dac548c8bf147d06f0bf07296ad51ea9f5fc3 RNShareMenu: cb9dac548c8bf147d06f0bf07296ad51ea9f5fc3
RNSVG: 42a0c731b11179ebbd27a3eeeafa7201ebb476ff RNSVG: 38ca962c970dbce1ca38991a5aebf26d163f9efb
SDWebImage: 23d714cd599354ee7906dbae26dff89b421c4370 SDWebImage: b9a731e1d6307f44ca703b3976d18c24ca561e84
SDWebImageWebPCoder: 18503de6621dd2c420d680e33d46bf8e1d5169b0 SDWebImageWebPCoder: 18503de6621dd2c420d680e33d46bf8e1d5169b0
Sentry: 2c6053e4cfe6dea6608135dea1928ffbb4ecfba5 Sentry: 4272663eb0eda312024d795ca3f5a562a8ce5e18
Swime: d7b2c277503b6cea317774aedc2dce05613f8b0b Swime: d7b2c277503b6cea317774aedc2dce05613f8b0b
Yoga: 75bf4b0131cfb46a659cd0c13309b79a6fcff66d Yoga: eca980a5771bf114c41a754098cd85e6e0d90ed7
PODFILE CHECKSUM: 244b6793e4be83f0909a91b2fe15c8f89a5e8151 PODFILE CHECKSUM: e4191b63c8f15031b2365226730770e7978dca41
COCOAPODS: 1.11.3 COCOAPODS: 1.11.3

View File

@ -0,0 +1,2 @@
"NSPhotoLibraryAddUsageDescription" = "Autoriser tooot à enregistrer des images sur votre pellicule";
"NSPhotoLibraryUsageDescription" = "Autoriser tooot à enregistrer des images sur votre pellicule";

View File

@ -76,6 +76,7 @@
E633A427281EAEAB000E540F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; E633A427281EAEAB000E540F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
E633A42F281EAF38000E540F /* ShareViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ShareViewController.swift; path = "../../node_modules/react-native-share-menu/ios/ShareViewController.swift"; sourceTree = "<group>"; }; E633A42F281EAF38000E540F /* ShareViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ShareViewController.swift; path = "../../node_modules/react-native-share-menu/ios/ShareViewController.swift"; sourceTree = "<group>"; };
E633A431281EB55C000E540F /* ShareExtension-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ShareExtension-Bridging-Header.h"; sourceTree = "<group>"; }; E633A431281EB55C000E540F /* ShareExtension-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ShareExtension-Bridging-Header.h"; sourceTree = "<group>"; };
E66C0842291F095800DFFF60 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = "<group>"; };
E671BDF8290EAFB800287BD0 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/InfoPlist.strings"; sourceTree = "<group>"; }; E671BDF8290EAFB800287BD0 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
E69EBACA28DF282D0057EDEC /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; }; E69EBACA28DF282D0057EDEC /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; };
E69EBACB28DF283A0057EDEC /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = "<group>"; }; E69EBACB28DF283A0057EDEC /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = "<group>"; };
@ -291,6 +292,7 @@
vi, vi,
ja, ja,
"zh-Hant", "zh-Hant",
fr,
); );
mainGroup = 83CBB9F61A601CBA00E9B192; mainGroup = 83CBB9F61A601CBA00E9B192;
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
@ -519,6 +521,7 @@
E69EBACE28DF28560057EDEC /* vi */, E69EBACE28DF28560057EDEC /* vi */,
E6C8B26628F5F9FC0062CF2E /* ja */, E6C8B26628F5F9FC0062CF2E /* ja */,
E671BDF8290EAFB800287BD0 /* zh-Hant */, E671BDF8290EAFB800287BD0 /* zh-Hant */,
E66C0842291F095800DFFF60 /* fr */,
); );
name = InfoPlist.strings; name = InfoPlist.strings;
sourceTree = "<group>"; sourceTree = "<group>";
@ -544,7 +547,8 @@
"FB_SONARKIT_ENABLED=1", "FB_SONARKIT_ENABLED=1",
); );
INFOPLIST_FILE = tooot/Info.plist; INFOPLIST_FILE = tooot/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.4; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
@ -581,7 +585,8 @@
DEVELOPMENT_TEAM = 8EGBLQ2MA6; DEVELOPMENT_TEAM = 8EGBLQ2MA6;
"ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES;
INFOPLIST_FILE = tooot/Info.plist; INFOPLIST_FILE = tooot/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.4; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
@ -609,7 +614,7 @@
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; CLANG_CXX_LANGUAGE_STANDARD = "c++17";
CLANG_CXX_LIBRARY = "libc++"; CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_ARC = YES;
@ -654,12 +659,12 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.4; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
/usr/lib/swift, /usr/lib/swift,
"$(inherited)", "$(inherited)",
); );
LIBRARY_SEARCH_PATHS = "\"\""; LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"\"";
MTL_ENABLE_DEBUG_INFO = YES; MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
@ -672,7 +677,7 @@
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; CLANG_CXX_LANGUAGE_STANDARD = "c++17";
CLANG_CXX_LIBRARY = "libc++"; CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_ARC = YES;
@ -710,12 +715,12 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.4; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
/usr/lib/swift, /usr/lib/swift,
"$(inherited)", "$(inherited)",
); );
LIBRARY_SEARCH_PATHS = "\"\""; LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"\"";
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
ONLY_ACTIVE_ARCH = NO; ONLY_ACTIVE_ARCH = NO;
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
@ -747,7 +752,7 @@
INFOPLIST_FILE = ShareExtension/Info.plist; INFOPLIST_FILE = ShareExtension/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = ShareExtension; INFOPLIST_KEY_CFBundleDisplayName = ShareExtension;
INFOPLIST_KEY_NSHumanReadableCopyright = ""; INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 12.4; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
"IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2; "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
@ -796,7 +801,7 @@
INFOPLIST_FILE = ShareExtension/Info.plist; INFOPLIST_FILE = ShareExtension/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = ShareExtension; INFOPLIST_KEY_CFBundleDisplayName = ShareExtension;
INFOPLIST_KEY_NSHumanReadableCopyright = ""; INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 12.4; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
"IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2; "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",

View File

@ -1,6 +1,6 @@
{ {
"name": "tooot", "name": "tooot",
"version": "4.5.1", "version": "4.6.0",
"description": "tooot for Mastodon", "description": "tooot for Mastodon",
"author": "xmflsct <me@xmflsct.com>", "author": "xmflsct <me@xmflsct.com>",
"license": "GPL-3.0-or-later", "license": "GPL-3.0-or-later",
@ -18,7 +18,7 @@
"postinstall": "patch-package" "postinstall": "patch-package"
}, },
"dependencies": { "dependencies": {
"@expo/react-native-action-sheet": "^4.0.0", "@expo/react-native-action-sheet": "^4.0.1",
"@formatjs/intl-datetimeformat": "^6.3.1", "@formatjs/intl-datetimeformat": "^6.3.1",
"@formatjs/intl-getcanonicallocales": "^2.0.4", "@formatjs/intl-getcanonicallocales": "^2.0.4",
"@formatjs/intl-locale": "^3.0.7", "@formatjs/intl-locale": "^3.0.7",
@ -27,47 +27,47 @@
"@formatjs/intl-relativetimeformat": "^11.1.4", "@formatjs/intl-relativetimeformat": "^11.1.4",
"@mattermost/react-native-paste-input": "^0.5.1", "@mattermost/react-native-paste-input": "^0.5.1",
"@neverdull-agency/expo-unlimited-secure-store": "^1.0.10", "@neverdull-agency/expo-unlimited-secure-store": "^1.0.10",
"@react-native-async-storage/async-storage": "^1.17.10", "@react-native-async-storage/async-storage": "~1.17.11",
"@react-native-camera-roll/camera-roll": "^5.0.4", "@react-native-camera-roll/camera-roll": "^5.1.0",
"@react-native-clipboard/clipboard": "^1.11.1", "@react-native-clipboard/clipboard": "^1.11.1",
"@react-native-community/blur": "^4.2.0", "@react-native-community/blur": "^4.3.0",
"@react-native-community/netinfo": "^9.3.6", "@react-native-community/netinfo": "9.3.6",
"@react-native-community/segmented-control": "^2.2.2", "@react-native-community/segmented-control": "^2.2.2",
"@react-navigation/bottom-tabs": "^6.4.0", "@react-navigation/bottom-tabs": "^6.4.0",
"@react-navigation/native": "^6.0.13", "@react-navigation/native": "^6.0.13",
"@react-navigation/native-stack": "^6.9.1", "@react-navigation/native-stack": "^6.9.1",
"@react-navigation/stack": "^6.3.3", "@react-navigation/stack": "^6.3.4",
"@reduxjs/toolkit": "^1.8.6", "@reduxjs/toolkit": "^1.9.0",
"@sentry/react-native": "^4.7.1", "@sentry/react-native": "4.8.0",
"@sharcoux/slider": "^6.0.3", "@sharcoux/slider": "^6.0.3",
"axios": "^0.27.2", "axios": "^0.27.2",
"expo": "^46.0.16", "expo": "^47.0.3",
"expo-auth-session": "^3.7.1", "expo-auth-session": "~3.7.2",
"expo-av": "^12.0.4", "expo-av": "~13.0.1",
"expo-constants": "^13.2.4", "expo-constants": "~14.0.2",
"expo-crypto": "^11.0.0", "expo-crypto": "~12.0.0",
"expo-file-system": "^14.1.0", "expo-file-system": "~15.1.1",
"expo-firebase-analytics": "^7.2.0", "expo-firebase-analytics": "~8.0.0",
"expo-haptics": "^11.3.0", "expo-haptics": "~12.0.1",
"expo-linking": "^3.2.2", "expo-linking": "~3.2.3",
"expo-localization": "^13.1.0", "expo-localization": "~14.0.0",
"expo-notifications": "^0.16.1", "expo-notifications": "~0.17.0",
"expo-random": "^12.3.0", "expo-random": "~13.0.0",
"expo-screen-capture": "^4.3.0", "expo-screen-capture": "~5.0.0",
"expo-secure-store": "^11.3.0", "expo-secure-store": "~12.0.0",
"expo-splash-screen": "^0.16.2", "expo-splash-screen": "~0.17.4",
"expo-store-review": "^5.3.0", "expo-store-review": "~6.0.0",
"expo-video-thumbnails": "^6.4.0", "expo-video-thumbnails": "~7.0.0",
"expo-web-browser": "^11.0.0", "expo-web-browser": "~12.0.0",
"i18next": "^22.0.4", "i18next": "^22.0.4",
"li": "^1.3.0", "li": "^1.3.0",
"linkify-it": "^4.0.1", "linkify-it": "^4.0.1",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"react": "^18.2.0", "react": "18.2.0",
"react-dom": "^18.2.0", "react-dom": "18.2.0",
"react-i18next": "^12.0.0", "react-i18next": "^12.0.0",
"react-intl": "^6.2.1", "react-intl": "^6.2.1",
"react-native": "^0.69.6", "react-native": "0.70.5",
"react-native-animated-spinkit": "^1.5.2", "react-native-animated-spinkit": "^1.5.2",
"react-native-base64": "^0.2.1", "react-native-base64": "^0.2.1",
"react-native-blurhash": "^1.1.10", "react-native-blurhash": "^1.1.10",
@ -75,37 +75,37 @@
"react-native-fast-image": "^8.6.3", "react-native-fast-image": "^8.6.3",
"react-native-feather": "^1.1.2", "react-native-feather": "^1.1.2",
"react-native-flash-message": "^0.3.1", "react-native-flash-message": "^0.3.1",
"react-native-gesture-handler": "^2.8.0", "react-native-gesture-handler": "~2.8.0",
"react-native-htmlview": "^0.16.0", "react-native-htmlview": "^0.16.0",
"react-native-image-picker": "^4.10.0", "react-native-image-picker": "^4.10.0",
"react-native-language-detection": "^0.1.0", "react-native-language-detection": "^0.1.0",
"react-native-live-text-image-view": "^0.4.0", "react-native-live-text-image-view": "^0.4.0",
"react-native-pager-view": "^6.0.2", "react-native-pager-view": "6.1.0",
"react-native-reanimated": "^2.12.0", "react-native-reanimated": "~2.12.0",
"react-native-reanimated-zoom": "^0.3.2", "react-native-reanimated-zoom": "^0.3.3",
"react-native-safe-area-context": "^4.4.1", "react-native-safe-area-context": "4.4.1",
"react-native-screens": "^3.18.2", "react-native-screens": "~3.18.2",
"react-native-share-menu": "^6.0.0", "react-native-share-menu": "^6.0.0",
"react-native-svg": "13.0.0", "react-native-svg": "13.5.0",
"react-native-swipe-list-view": "^3.2.9", "react-native-swipe-list-view": "^3.2.9",
"react-native-tab-view": "^3.3.0", "react-native-tab-view": "^3.3.0",
"react-query": "^3.39.2", "react-query": "^3.39.2",
"react-redux": "^8.0.4", "react-redux": "^8.0.5",
"redux-persist": "^6.0.0", "redux-persist": "^6.0.0",
"rn-placeholder": "^3.0.3", "rn-placeholder": "^3.0.3",
"valid-url": "^1.0.9" "valid-url": "^1.0.9"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.19.6", "@babel/core": "^7.20.2",
"@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-proposal-optional-chaining": "^7.18.9",
"@babel/preset-react": "^7.18.6", "@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.18.6", "@babel/preset-typescript": "^7.18.6",
"@expo/config": "^7.0.1", "@expo/config": "^7.0.3",
"@types/linkify-it": "^3.0.2", "@types/linkify-it": "^3.0.2",
"@types/lodash": "^4.14.186", "@types/lodash": "^4.14.188",
"@types/react": "^18.0.24", "@types/react": "~18.0.25",
"@types/react-dom": "^18.0.8", "@types/react-dom": "~18.0.8",
"@types/react-native": "^0.69.5", "@types/react-native": "~0.70.6",
"@types/react-native-base64": "^0.2.0", "@types/react-native-base64": "^0.2.0",
"@types/react-native-share-menu": "^5.0.2", "@types/react-native-share-menu": "^5.0.2",
"@types/react-timeago": "^4.1.3", "@types/react-timeago": "^4.1.3",
@ -115,6 +115,7 @@
"babel-plugin-transform-remove-console": "^6.9.4", "babel-plugin-transform-remove-console": "^6.9.4",
"chalk": "^4.1.2", "chalk": "^4.1.2",
"dotenv": "^16.0.3", "dotenv": "^16.0.3",
"expo-cli": "^6.0.8",
"patch-package": "^6.5.0", "patch-package": "^6.5.0",
"postinstall-postinstall": "^2.1.0", "postinstall-postinstall": "^2.1.0",
"react-native-clean-project": "^4.0.1", "react-native-clean-project": "^4.0.1",

View File

@ -1,5 +1,5 @@
diff --git a/node_modules/react-native-fast-image/RNFastImage.podspec b/node_modules/react-native-fast-image/RNFastImage.podspec diff --git a/node_modules/react-native-fast-image/RNFastImage.podspec b/node_modules/react-native-fast-image/RNFastImage.podspec
index db0fada..23770b6 100644 index db0fada..b23cd91 100644
--- a/node_modules/react-native-fast-image/RNFastImage.podspec --- a/node_modules/react-native-fast-image/RNFastImage.podspec
+++ b/node_modules/react-native-fast-image/RNFastImage.podspec +++ b/node_modules/react-native-fast-image/RNFastImage.podspec
@@ -16,6 +16,6 @@ Pod::Spec.new do |s| @@ -16,6 +16,6 @@ Pod::Spec.new do |s|
@ -8,7 +8,7 @@ index db0fada..23770b6 100644
s.dependency 'React-Core' s.dependency 'React-Core'
- s.dependency 'SDWebImage', '~> 5.11.1' - s.dependency 'SDWebImage', '~> 5.11.1'
- s.dependency 'SDWebImageWebPCoder', '~> 0.8.4' - s.dependency 'SDWebImageWebPCoder', '~> 0.8.4'
+ s.dependency 'SDWebImage', '~> 5.13.5' + s.dependency 'SDWebImage', '~> 5.14.2'
+ s.dependency 'SDWebImageWebPCoder', '~> 0.9.1' + s.dependency 'SDWebImageWebPCoder', '~> 0.9.1'
end end
diff --git a/node_modules/react-native-fast-image/android/build.gradle b/node_modules/react-native-fast-image/android/build.gradle diff --git a/node_modules/react-native-fast-image/android/build.gradle b/node_modules/react-native-fast-image/android/build.gradle

View File

@ -1,41 +0,0 @@
diff --git a/node_modules/react-native-reanimated-zoom/lib/typescript/zoom.d.ts b/node_modules/react-native-reanimated-zoom/lib/typescript/zoom.d.ts
index 38fb6f1..e93c288 100644
--- a/node_modules/react-native-reanimated-zoom/lib/typescript/zoom.d.ts
+++ b/node_modules/react-native-reanimated-zoom/lib/typescript/zoom.d.ts
@@ -6,6 +6,7 @@ declare type Props = {
minimumZoomScale?: number;
maximumZoomScale?: number;
simultaneousGesture?: GestureType;
+ isZoomed?: SharedValue<boolean>;
} & ViewProps;
export declare function Zoom(props: Props): JSX.Element;
export {};
diff --git a/node_modules/react-native-reanimated-zoom/src/zoom.tsx b/node_modules/react-native-reanimated-zoom/src/zoom.tsx
index e07b415..d57a1eb 100644
--- a/node_modules/react-native-reanimated-zoom/src/zoom.tsx
+++ b/node_modules/react-native-reanimated-zoom/src/zoom.tsx
@@ -7,6 +7,7 @@ import Animated, {
withTiming,
cancelAnimation,
runOnJS,
+ SharedValue,
} from 'react-native-reanimated';
import {
Gesture,
@@ -20,6 +21,7 @@ type Props = {
minimumZoomScale?: number;
maximumZoomScale?: number;
simultaneousGesture?: GestureType;
+ isZoomed?: SharedValue<boolean>;
} & ViewProps;
export function Zoom(props: Props) {
@@ -39,7 +41,7 @@ export function Zoom(props: Props) {
const originY = useSharedValue(0);
const scale = useSharedValue(1);
const isPinching = useSharedValue(false);
- const isZoomed = useSharedValue(false);
+ const isZoomed = props.isZoomed || useSharedValue(false);
const viewHeight = useSharedValue(0);
const viewWidth = useSharedValue(0);

View File

@ -29,6 +29,7 @@ declare namespace Mastodon {
fields: Field[] fields: Field[]
bot: boolean bot: boolean
source?: Source source?: Source
suspended?: boolean
} }
type Announcement = { type Announcement = {

View File

@ -34,9 +34,11 @@ const ComponentAccount: React.FC<Props> = ({
<Pressable <Pressable
accessibilityRole='button' accessibilityRole='button'
style={{ style={{
flex: 1,
paddingHorizontal: StyleConstants.Spacing.Global.PagePadding, paddingHorizontal: StyleConstants.Spacing.Global.PagePadding,
paddingVertical: StyleConstants.Spacing.M, paddingVertical: StyleConstants.Spacing.M,
flexDirection: 'row', flexDirection: 'row',
alignSelf: 'flex-start',
alignItems: 'center' alignItems: 'center'
}} }}
onPress={customOnPress || onPress} onPress={customOnPress || onPress}

View File

@ -207,6 +207,10 @@ const ParseHTML = React.memo(
expandHint = t('HTML.defaultHint') expandHint = t('HTML.defaultHint')
} }
if (disableDetails) {
numberOfLines = 4
}
const renderNodeCallback = useCallback( const renderNodeCallback = useCallback(
(node: any, index: any) => (node: any, index: any) =>
renderNode({ renderNode({
@ -247,7 +251,7 @@ const ParseHTML = React.memo(
return ( return (
<View style={{ overflow: 'hidden' }}> <View style={{ overflow: 'hidden' }}>
{typeof totalLines === 'number' || numberOfLines === 1 ? ( {(!disableDetails && typeof totalLines === 'number') || numberOfLines === 1 ? (
<Pressable <Pressable
accessibilityLabel={t('HTML.accessibilityHint')} accessibilityLabel={t('HTML.accessibilityHint')}
onPress={() => { onPress={() => {

View File

@ -16,8 +16,8 @@ import { getInstanceAccount } from '@utils/slices/instancesSlice'
import { StyleConstants } from '@utils/styles/constants' import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager' import { useTheme } from '@utils/styles/ThemeManager'
import { uniqBy } from 'lodash' import { uniqBy } from 'lodash'
import React, { useCallback, useRef } from 'react' import React, { useRef } from 'react'
import { Pressable, View } from 'react-native' import { Pressable, StyleProp, View, ViewStyle } from 'react-native'
import { useSelector } from 'react-redux' import { useSelector } from 'react-redux'
import TimelineContextMenu from './Shared/ContextMenu' import TimelineContextMenu from './Shared/ContextMenu'
import TimelineFeedback from './Shared/Feedback' import TimelineFeedback from './Shared/Feedback'
@ -45,6 +45,10 @@ const TimelineDefault: React.FC<Props> = ({
disableDetails = false, disableDetails = false,
disableOnPress = false disableOnPress = false
}) => { }) => {
if (highlighted) {
disableOnPress = true
}
const { colors } = useTheme() const { colors } = useTheme()
const instanceAccount = useSelector(getInstanceAccount, () => true) const instanceAccount = useSelector(getInstanceAccount, () => true)
const navigation = useNavigation<StackNavigationProp<TabLocalStackParamList>>() const navigation = useNavigation<StackNavigationProp<TabLocalStackParamList>>()
@ -58,27 +62,105 @@ const TimelineDefault: React.FC<Props> = ({
complete: false complete: false
}) })
if ( const filtered = queryKey && shouldFilter({ copiableContent, status: actualStatus, queryKey })
queryKey && if (queryKey && filtered && !highlighted) {
shouldFilter({ copiableContent, status: actualStatus, queryKey }) && return <TimelineFiltered phrase={filtered} />
!highlighted
) {
return <TimelineFiltered />
} }
const onPress = useCallback(() => { const onPress = () => {
analytics('timeline_default_press', { analytics('timeline_default_press', {
page: queryKey ? queryKey[1].page : origin page: queryKey ? queryKey[1].page : origin
}) })
!disableOnPress && navigation.push('Tab-Shared-Toot', {
!highlighted && toot: actualStatus,
navigation.push('Tab-Shared-Toot', { rootQueryKey: queryKey
toot: actualStatus, })
rootQueryKey: queryKey }
})
}, [])
return ( const mainStyle: StyleProp<ViewStyle> = {
padding: StyleConstants.Spacing.Global.PagePadding,
backgroundColor: colors.backgroundDefault,
paddingBottom: disableDetails ? StyleConstants.Spacing.Global.PagePadding : 0
}
const main = () => (
<>
{item.reblog ? (
<TimelineActioned action='reblog' account={item.account} />
) : item._pinned ? (
<TimelineActioned action='pinned' account={item.account} />
) : null}
<View style={{ flex: 1, width: '100%', flexDirection: 'row' }}>
<TimelineAvatar
queryKey={disableOnPress ? undefined : queryKey}
account={actualStatus.account}
highlighted={highlighted}
/>
<TimelineHeaderDefault
queryKey={disableOnPress ? undefined : queryKey}
status={actualStatus}
highlighted={highlighted}
/>
</View>
<View
style={{
paddingTop: highlighted ? StyleConstants.Spacing.S : 0,
paddingLeft: highlighted ? 0 : StyleConstants.Avatar.M + StyleConstants.Spacing.S
}}
>
{typeof actualStatus.content === 'string' && actualStatus.content.length > 0 ? (
<TimelineContent
status={actualStatus}
highlighted={highlighted}
disableDetails={disableDetails}
/>
) : null}
{queryKey && actualStatus.poll ? (
<TimelinePoll
queryKey={queryKey}
rootQueryKey={rootQueryKey}
statusId={actualStatus.id}
poll={actualStatus.poll}
reblog={item.reblog ? true : false}
sameAccount={ownAccount}
/>
) : null}
{!disableDetails &&
Array.isArray(actualStatus.media_attachments) &&
actualStatus.media_attachments.length ? (
<TimelineAttachment status={actualStatus} />
) : null}
{!disableDetails && actualStatus.card ? <TimelineCard card={actualStatus.card} /> : null}
{!disableDetails ? (
<TimelineFullConversation queryKey={queryKey} status={actualStatus} />
) : null}
<TimelineTranslate status={actualStatus} highlighted={highlighted} />
<TimelineFeedback status={actualStatus} highlighted={highlighted} />
</View>
{queryKey && !disableDetails ? (
<TimelineActions
queryKey={queryKey}
rootQueryKey={rootQueryKey}
highlighted={highlighted}
status={actualStatus}
ownAccount={ownAccount}
accts={uniqBy(
([actualStatus.account] as Mastodon.Account[] & Mastodon.Mention[])
.concat(actualStatus.mentions)
.filter(d => d?.id !== instanceAccount?.id),
d => d?.id
).map(d => d?.acct)}
reblog={item.reblog ? true : false}
/>
) : null}
</>
)
return disableOnPress ? (
<View style={mainStyle}>{main()}</View>
) : (
<TimelineContextMenu <TimelineContextMenu
copiableContent={copiableContent} copiableContent={copiableContent}
status={actualStatus} status={actualStatus}
@ -87,86 +169,11 @@ const TimelineDefault: React.FC<Props> = ({
> >
<Pressable <Pressable
accessible={highlighted ? false : true} accessible={highlighted ? false : true}
style={{ style={mainStyle}
padding: StyleConstants.Spacing.Global.PagePadding,
backgroundColor: colors.backgroundDefault,
paddingBottom:
disableDetails && disableOnPress ? StyleConstants.Spacing.Global.PagePadding : 0
}}
onPress={onPress} onPress={onPress}
onLongPress={() => {}} onLongPress={() => {}}
> >
{item.reblog ? ( {main()}
<TimelineActioned action='reblog' account={item.account} />
) : item._pinned ? (
<TimelineActioned action='pinned' account={item.account} />
) : null}
<View style={{ flex: 1, width: '100%', flexDirection: 'row' }}>
<TimelineAvatar
queryKey={disableOnPress ? undefined : queryKey}
account={actualStatus.account}
highlighted={highlighted}
/>
<TimelineHeaderDefault
queryKey={disableOnPress ? undefined : queryKey}
status={actualStatus}
highlighted={highlighted}
/>
</View>
<View
style={{
paddingTop: highlighted ? StyleConstants.Spacing.S : 0,
paddingLeft: highlighted ? 0 : StyleConstants.Avatar.M + StyleConstants.Spacing.S
}}
>
{typeof actualStatus.content === 'string' && actualStatus.content.length > 0 ? (
<TimelineContent
status={actualStatus}
highlighted={highlighted}
disableDetails={disableDetails}
/>
) : null}
{queryKey && actualStatus.poll ? (
<TimelinePoll
queryKey={queryKey}
rootQueryKey={rootQueryKey}
statusId={actualStatus.id}
poll={actualStatus.poll}
reblog={item.reblog ? true : false}
sameAccount={ownAccount}
/>
) : null}
{!disableDetails &&
Array.isArray(actualStatus.media_attachments) &&
actualStatus.media_attachments.length ? (
<TimelineAttachment status={actualStatus} />
) : null}
{!disableDetails && actualStatus.card ? <TimelineCard card={actualStatus.card} /> : null}
{!disableDetails ? (
<TimelineFullConversation queryKey={queryKey} status={actualStatus} />
) : null}
<TimelineTranslate status={actualStatus} highlighted={highlighted} />
<TimelineFeedback status={actualStatus} highlighted={highlighted} />
</View>
{queryKey && !disableDetails ? (
<TimelineActions
queryKey={queryKey}
rootQueryKey={rootQueryKey}
highlighted={highlighted}
status={actualStatus}
ownAccount={ownAccount}
accts={uniqBy(
([actualStatus.account] as Mastodon.Account[] & Mastodon.Mention[])
.concat(actualStatus.mentions)
.filter(d => d?.id !== instanceAccount?.id),
d => d?.id
).map(d => d?.acct)}
reblog={item.reblog ? true : false}
/>
) : null}
</Pressable> </Pressable>
</TimelineContextMenu> </TimelineContextMenu>
) )

View File

@ -36,24 +36,22 @@ const TimelineNotifications = React.memo(
complete: false complete: false
}) })
if ( const filtered =
notification.status && notification.status &&
shouldFilter({ copiableContent, status: notification.status, queryKey }) shouldFilter({
) { copiableContent,
return <TimelineFiltered /> status: notification.status,
queryKey
})
if (notification.status && filtered) {
return <TimelineFiltered phrase={filtered} />
} }
const { colors } = useTheme() const { colors } = useTheme()
const instanceAccount = useSelector( const instanceAccount = useSelector(getInstanceAccount, (prev, next) => prev?.id === next?.id)
getInstanceAccount, const navigation = useNavigation<StackNavigationProp<TabLocalStackParamList>>()
(prev, next) => prev?.id === next?.id
)
const navigation =
useNavigation<StackNavigationProp<TabLocalStackParamList>>()
const actualAccount = notification.status const actualAccount = notification.status ? notification.status.account : notification.account
? notification.status.account
: notification.account
const onPress = useCallback(() => { const onPress = useCallback(() => {
analytics('timeline_notification_press') analytics('timeline_notification_press')
@ -74,9 +72,7 @@ const TimelineNotifications = React.memo(
style={{ style={{
padding: StyleConstants.Spacing.Global.PagePadding, padding: StyleConstants.Spacing.Global.PagePadding,
backgroundColor: colors.backgroundDefault, backgroundColor: colors.backgroundDefault,
paddingBottom: notification.status paddingBottom: notification.status ? 0 : StyleConstants.Spacing.Global.PagePadding
? 0
: StyleConstants.Spacing.Global.PagePadding
}} }}
onPress={onPress} onPress={onPress}
onLongPress={() => {}} onLongPress={() => {}}
@ -106,26 +102,18 @@ const TimelineNotifications = React.memo(
account={actualAccount} account={actualAccount}
highlighted={highlighted} highlighted={highlighted}
/> />
<TimelineHeaderNotification <TimelineHeaderNotification queryKey={queryKey} notification={notification} />
queryKey={queryKey}
notification={notification}
/>
</View> </View>
{notification.status ? ( {notification.status ? (
<View <View
style={{ style={{
paddingTop: highlighted ? StyleConstants.Spacing.S : 0, paddingTop: highlighted ? StyleConstants.Spacing.S : 0,
paddingLeft: highlighted paddingLeft: highlighted ? 0 : StyleConstants.Avatar.M + StyleConstants.Spacing.S
? 0
: StyleConstants.Avatar.M + StyleConstants.Spacing.S
}} }}
> >
{notification.status.content.length > 0 ? ( {notification.status.content.length > 0 ? (
<TimelineContent <TimelineContent status={notification.status} highlighted={highlighted} />
status={notification.status}
highlighted={highlighted}
/>
) : null} ) : null}
{notification.status.poll ? ( {notification.status.poll ? (
<TimelinePoll <TimelinePoll
@ -133,21 +121,14 @@ const TimelineNotifications = React.memo(
statusId={notification.status.id} statusId={notification.status.id}
poll={notification.status.poll} poll={notification.status.poll}
reblog={false} reblog={false}
sameAccount={ sameAccount={notification.account.id === instanceAccount?.id}
notification.account.id === instanceAccount?.id
}
/> />
) : null} ) : null}
{notification.status.media_attachments.length > 0 ? ( {notification.status.media_attachments.length > 0 ? (
<TimelineAttachment status={notification.status} /> <TimelineAttachment status={notification.status} />
) : null} ) : null}
{notification.status.card ? ( {notification.status.card ? <TimelineCard card={notification.status.card} /> : null}
<TimelineCard card={notification.status.card} /> <TimelineFullConversation queryKey={queryKey} status={notification.status} />
) : null}
<TimelineFullConversation
queryKey={queryKey}
status={notification.status}
/>
</View> </View>
) : null} ) : null}
</View> </View>
@ -158,10 +139,7 @@ const TimelineNotifications = React.memo(
status={notification.status} status={notification.status}
highlighted={highlighted} highlighted={highlighted}
accts={uniqBy( accts={uniqBy(
( ([notification.status.account] as Mastodon.Account[] & Mastodon.Mention[])
[notification.status.account] as Mastodon.Account[] &
Mastodon.Mention[]
)
.concat(notification.status.mentions) .concat(notification.status.mentions)
.filter(d => d?.id !== instanceAccount?.id), .filter(d => d?.id !== instanceAccount?.id),
d => d?.id d => d?.id

View File

@ -1,24 +1,184 @@
import ComponentAccount from '@components/Account'
import analytics from '@components/analytics' import analytics from '@components/analytics'
import GracefullyImage from '@components/GracefullyImage' import GracefullyImage from '@components/GracefullyImage'
import openLink from '@components/openLink' import openLink from '@components/openLink'
import CustomText from '@components/Text' import CustomText from '@components/Text'
import { matchAccount, matchStatus } from '@helpers/urlMatcher'
import { useNavigation } from '@react-navigation/native' import { useNavigation } from '@react-navigation/native'
import { useAccountQuery } from '@utils/queryHooks/account'
import { useSearchQuery } from '@utils/queryHooks/search'
import { useStatusQuery } from '@utils/queryHooks/status'
import { StyleConstants } from '@utils/styles/constants' import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager' import { useTheme } from '@utils/styles/ThemeManager'
import React from 'react' import React, { useEffect, useState } from 'react'
import { Pressable, StyleSheet, View } from 'react-native' import { Pressable, StyleSheet, View } from 'react-native'
import { Circle } from 'react-native-animated-spinkit'
import TimelineDefault from '../Default'
export interface Props { export interface Props {
card: Pick< card: Pick<Mastodon.Card, 'url' | 'image' | 'blurhash' | 'title' | 'description'>
Mastodon.Card,
'url' | 'image' | 'blurhash' | 'title' | 'description'
>
} }
const TimelineCard = React.memo(({ card }: Props) => { const TimelineCard = React.memo(({ card }: Props) => {
const { colors } = useTheme() const { colors } = useTheme()
const navigation = useNavigation() const navigation = useNavigation()
const [loading, setLoading] = useState(false)
const isStatus = matchStatus(card.url)
const [foundStatus, setFoundStatus] = useState<Mastodon.Status>()
const isAccount = matchAccount(card.url)
const [foundAccount, setFoundAccount] = useState<Mastodon.Account>()
const searchQuery = useSearchQuery({
type: (() => {
if (isStatus) return 'statuses'
if (isAccount) return 'accounts'
})(),
term: (() => {
if (isStatus) {
if (isStatus.sameInstance) {
return
} else {
return card.url
}
}
if (isAccount) {
if (isAccount.sameInstance) {
if (isAccount.style === 'default') {
return
} else {
return isAccount.username
}
} else {
return card.url
}
}
})(),
limit: 1,
options: { enabled: false }
})
const statusQuery = useStatusQuery({
id: isStatus?.id || '',
options: { enabled: false }
})
useEffect(() => {
if (isStatus) {
setLoading(true)
if (isStatus.sameInstance) {
statusQuery
.refetch()
.then(res => {
res.data && setFoundStatus(res.data)
setLoading(false)
})
.catch(() => setLoading(false))
} else {
searchQuery
.refetch()
.then(res => {
const status = (res.data as any)?.statuses?.[0]
status && setFoundStatus(status)
setLoading(false)
})
.catch(() => setLoading(false))
}
}
}, [])
const accountQuery = useAccountQuery({
id: isAccount?.style === 'default' ? isAccount.id : '',
options: { enabled: false }
})
useEffect(() => {
if (isAccount) {
setLoading(true)
if (isAccount.sameInstance && isAccount.style === 'default') {
accountQuery
.refetch()
.then(res => {
res.data && setFoundAccount(res.data)
setLoading(false)
})
.catch(() => setLoading(false))
} else {
searchQuery
.refetch()
.then(res => {
const account = (res.data as any)?.accounts?.[0]
account && setFoundAccount(account)
setLoading(false)
})
.catch(() => setLoading(false))
}
}
}, [])
const cardContent = () => {
if (loading) {
return (
<View
style={{
flex: 1,
justifyContent: 'center',
alignItems: 'center',
paddingVertical: StyleConstants.Spacing.M
}}
>
<Circle size={StyleConstants.Font.Size.L} color={colors.secondary} />
</View>
)
}
if (isStatus && foundStatus) {
return <TimelineDefault item={foundStatus} disableDetails disableOnPress origin='card' />
}
if (isAccount && foundAccount) {
return <ComponentAccount account={foundAccount} origin='card' />
}
return (
<>
{card.image ? (
<GracefullyImage
uri={{ original: card.image }}
blurhash={card.blurhash}
style={{ flexBasis: StyleConstants.Font.LineHeight.M * 5 }}
imageStyle={{ borderTopLeftRadius: 6, borderBottomLeftRadius: 6 }}
/>
) : null}
<View style={{ flex: 1, padding: StyleConstants.Spacing.S }}>
<CustomText
fontStyle='S'
numberOfLines={2}
style={{
marginBottom: StyleConstants.Spacing.XS,
color: colors.primaryDefault
}}
fontWeight='Bold'
testID='title'
>
{card.title}
</CustomText>
{card.description ? (
<CustomText
fontStyle='S'
numberOfLines={1}
style={{
marginBottom: StyleConstants.Spacing.XS,
color: colors.primaryDefault
}}
testID='description'
>
{card.description}
</CustomText>
) : null}
<CustomText fontStyle='S' numberOfLines={1} style={{ color: colors.secondary }}>
{card.url}
</CustomText>
</View>
</>
)
}
return ( return (
<Pressable <Pressable
accessible accessible
@ -26,10 +186,10 @@ const TimelineCard = React.memo(({ card }: Props) => {
style={{ style={{
flex: 1, flex: 1,
flexDirection: 'row', flexDirection: 'row',
height: StyleConstants.Font.LineHeight.M * 5, minHeight: isAccount && foundAccount ? undefined : StyleConstants.Font.LineHeight.M * 5,
marginTop: StyleConstants.Spacing.M, marginTop: StyleConstants.Spacing.M,
borderWidth: StyleSheet.hairlineWidth, borderWidth: StyleSheet.hairlineWidth,
borderRadius: 6, borderRadius: StyleConstants.Spacing.S,
overflow: 'hidden', overflow: 'hidden',
borderColor: colors.border borderColor: colors.border
}} }}
@ -37,51 +197,8 @@ const TimelineCard = React.memo(({ card }: Props) => {
analytics('timeline_shared_card_press') analytics('timeline_shared_card_press')
await openLink(card.url, navigation) await openLink(card.url, navigation)
}} }}
testID='base' children={cardContent}
> />
{card.image ? (
<GracefullyImage
uri={{ original: card.image }}
blurhash={card.blurhash}
style={{ flexBasis: StyleConstants.Font.LineHeight.M * 5 }}
imageStyle={{ borderTopLeftRadius: 6, borderBottomLeftRadius: 6 }}
/>
) : null}
<View style={{ flex: 1, padding: StyleConstants.Spacing.S }}>
<CustomText
fontStyle='S'
numberOfLines={2}
style={{
marginBottom: StyleConstants.Spacing.XS,
color: colors.primaryDefault
}}
fontWeight='Bold'
testID='title'
>
{card.title}
</CustomText>
{card.description ? (
<CustomText
fontStyle='S'
numberOfLines={1}
style={{
marginBottom: StyleConstants.Spacing.XS,
color: colors.primaryDefault
}}
testID='description'
>
{card.description}
</CustomText>
) : null}
<CustomText
fontStyle='S'
numberOfLines={1}
style={{ color: colors.secondary }}
>
{card.url}
</CustomText>
</View>
</Pressable>
) )
}) })

View File

@ -10,7 +10,7 @@ import { useTranslation } from 'react-i18next'
import { View } from 'react-native' import { View } from 'react-native'
const TimelineFiltered = React.memo( const TimelineFiltered = React.memo(
() => { ({ phrase }: { phrase: string }) => {
const { colors } = useTheme() const { colors } = useTheme()
const { t } = useTranslation('componentTimeline') const { t } = useTranslation('componentTimeline')
@ -25,7 +25,7 @@ const TimelineFiltered = React.memo(
paddingLeft: StyleConstants.Avatar.M + StyleConstants.Spacing.S paddingLeft: StyleConstants.Avatar.M + StyleConstants.Spacing.S
}} }}
> >
{t('shared.filtered')} {t('shared.filtered', { phrase })}
</CustomText> </CustomText>
</View> </View>
) )
@ -44,34 +44,29 @@ export const shouldFilter = ({
}> }>
status: Mastodon.Status status: Mastodon.Status
queryKey: QueryKeyTimeline queryKey: QueryKeyTimeline
}) => { }): string | null => {
const instance = getInstance(store.getState()) const instance = getInstance(store.getState())
const ownAccount = const ownAccount = getInstanceAccount(store.getState())?.id === status.account?.id
getInstanceAccount(store.getState())?.id === status.account?.id
let shouldFilter = false let shouldFilter: string | null = null
if (!ownAccount) { if (!ownAccount) {
const parser = new htmlparser2.Parser({ const parser = new htmlparser2.Parser({
ontext: (text: string) => { ontext: (text: string) => {
if (!copiableContent.current.complete) { if (!copiableContent.current.complete) {
copiableContent.current.content = copiableContent.current.content = copiableContent.current.content + text
copiableContent.current.content + text
} }
const checkFilter = (filter: Mastodon.Filter) => { const checkFilter = (filter: Mastodon.Filter) => {
const escapedPhrase = filter.phrase.replace( const escapedPhrase = filter.phrase.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') // $& means the whole matched string
/[.*+?^${}()|[\]\\]/g,
'\\$&'
) // $& means the whole matched string
switch (filter.whole_word) { switch (filter.whole_word) {
case true: case true:
if (new RegExp('\\b' + escapedPhrase + '\\b').test(text)) { if (new RegExp('\\b' + escapedPhrase + '\\b').test(text)) {
shouldFilter = true shouldFilter = filter.phrase
} }
break break
case false: case false:
if (new RegExp(escapedPhrase).test(text)) { if (new RegExp(escapedPhrase).test(text)) {
shouldFilter = true shouldFilter = filter.phrase
} }
break break
} }

View File

@ -81,15 +81,10 @@ const TimelineHeaderDefault = ({ queryKey, status, highlighted }: Props) => {
{queryKey ? ( {queryKey ? (
<Pressable <Pressable
accessibilityHint={t('accessibilityHint')} accessibilityHint={t('accessibilityHint')}
style={{ style={{ flex: 1, flexBasis: StyleConstants.Font.Size.L }}
flex: 1,
flexDirection: 'row',
justifyContent: 'center',
marginBottom: StyleConstants.Spacing.L
}}
hitSlop={StyleConstants.Font.Size.M}
> >
<ContextMenu <ContextMenu
style={{ flex: 1, alignItems: 'center' }}
dropdownMenuMode dropdownMenuMode
actions={actions} actions={actions}
onPress={({ nativeEvent: { index } }) => { onPress={({ nativeEvent: { index } }) => {
@ -104,7 +99,6 @@ const TimelineHeaderDefault = ({ queryKey, status, highlighted }: Props) => {
size={StyleConstants.Font.Size.L} size={StyleConstants.Font.Size.L}
/> />
} }
style={{ width: '100%', height: '100%', paddingHorizontal: StyleConstants.Font.Size.M }}
/> />
</Pressable> </Pressable>
) : null} ) : null}

View File

@ -51,15 +51,10 @@ const TimelineHeaderDefault = ({ queryKey, status, highlighted }: Props) => {
{queryKey ? ( {queryKey ? (
<Pressable <Pressable
accessibilityHint={t('accessibilityHint')} accessibilityHint={t('accessibilityHint')}
style={{ style={{ flex: 1, flexBasis: StyleConstants.Font.Size.L }}
flex: 1,
flexDirection: 'row',
justifyContent: 'center',
marginBottom: StyleConstants.Spacing.L
}}
hitSlop={StyleConstants.Font.Size.M}
> >
<ContextMenu <ContextMenu
style={{ flex: 1, alignItems: 'center' }}
dropdownMenuMode dropdownMenuMode
actions={contextMenuContext} actions={contextMenuContext}
onPress={() => {}} onPress={() => {}}
@ -70,7 +65,6 @@ const TimelineHeaderDefault = ({ queryKey, status, highlighted }: Props) => {
size={StyleConstants.Font.Size.L} size={StyleConstants.Font.Size.L}
/> />
} }
style={{ paddingHorizontal: StyleConstants.Font.Size.M }}
/> />
</Pressable> </Pressable>
) : null} ) : null}

View File

@ -3,10 +3,7 @@ import contextMenuInstance from '@components/ContextMenu/instance'
import contextMenuShare from '@components/ContextMenu/share' import contextMenuShare from '@components/ContextMenu/share'
import contextMenuStatus from '@components/ContextMenu/status' import contextMenuStatus from '@components/ContextMenu/status'
import Icon from '@components/Icon' import Icon from '@components/Icon'
import { import { RelationshipIncoming, RelationshipOutgoing } from '@components/Relationship'
RelationshipIncoming,
RelationshipOutgoing
} from '@components/Relationship'
import { QueryKeyTimeline } from '@utils/queryHooks/timeline' import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
import { StyleConstants } from '@utils/styles/constants' import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager' import { useTheme } from '@utils/styles/ThemeManager'
@ -32,27 +29,33 @@ const TimelineHeaderNotification = ({ queryKey, notification }: Props) => {
const shareOnPress = const shareOnPress =
status && status?.visibility !== 'direct' status && status?.visibility !== 'direct'
? contextMenuShare({ ? contextMenuShare({
actions: contextMenuActions, actions: contextMenuActions,
type: 'status', type: 'status',
url: status.url || status.uri url: status.url || status.uri
}) })
: null : null
const statusOnPress = status && contextMenuStatus({ const statusOnPress =
actions: contextMenuActions, status &&
status: status, contextMenuStatus({
queryKey actions: contextMenuActions,
}) status: status,
const accountOnPress = status && contextMenuAccount({ queryKey
actions: contextMenuActions, })
type: 'status', const accountOnPress =
queryKey, status &&
id: status.account.id contextMenuAccount({
}) actions: contextMenuActions,
const instanceOnPress = status && contextMenuInstance({ type: 'status',
actions: contextMenuActions, queryKey,
status: status, id: status.account.id
queryKey })
}) const instanceOnPress =
status &&
contextMenuInstance({
actions: contextMenuActions,
status: status,
queryKey
})
const actions = useMemo(() => { const actions = useMemo(() => {
switch (notification.type) { switch (notification.type) {
@ -64,14 +67,10 @@ const TimelineHeaderNotification = ({ queryKey, notification }: Props) => {
if (notification.status) { if (notification.status) {
return ( return (
<Pressable <Pressable
style={{ style={{ flex: 1, flexBasis: StyleConstants.Font.Size.L }}
flex: 1,
flexDirection: 'row',
justifyContent: 'center',
paddingBottom: StyleConstants.Spacing.S
}}
children={ children={
<ContextMenu <ContextMenu
style={{ flex: 1, alignItems: 'center' }}
dropdownMenuMode dropdownMenuMode
actions={contextMenuActions} actions={contextMenuActions}
onPress={({ nativeEvent: { index } }) => { onPress={({ nativeEvent: { index } }) => {
@ -91,7 +90,6 @@ const TimelineHeaderNotification = ({ queryKey, notification }: Props) => {
size={StyleConstants.Font.Size.L} size={StyleConstants.Font.Size.L}
/> />
} }
style={{ width: '100%', height: '100%' }}
/> />
} }
/> />
@ -104,21 +102,14 @@ const TimelineHeaderNotification = ({ queryKey, notification }: Props) => {
<View style={{ flex: 1, flexDirection: 'row' }}> <View style={{ flex: 1, flexDirection: 'row' }}>
<View <View
style={{ style={{
flex: flex: notification.type === 'follow' || notification.type === 'follow_request' ? 1 : 4
notification.type === 'follow' ||
notification.type === 'follow_request'
? 1
: 4
}} }}
> >
<HeaderSharedAccount <HeaderSharedAccount
account={ account={notification.status ? notification.status.account : notification.account}
notification.status {...((notification.type === 'follow' || notification.type === 'follow_request') && {
? notification.status.account withoutName: true
: notification.account })}
}
{...((notification.type === 'follow' ||
notification.type === 'follow_request') && { withoutName: true })}
/> />
<View <View
style={{ style={{
@ -129,28 +120,21 @@ const TimelineHeaderNotification = ({ queryKey, notification }: Props) => {
}} }}
> >
<HeaderSharedCreated <HeaderSharedCreated
created_at={ created_at={notification.status?.created_at || notification.created_at}
notification.status?.created_at || notification.created_at
}
edited_at={notification.status?.edited_at} edited_at={notification.status?.edited_at}
/> />
{notification.status?.visibility ? ( {notification.status?.visibility ? (
<HeaderSharedVisibility <HeaderSharedVisibility visibility={notification.status.visibility} />
visibility={notification.status.visibility}
/>
) : null} ) : null}
<HeaderSharedMuted muted={notification.status?.muted} /> <HeaderSharedMuted muted={notification.status?.muted} />
<HeaderSharedApplication <HeaderSharedApplication application={notification.status?.application} />
application={notification.status?.application}
/>
</View> </View>
</View> </View>
<View <View
style={[ style={[
{ marginLeft: StyleConstants.Spacing.M }, { marginLeft: StyleConstants.Spacing.M },
notification.type === 'follow' || notification.type === 'follow' || notification.type === 'follow_request'
notification.type === 'follow_request'
? { flexShrink: 1 } ? { flexShrink: 1 }
: { flex: 1 } : { flex: 1 }
]} ]}

View File

@ -1,8 +1,5 @@
import Icon from '@components/Icon' import Icon from '@components/Icon'
import { import { RelationshipIncoming, RelationshipOutgoing } from '@components/Relationship'
RelationshipIncoming,
RelationshipOutgoing
} from '@components/Relationship'
import { QueryKeyTimeline } from '@utils/queryHooks/timeline' import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
import { StyleConstants } from '@utils/styles/constants' import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager' import { useTheme } from '@utils/styles/ThemeManager'
@ -36,14 +33,10 @@ const TimelineHeaderNotification = ({ notification }: Props) => {
if (notification.status) { if (notification.status) {
return ( return (
<Pressable <Pressable
style={{ style={{ flex: 1, flexBasis: StyleConstants.Font.Size.L }}
flex: 1,
flexDirection: 'row',
justifyContent: 'center',
paddingBottom: StyleConstants.Spacing.S
}}
children={ children={
<ContextMenu <ContextMenu
style={{ flex: 1, alignItems: 'center' }}
dropdownMenuMode dropdownMenuMode
actions={contextMenuContext} actions={contextMenuContext}
onPress={() => {}} onPress={() => {}}
@ -66,21 +59,14 @@ const TimelineHeaderNotification = ({ notification }: Props) => {
<View style={{ flex: 1, flexDirection: 'row' }}> <View style={{ flex: 1, flexDirection: 'row' }}>
<View <View
style={{ style={{
flex: flex: notification.type === 'follow' || notification.type === 'follow_request' ? 1 : 4
notification.type === 'follow' ||
notification.type === 'follow_request'
? 1
: 4
}} }}
> >
<HeaderSharedAccount <HeaderSharedAccount
account={ account={notification.status ? notification.status.account : notification.account}
notification.status {...((notification.type === 'follow' || notification.type === 'follow_request') && {
? notification.status.account withoutName: true
: notification.account })}
}
{...((notification.type === 'follow' ||
notification.type === 'follow_request') && { withoutName: true })}
/> />
<View <View
style={{ style={{
@ -91,28 +77,21 @@ const TimelineHeaderNotification = ({ notification }: Props) => {
}} }}
> >
<HeaderSharedCreated <HeaderSharedCreated
created_at={ created_at={notification.status?.created_at || notification.created_at}
notification.status?.created_at || notification.created_at
}
edited_at={notification.status?.edited_at} edited_at={notification.status?.edited_at}
/> />
{notification.status?.visibility ? ( {notification.status?.visibility ? (
<HeaderSharedVisibility <HeaderSharedVisibility visibility={notification.status.visibility} />
visibility={notification.status.visibility}
/>
) : null} ) : null}
<HeaderSharedMuted muted={notification.status?.muted} /> <HeaderSharedMuted muted={notification.status?.muted} />
<HeaderSharedApplication <HeaderSharedApplication application={notification.status?.application} />
application={notification.status?.application}
/>
</View> </View>
</View> </View>
<View <View
style={[ style={[
{ marginLeft: StyleConstants.Spacing.M }, { marginLeft: StyleConstants.Spacing.M },
notification.type === 'follow' || notification.type === 'follow' || notification.type === 'follow_request'
notification.type === 'follow_request'
? { flexShrink: 1 } ? { flexShrink: 1 }
: { flex: 1 } : { flex: 1 }
]} ]}

View File

@ -1,24 +1,12 @@
import apiInstance from '@api/instance' import apiInstance from '@api/instance'
import navigationRef from '@helpers/navigationRef' import navigationRef from '@helpers/navigationRef'
import { matchAccount, matchStatus } from '@helpers/urlMatcher'
import { store } from '@root/store' import { store } from '@root/store'
import { SearchResult } from '@utils/queryHooks/search' import { SearchResult } from '@utils/queryHooks/search'
import { getInstanceUrl } from '@utils/slices/instancesSlice'
import { getSettingsBrowser } from '@utils/slices/settingsSlice' import { getSettingsBrowser } from '@utils/slices/settingsSlice'
import * as Linking from 'expo-linking' import * as Linking from 'expo-linking'
import * as WebBrowser from 'expo-web-browser' import * as WebBrowser from 'expo-web-browser'
// https://social.xmflsct.com/web/statuses/105590085754428765 <- default
// https://social.xmflsct.com/@tooot/105590085754428765 <- pretty
const matcherStatus = new RegExp(
/http[s]?:\/\/(.*)\/(web\/statuses|@.*)\/([0-9]*)/
)
// https://social.xmflsct.com/web/accounts/14195 <- default
// https://social.xmflsct.com/@tooot <- pretty
const matcherAccount = new RegExp(
/http[s]?:\/\/(.*)\/(web\/accounts\/([0-9]*)|@.*)/
)
export let loadingLink = false export let loadingLink = false
const openLink = async (url: string, navigation?: any) => { const openLink = async (url: string, navigation?: any) => {
@ -26,10 +14,7 @@ const openLink = async (url: string, navigation?: any) => {
return return
} }
const handleNavigation = ( const handleNavigation = (page: 'Tab-Shared-Toot' | 'Tab-Shared-Account', options: {}) => {
page: 'Tab-Shared-Toot' | 'Tab-Shared-Account',
options: {}
) => {
if (navigation) { if (navigation) {
// @ts-ignore // @ts-ignore
navigation.push(page, options) navigation.push(page, options)
@ -40,14 +25,10 @@ const openLink = async (url: string, navigation?: any) => {
} }
// If a tooot can be found // If a tooot can be found
const matchedStatus = url.match(matcherStatus) const isStatus = matchStatus(url)
if (matchedStatus) { if (isStatus) {
// If the link in current instance if (isStatus.sameInstance) {
const instanceUrl = getInstanceUrl(store.getState()) handleNavigation('Tab-Shared-Toot', { toot: { id: isStatus.id } })
if (matchedStatus[1] === instanceUrl) {
handleNavigation('Tab-Shared-Toot', {
toot: { id: matchedStatus[3] }
})
return return
} }
@ -71,15 +52,11 @@ const openLink = async (url: string, navigation?: any) => {
} }
// If an account can be found // If an account can be found
const matchedAccount = url.match(matcherAccount) const isAccount = matchAccount(url)
if (matchedAccount) { if (isAccount) {
// If the link in current instance if (isAccount.sameInstance) {
const instanceUrl = getInstanceUrl(store.getState()) if (isAccount.style === 'default' && isAccount.id) {
if (matchedAccount[1] === instanceUrl) { handleNavigation('Tab-Shared-Account', { account: isAccount })
if (matchedAccount[3] && matchedAccount[3].match(/[0-9]*/)) {
handleNavigation('Tab-Shared-Account', {
account: { id: matchedAccount[3] }
})
return return
} }
} }
@ -91,7 +68,12 @@ const openLink = async (url: string, navigation?: any) => {
version: 'v2', version: 'v2',
method: 'get', method: 'get',
url: 'search', url: 'search',
params: { type: 'accounts', q: url, limit: 1, resolve: true } params: {
type: 'accounts',
q: isAccount.sameInstance && isAccount.style === 'pretty' ? isAccount.username : url,
limit: 1,
resolve: true
}
}) })
} catch {} } catch {}
if (response && response.body && response.body.accounts.length) { if (response && response.body && response.body.accounts.length) {

View File

@ -1,4 +1,9 @@
[ [
{
"feature": "account_return_suspended",
"version": 3.3,
"reference": "https://github.com/mastodon/mastodon/releases/tag/v3.3.0"
},
{ {
"feature": "edit_post", "feature": "edit_post",
"version": 3.5, "version": 3.5,
@ -9,11 +14,6 @@
"version": 3.5, "version": 3.5,
"reference": "https://github.com/mastodon/mastodon/releases/tag/v3.5.0" "reference": "https://github.com/mastodon/mastodon/releases/tag/v3.5.0"
}, },
{
"feature": "notification_type_status",
"version": 3.3,
"reference": "https://docs.joinmastodon.org/entities/notification/#required-attributes"
},
{ {
"feature": "notification_type_update", "feature": "notification_type_update",
"version": 3.5, "version": 3.5,

50
src/helpers/urlMatcher.ts Normal file
View File

@ -0,0 +1,50 @@
import { store } from '@root/store'
import { getInstanceUrl } from '@utils/slices/instancesSlice'
const matchStatus = (
url: string
): { id: string; style: 'default' | 'pretty'; sameInstance: boolean } | null => {
// https://social.xmflsct.com/web/statuses/105590085754428765 <- default
// https://social.xmflsct.com/@tooot/105590085754428765 <- pretty
const matcherStatus = new RegExp(/(https?:\/\/)?([^\/]+)\/(web\/statuses|@.+)\/([0-9]+)/)
const matched = url.match(matcherStatus)
if (matched) {
const hostname = matched[2]
const style = matched[3] === 'web/statuses' ? 'default' : 'pretty'
const id = matched[4]
const instanceUrl = getInstanceUrl(store.getState())
return { id, style, sameInstance: hostname === instanceUrl }
}
return null
}
const matchAccount = (
url: string
):
| { id: string; style: 'default'; sameInstance: boolean }
| { username: string; style: 'pretty'; sameInstance: boolean }
| null => {
// https://social.xmflsct.com/web/accounts/14195 <- default
// https://social.xmflsct.com/web/@tooot <- pretty ! cannot be searched on the same instance
// https://social.xmflsct.com/@tooot <- pretty
const matcherAccount = new RegExp(/(https?:\/\/)?([^\/]+)(\/web|\/web\/accounts)?\/([0-9]+|@.+)/)
const matched = url.match(matcherAccount)
if (matched) {
const hostname = matched[2]
const style = matched[4].startsWith('@') ? 'pretty' : 'default'
const account = matched[4]
const instanceUrl = getInstanceUrl(store.getState())
return style === 'default'
? { id: account, style, sameInstance: hostname === instanceUrl }
: { username: account, style, sameInstance: hostname === instanceUrl }
}
return null
}
export { matchStatus, matchAccount }

View File

@ -8,22 +8,22 @@
}, },
"block": { "block": {
"action_false": "Nutzer blockieren", "action_false": "Nutzer blockieren",
"action_true": "" "action_true": "User entblocken"
}, },
"reports": { "reports": {
"action": "Melden und blockieren" "action": "Melden und blockieren"
} }
}, },
"copy": { "copy": {
"action": "", "action": "Tröt kopieren",
"succeed": "Kopiert" "succeed": "Kopiert"
}, },
"instance": { "instance": {
"title": "", "title": "Instanz-Aktionen",
"block": { "block": {
"action": "Instanz {{instance}} blockieren", "action": "Instanz {{instance}} blockieren",
"alert": { "alert": {
"title": "", "title": "{{instance}} wirklich blockieren?",
"message": "Üblicherweise kannst du einen User stummschalten oder blockieren.\nBlockierst du hingegegen eine Instanz, wird deren gesamter Inhalt samt Usern, die dir von dieser Instanz folgen, entfernt!", "message": "Üblicherweise kannst du einen User stummschalten oder blockieren.\nBlockierst du hingegegen eine Instanz, wird deren gesamter Inhalt samt Usern, die dir von dieser Instanz folgen, entfernt!",
"buttons": { "buttons": {
"confirm": "Bestätigen" "confirm": "Bestätigen"
@ -40,7 +40,7 @@
} }
}, },
"status": { "status": {
"title": "", "title": "Tröt-Befehle",
"edit": { "edit": {
"action": "Tröt bearbeiten" "action": "Tröt bearbeiten"
}, },
@ -48,17 +48,17 @@
"action": "Tröt löschen", "action": "Tröt löschen",
"alert": { "alert": {
"title": "Löschen bestätigen?", "title": "Löschen bestätigen?",
"message": "", "message": "Alle Boosts, Sterne und Antworten werden entfernt.",
"buttons": { "buttons": {
"confirm": "Bestätigen" "confirm": "Bestätigen"
} }
} }
}, },
"deleteEdit": { "deleteEdit": {
"action": "", "action": "Tröt und Boost entfernen",
"alert": { "alert": {
"title": "", "title": "Löschen und Boost bestätigen?",
"message": "", "message": "Alle Boosts und Favoriten inklusive der Antworten werden gelöscht.",
"buttons": { "buttons": {
"confirm": "Bestätigen" "confirm": "Bestätigen"
} }
@ -66,11 +66,11 @@
}, },
"mute": { "mute": {
"action_false": "Diesen Tröt sowie die Antworten stummschalten", "action_false": "Diesen Tröt sowie die Antworten stummschalten",
"action_true": "" "action_true": "Tröt und Antworten nicht mehr stummschalten"
}, },
"pin": { "pin": {
"action_false": "", "action_false": "Tröt anheften",
"action_true": "" "action_true": "Tröt nicht mehr anheften"
} }
} }
} }

View File

@ -1 +1,3 @@
{} {
"frequentUsed": "Häufig genutzt"
}

View File

@ -14,7 +14,7 @@
"base": "Der Login erfolgt über den Browser, so dass Ihre Kontoinformationen für die Toot-App nicht sichtbar sind." "base": "Der Login erfolgt über den Browser, so dass Ihre Kontoinformationen für die Toot-App nicht sichtbar sind."
}, },
"terms": { "terms": {
"base": "" "base": "Mit dem Login stimmst du der <0>Datenschutzrichtlinie</0> und den <1>Nutzungsbedingungen</1> zu."
} }
}, },
"update": { "update": {

View File

@ -1,10 +1,10 @@
{ {
"title": "Datenquelle auswählen", "title": "Medienquelle wählen",
"message": "", "message": "EXIF-Metadaten werden nicht hochgeladen",
"options": { "options": {
"image": "", "image": "Fotos hochladen",
"image_max": "", "image_max": "Fotos hochladen (max {{max}})",
"video": "", "video": "Video hochladen",
"video_max": "" "video_max": "Video hochladen (max {{max}})"
} }
} }

View File

@ -1,8 +1,8 @@
{ {
"HTML": { "HTML": {
"accessibilityHint": "", "accessibilityHint": "Tippen, um Inhalt aus- oder einzuklappen",
"expanded": "{{hint}}{{moreLines}}", "expanded": "{{hint}}{{moreLines}}",
"moreLines": "", "moreLines": " ({{count}} weitere Zeilen)",
"defaultHint": "" "defaultHint": "Langer Tröt"
} }
} }

View File

@ -30,7 +30,7 @@
"default": "{{name}} hat geboostet", "default": "{{name}} hat geboostet",
"notification": "{{name}} hat deinen Tröt geboostet" "notification": "{{name}} hat deinen Tröt geboostet"
}, },
"update": "" "update": "Boost wurde bearbeitet"
}, },
"actions": { "actions": {
"reply": { "reply": {
@ -40,8 +40,8 @@
"accessibilityLabel": "Tröt boosten", "accessibilityLabel": "Tröt boosten",
"function": "Boost", "function": "Boost",
"options": { "options": {
"title": "", "title": "Boost-Sichtbarkeit ändern",
"public": "", "public": "Öffentlicher Boost",
"unlisted": "" "unlisted": ""
} }
}, },
@ -68,7 +68,7 @@
"history": { "history": {
"accessibilityLabel": "Dieser Tröt wurde {{count}} mal bearbeitet", "accessibilityLabel": "Dieser Tröt wurde {{count}} mal bearbeitet",
"accessibilityHint": "Für den vollständigen Verlauf auswählen", "accessibilityHint": "Für den vollständigen Verlauf auswählen",
"text_one": "{{count}} bearbeitet", "text_one": "{{count}} Bearbeitung",
"text_other": "{{count}} mal bearbeitet" "text_other": "{{count}} mal bearbeitet"
} }
}, },
@ -88,7 +88,7 @@
"content": { "content": {
"expandHint": "Ausgeblendeter Inhalt" "expandHint": "Ausgeblendeter Inhalt"
}, },
"filtered": "Ausgeblendet", "filtered": "",
"fullConversation": "Unterhaltung anzeigen", "fullConversation": "Unterhaltung anzeigen",
"translate": { "translate": {
"default": "Übersetzen", "default": "Übersetzen",

View File

@ -12,7 +12,7 @@
"description": "Bitte Benachrichtigungsdienst in den Einstellungen erneut aktivieren" "description": "Bitte Benachrichtigungsdienst in den Einstellungen erneut aktivieren"
}, },
"shareError": { "shareError": {
"imageNotSupported": "", "imageNotSupported": "Bildformat {{type}} wird nicht unterstützt",
"videoNotSupported": "" "videoNotSupported": "Videoformat {{type}} wird nicht unterstützt"
} }
} }

View File

@ -1,6 +1,6 @@
{ {
"heading": "", "heading": "Teilen mit...",
"content": { "content": {
"select_account": "" "select_account": "Konto auswählen"
} }
} }

View File

@ -1,7 +1,7 @@
{ {
"content": { "content": {
"altText": { "altText": {
"heading": "" "heading": "Alternativtext"
}, },
"notificationsFilter": { "notificationsFilter": {
"heading": "Benachrichtigungsart anzeigen", "heading": "Benachrichtigungsart anzeigen",
@ -13,7 +13,7 @@
"mention": "$t(screenTabs:me.push.mention.heading)", "mention": "$t(screenTabs:me.push.mention.heading)",
"poll": "$t(screenTabs:me.push.poll.heading)", "poll": "$t(screenTabs:me.push.poll.heading)",
"status": "", "status": "",
"update": "" "update": "Boost wurde bearbeitet"
} }
} }
} }

View File

@ -45,7 +45,7 @@
"placeholder": "Was geht in dir vor", "placeholder": "Was geht in dir vor",
"keyboardImage": { "keyboardImage": {
"exceedMaximum": { "exceedMaximum": {
"title": "", "title": "Maximale Anzahl von Anhängen erreicht",
"OK": "$t(common:buttons.OK)" "OK": "$t(common:buttons.OK)"
} }
} }
@ -82,7 +82,7 @@
}, },
"increase": { "increase": {
"accessibilityLabel": "Erhöhe Anzahl der Antwortmöglichkeiten auf {{amount}}", "accessibilityLabel": "Erhöhe Anzahl der Antwortmöglichkeiten auf {{amount}}",
"accessibilityHint": "" "accessibilityHint": "Maximale Anzahl der Auswahlmöglichkeiten erreicht, aktuell {{amount}}"
} }
}, },
"multiple": { "multiple": {
@ -114,42 +114,42 @@
"accessibilityHint": "Umfrage wird entfernt, wenn ein Anhang vorhanden ist", "accessibilityHint": "Umfrage wird entfernt, wenn ein Anhang vorhanden ist",
"failed": { "failed": {
"alert": { "alert": {
"title": "", "title": "Upload fehlgeschlagen",
"button": "Noch einmal versuchen" "button": "Noch einmal versuchen"
} }
} }
}, },
"poll": { "poll": {
"accessibilityLabel": "", "accessibilityLabel": "Umfrage hinzufügen",
"accessibilityHint": "" "accessibilityHint": "Anhang ist bei Umfragen nicht möglich"
}, },
"visibility": { "visibility": {
"accessibilityLabel": "", "accessibilityLabel": "Sichtbarkeit des Tröts ist {{visibility}}",
"title": "", "title": "Sichtbarkeit des Tröts",
"options": { "options": {
"public": "Öffentlich", "public": "Öffentlich",
"unlisted": "Ungelistet", "unlisted": "Ungelistet",
"private": "Nur für Folgende", "private": "Nur für Folgende",
"direct": "", "direct": "Direktnachricht",
"cancel": "$t(common:buttons.cancel)" "cancel": "$t(common:buttons.cancel)"
} }
}, },
"spoiler": { "spoiler": {
"accessibilityLabel": "" "accessibilityLabel": "Spoiler"
}, },
"emoji": { "emoji": {
"accessibilityLabel": "", "accessibilityLabel": "Emoji hinzufügen",
"accessibilityHint": "" "accessibilityHint": ""
} }
}, },
"drafts_one": "", "drafts_one": "Entwurf ({{count}})",
"drafts_other": "" "drafts_other": "Entwürfe ({{count}})"
}, },
"editAttachment": { "editAttachment": {
"header": { "header": {
"title": "Anhang bearbeiten", "title": "Anhang bearbeiten",
"right": { "right": {
"accessibilityLabel": "", "accessibilityLabel": "Anhang speichern",
"failed": { "failed": {
"title": "Bearbeitung fehlgeschlagen", "title": "Bearbeitung fehlgeschlagen",
"button": "Noch einmal versuchen" "button": "Noch einmal versuchen"
@ -168,12 +168,12 @@
"header": { "header": {
"title": "Entwurf" "title": "Entwurf"
}, },
"warning": "", "warning": "Entwürfe werden nur lokal gespeichert und können bei Abstürzen verloren gehen. Diese Funktion bitte nicht für dauerhafte Entwürfe nutzen.",
"content": { "content": {
"accessibilityHint": "Gespeicherter Entwurf, tippe, um diesen zu bearbeiten", "accessibilityHint": "Gespeicherter Entwurf, tippe, um diesen zu bearbeiten",
"textEmpty": "Kein Inhalt" "textEmpty": "Kein Inhalt"
}, },
"checkAttachment": "" "checkAttachment": "Prüfe Anhänge auf dem Server..."
} }
} }
} }

View File

@ -146,7 +146,7 @@
"label": "Kennzeichnung", "label": "Kennzeichnung",
"content": "Inhalt" "content": "Inhalt"
}, },
"mediaSelectionFailed": "" "mediaSelectionFailed": "Verarbeitung des Bildes fehlgeschlagen. Bitte erneut versuchen."
}, },
"push": { "push": {
"notAvailable": "Dein Gerät unterstützt keine Push-Benachrichtigung", "notAvailable": "Dein Gerät unterstützt keine Push-Benachrichtigung",
@ -169,7 +169,7 @@
"heading": "Neue Follower" "heading": "Neue Follower"
}, },
"follow_request": { "follow_request": {
"heading": "" "heading": "Followeranfrage"
}, },
"favourite": { "favourite": {
"heading": "Favoriten" "heading": "Favoriten"
@ -260,8 +260,8 @@
} }
}, },
"staticEmoji": { "staticEmoji": {
"heading": "", "heading": "System-Emojis verwenden",
"description": "" "description": "Wenn du beim Betrachten der Emoji-Liste häufige App-Abstürze feststellst, kannst du stattdessen versuchen, statische Emoji zu verwenden."
}, },
"feedback": { "feedback": {
"heading": "Neue Funktion vorschlagen" "heading": "Neue Funktion vorschlagen"
@ -280,7 +280,7 @@
"description": "Es werden ausschließlich Daten gesammelt, welche nicht nutzerbezogen sind" "description": "Es werden ausschließlich Daten gesammelt, welche nicht nutzerbezogen sind"
}, },
"version": "Version v{{version}}", "version": "Version v{{version}}",
"instanceVersion": "" "instanceVersion": "Mastodon Version {{version}}"
}, },
"switch": { "switch": {
"existing": "Wähle ein Konto aus", "existing": "Wähle ein Konto aus",
@ -293,7 +293,7 @@
"accessibilityLabel": "Aktionen für Benutzer {{user}}", "accessibilityLabel": "Aktionen für Benutzer {{user}}",
"accessibilityHint": "Du kannst diesen Benutzer stummschalten, blockieren, melden oder teilen" "accessibilityHint": "Du kannst diesen Benutzer stummschalten, blockieren, melden oder teilen"
}, },
"followed_by": "", "followed_by": " folgt dir",
"moved": "Benutzer umgezogen", "moved": "Benutzer umgezogen",
"created_at": "Registriert am: {{date}}", "created_at": "Registriert am: {{date}}",
"summary": { "summary": {
@ -304,7 +304,8 @@
"toots": { "toots": {
"default": "Tröts", "default": "Tröts",
"all": "Tröts und DruTröts" "all": "Tröts und DruTröts"
} },
"suspended": "Konto wurde von den Instanzmoderation gesperrt"
}, },
"attachments": { "attachments": {
"name": "<0 /><1>\"s Medien</1>" "name": "<0 /><1>\"s Medien</1>"
@ -347,7 +348,7 @@
} }
}, },
"history": { "history": {
"name": "" "name": "Bearbeitungsverlauf"
} }
} }
} }

View File

@ -88,7 +88,7 @@
"content": { "content": {
"expandHint": "Hidden content" "expandHint": "Hidden content"
}, },
"filtered": "Filtered", "filtered": "Filtered: {{phrase}}.",
"fullConversation": "Read conversations", "fullConversation": "Read conversations",
"translate": { "translate": {
"default": "Translate", "default": "Translate",

View File

@ -304,7 +304,8 @@
"toots": { "toots": {
"default": "Toots", "default": "Toots",
"all": "Toots and replies" "all": "Toots and replies"
} },
"suspended": "Account suspended by the moderators of your server"
}, },
"attachments": { "attachments": {
"name": "<0 /><1>\"s media</1>" "name": "<0 /><1>\"s media</1>"

22
src/i18n/es/common.json Normal file
View File

@ -0,0 +1,22 @@
{
"buttons": {
"OK": "",
"apply": "",
"cancel": ""
},
"customEmoji": {
"accessibilityLabel": ""
},
"message": {
"success": {
"message": ""
},
"warning": {
"message": ""
},
"error": {
"message": ""
}
},
"separator": ""
}

View File

@ -0,0 +1,76 @@
{
"accessibilityHint": "",
"account": {
"title": "",
"mute": {
"action_false": "",
"action_true": ""
},
"block": {
"action_false": "",
"action_true": ""
},
"reports": {
"action": ""
}
},
"copy": {
"action": "",
"succeed": ""
},
"instance": {
"title": "",
"block": {
"action": "",
"alert": {
"title": "",
"message": "",
"buttons": {
"confirm": ""
}
}
}
},
"share": {
"status": {
"action": ""
},
"account": {
"action": ""
}
},
"status": {
"title": "",
"edit": {
"action": ""
},
"delete": {
"action": "",
"alert": {
"title": "",
"message": "",
"buttons": {
"confirm": ""
}
}
},
"deleteEdit": {
"action": "",
"alert": {
"title": "",
"message": "",
"buttons": {
"confirm": ""
}
}
},
"mute": {
"action_false": "",
"action_true": ""
},
"pin": {
"action_false": "",
"action_true": ""
}
}
}

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1,30 @@
{
"server": {
"textInput": {
"placeholder": ""
},
"button": "",
"information": {
"name": "",
"accounts": "",
"statuses": "",
"domains": ""
},
"disclaimer": {
"base": ""
},
"terms": {
"base": ""
}
},
"update": {
"alert": {
"title": "",
"message": "",
"buttons": {
"cancel": "",
"continue": ""
}
}
}
}

View File

@ -0,0 +1,10 @@
{
"title": "",
"message": "",
"options": {
"image": "",
"image_max": "",
"video": "",
"video_max": ""
}
}

View File

@ -0,0 +1,8 @@
{
"HTML": {
"accessibilityHint": "",
"expanded": "",
"moreLines": "",
"defaultHint": ""
}
}

View File

@ -0,0 +1,16 @@
{
"follow": {
"function": ""
},
"block": {
"function": ""
},
"button": {
"error": "",
"blocked_by": "",
"blocking": "",
"following": "",
"requested": "",
"default": ""
}
}

View File

@ -0,0 +1,152 @@
{
"empty": {
"error": {
"message": "",
"button": ""
},
"success": {
"message": ""
}
},
"end": {
"message": ""
},
"lookback": {
"message": ""
},
"refresh": {
"fetchPreviousPage": "",
"refetch": ""
},
"shared": {
"actioned": {
"pinned": "",
"favourite": "",
"status": "",
"follow": "",
"follow_request": "",
"poll": "",
"reblog": {
"default": "",
"notification": ""
},
"update": ""
},
"actions": {
"reply": {
"accessibilityLabel": ""
},
"reblogged": {
"accessibilityLabel": "",
"function": "",
"options": {
"title": "",
"public": "",
"unlisted": ""
}
},
"favourited": {
"accessibilityLabel": "",
"function": ""
},
"bookmarked": {
"accessibilityLabel": "",
"function": ""
}
},
"actionsUsers": {
"reblogged_by": {
"accessibilityLabel": "",
"accessibilityHint": "",
"text": ""
},
"favourited_by": {
"accessibilityLabel": "",
"accessibilityHint": "",
"text": ""
},
"history": {
"accessibilityLabel": "",
"accessibilityHint": "",
"text_one": "",
"text_other": ""
}
},
"attachment": {
"sensitive": {
"button": ""
},
"unsupported": {
"text": "",
"button": ""
}
},
"avatar": {
"accessibilityLabel": "",
"accessibilityHint": ""
},
"content": {
"expandHint": ""
},
"filtered": "",
"fullConversation": "",
"translate": {
"default": "",
"succeed": "",
"failed": "",
"source_not_supported": "",
"target_not_supported": ""
},
"header": {
"shared": {
"account": {
"name": {
"accessibilityHint": ""
},
"account": {
"accessibilityHint": ""
}
},
"application": "",
"edited": {
"accessibilityLabel": ""
},
"muted": {
"accessibilityLabel": ""
},
"visibility": {
"direct": {
"accessibilityLabel": ""
},
"private": {
"accessibilityLabel": ""
}
}
},
"conversation": {
"withAccounts": "",
"delete": {
"function": ""
}
}
},
"poll": {
"meta": {
"button": {
"vote": "",
"refresh": ""
},
"count": {
"voters_one": "",
"voters_other": "",
"votes_one": "",
"votes_other": ""
},
"expiration": {
"expired": "",
"until": ""
}
}
}
}
}

18
src/i18n/es/screens.json Normal file
View File

@ -0,0 +1,18 @@
{
"screenshot": {
"title": "",
"message": "",
"button": ""
},
"localCorrupt": {
"message": ""
},
"pushError": {
"message": "",
"description": ""
},
"shareError": {
"imageNotSupported": "",
"videoNotSupported": ""
}
}

View File

@ -0,0 +1,6 @@
{
"heading": "",
"content": {
"select_account": ""
}
}

View File

@ -0,0 +1,20 @@
{
"content": {
"altText": {
"heading": ""
},
"notificationsFilter": {
"heading": "",
"content": {
"follow": "",
"follow_request": "",
"favourite": "",
"reblog": "",
"mention": "",
"poll": "",
"status": "",
"update": ""
}
}
}
}

View File

@ -0,0 +1,10 @@
{
"heading": "",
"content": {
"published": "",
"button": {
"read": "",
"unread": ""
}
}
}

View File

@ -0,0 +1,179 @@
{
"heading": {
"left": {
"button": "",
"alert": {
"title": "",
"buttons": {
"save": "",
"delete": "",
"cancel": ""
}
}
},
"right": {
"button": {
"default": "",
"conversation": "",
"reply": "",
"deleteEdit": "",
"edit": "",
"share": ""
},
"alert": {
"default": {
"title": "",
"button": ""
},
"removeReply": {
"title": "",
"description": "",
"cancel": "",
"confirm": ""
}
}
}
},
"content": {
"root": {
"header": {
"postingAs": "",
"spoilerInput": {
"placeholder": ""
},
"textInput": {
"placeholder": "",
"keyboardImage": {
"exceedMaximum": {
"title": "",
"OK": ""
}
}
}
},
"footer": {
"attachments": {
"sensitive": "",
"remove": {
"accessibilityLabel": ""
},
"edit": {
"accessibilityLabel": ""
},
"upload": {
"accessibilityLabel": ""
}
},
"emojis": {
"accessibilityHint": ""
},
"poll": {
"option": {
"placeholder": {
"accessibilityLabel": "",
"single": "",
"multiple": ""
}
},
"quantity": {
"reduce": {
"accessibilityLabel": "",
"accessibilityHint": ""
},
"increase": {
"accessibilityLabel": "",
"accessibilityHint": ""
}
},
"multiple": {
"heading": "",
"options": {
"single": "",
"multiple": "",
"cancel": ""
}
},
"expiration": {
"heading": "",
"options": {
"300": "",
"1800": "",
"3600": "",
"21600": "",
"86400": "",
"259200": "",
"604800": "",
"cancel": ""
}
}
}
},
"actions": {
"attachment": {
"accessibilityLabel": "",
"accessibilityHint": "",
"failed": {
"alert": {
"title": "",
"button": ""
}
}
},
"poll": {
"accessibilityLabel": "",
"accessibilityHint": ""
},
"visibility": {
"accessibilityLabel": "",
"title": "",
"options": {
"public": "",
"unlisted": "",
"private": "",
"direct": "",
"cancel": ""
}
},
"spoiler": {
"accessibilityLabel": ""
},
"emoji": {
"accessibilityLabel": "",
"accessibilityHint": ""
}
},
"drafts_one": "",
"drafts_other": ""
},
"editAttachment": {
"header": {
"title": "",
"right": {
"accessibilityLabel": "",
"failed": {
"title": "",
"button": ""
}
}
},
"content": {
"altText": {
"heading": "",
"placeholder": ""
},
"imageFocus": ""
}
},
"draftsList": {
"header": {
"title": ""
},
"warning": "",
"content": {
"accessibilityHint": "",
"textEmpty": ""
},
"checkAttachment": ""
}
}
}

View File

@ -0,0 +1,17 @@
{
"content": {
"actions": {
"accessibilityLabel": "",
"accessibilityHint": ""
},
"options": {
"save": "",
"share": "",
"cancel": ""
},
"save": {
"succeed": "",
"failed": ""
}
}
}

View File

@ -0,0 +1,354 @@
{
"tabs": {
"local": {
"name": ""
},
"public": {
"name": "",
"segments": {
"left": "",
"right": ""
}
},
"notifications": {
"name": ""
},
"me": {
"name": ""
}
},
"common": {
"search": {
"accessibilityLabel": "",
"accessibilityHint": ""
}
},
"notifications": {
"filter": {
"accessibilityLabel": "",
"accessibilityHint": ""
}
},
"me": {
"stacks": {
"bookmarks": {
"name": ""
},
"conversations": {
"name": ""
},
"favourites": {
"name": ""
},
"fontSize": {
"name": ""
},
"language": {
"name": ""
},
"lists": {
"name": ""
},
"list": {
"name": ""
},
"push": {
"name": ""
},
"profile": {
"name": ""
},
"profileName": {
"name": ""
},
"profileNote": {
"name": ""
},
"profileFields": {
"name": ""
},
"settings": {
"name": ""
},
"webSettings": {
"name": ""
},
"switch": {
"name": ""
}
},
"fontSize": {
"demo": "",
"sizes": {
"S": "",
"M": "",
"L": "",
"XL": "",
"XXL": ""
}
},
"profile": {
"cancellation": {
"title": "",
"message": "",
"buttons": {
"cancel": "",
"discard": ""
}
},
"feedback": {
"succeed": "",
"failed": ""
},
"root": {
"name": {
"title": ""
},
"avatar": {
"title": "",
"description": ""
},
"header": {
"title": "",
"description": ""
},
"note": {
"title": ""
},
"fields": {
"title": "",
"total_one": "",
"total_other": ""
},
"visibility": {
"title": "",
"options": {
"public": "",
"unlisted": "",
"private": "",
"cancel": ""
}
},
"sensitive": {
"title": ""
},
"lock": {
"title": "",
"description": ""
},
"bot": {
"title": "",
"description": ""
}
},
"fields": {
"group": "",
"label": "",
"content": ""
},
"mediaSelectionFailed": ""
},
"push": {
"notAvailable": "",
"enable": {
"direct": "",
"settings": ""
},
"global": {
"heading": "",
"description": ""
},
"decode": {
"heading": "",
"description": ""
},
"default": {
"heading": ""
},
"follow": {
"heading": ""
},
"follow_request": {
"heading": ""
},
"favourite": {
"heading": ""
},
"reblog": {
"heading": ""
},
"mention": {
"heading": ""
},
"poll": {
"heading": ""
},
"status": {
"heading": ""
},
"howitworks": ""
},
"root": {
"announcements": {
"content": {
"unread": "",
"read": "",
"empty": ""
}
},
"push": {
"content": {
"enabled": "",
"disabled": ""
}
},
"update": {
"title": ""
},
"logout": {
"button": "",
"alert": {
"title": "",
"message": "",
"buttons": {
"logout": "",
"cancel": ""
}
}
}
},
"settings": {
"fontsize": {
"heading": "",
"content": {
"S": "",
"M": "",
"L": "",
"XL": "",
"XXL": ""
}
},
"language": {
"heading": "",
"options": {
"cancel": ""
}
},
"theme": {
"heading": "",
"options": {
"auto": "",
"light": "",
"dark": "",
"cancel": ""
}
},
"darkTheme": {
"heading": "",
"options": {
"lighter": "",
"darker": "",
"cancel": ""
}
},
"browser": {
"heading": "",
"options": {
"internal": "",
"external": "",
"cancel": ""
}
},
"staticEmoji": {
"heading": "",
"description": ""
},
"feedback": {
"heading": ""
},
"support": {
"heading": ""
},
"review": {
"heading": ""
},
"contact": {
"heading": ""
},
"analytics": {
"heading": "",
"description": ""
},
"version": "",
"instanceVersion": ""
},
"switch": {
"existing": "",
"new": ""
}
},
"shared": {
"account": {
"actions": {
"accessibilityLabel": "",
"accessibilityHint": ""
},
"followed_by": "",
"moved": "",
"created_at": "",
"summary": {
"statuses_count": "",
"following_count": "",
"followers_count": ""
},
"toots": {
"default": "",
"all": ""
},
"suspended": ""
},
"attachments": {
"name": ""
},
"search": {
"header": {
"prefix": "",
"placeholder": ""
},
"empty": {
"general": "",
"advanced": {
"header": "",
"example": {
"account": "",
"hashtag": "",
"statusLink": "",
"accountLink": ""
}
}
},
"sections": {
"accounts": "",
"hashtags": "",
"statuses": ""
},
"notFound": ""
},
"toot": {
"name": ""
},
"users": {
"accounts": {
"following": "",
"followers": ""
},
"statuses": {
"reblogged_by": "",
"favourited_by": ""
}
},
"history": {
"name": ""
}
}
}

22
src/i18n/fr/common.json Normal file
View File

@ -0,0 +1,22 @@
{
"buttons": {
"OK": "Ok",
"apply": "Confirmer",
"cancel": "Annuler"
},
"customEmoji": {
"accessibilityLabel": "Émoji personnalisé {{emoji}}"
},
"message": {
"success": {
"message": "{{function}} succès"
},
"warning": {
"message": ""
},
"error": {
"message": "Échec de la connexion, veuillez réessayer"
}
},
"separator": ", "
}

View File

@ -0,0 +1,76 @@
{
"accessibilityHint": "Actions pour ce Pouet, telles que son utilisateur affiché, le Pouet lui-même",
"account": {
"title": "Actions de l'utilisateur",
"mute": {
"action_false": "Rendre muet l'utilisateur",
"action_true": "Rendre la parole"
},
"block": {
"action_false": "Bloquer l'utilisateur",
"action_true": "Débloquer l'utilisateur"
},
"reports": {
"action": "Signaler et bloquer"
}
},
"copy": {
"action": "Copier le Pouet",
"succeed": "Copié"
},
"instance": {
"title": "Action de l'instance",
"block": {
"action": "Bloquer l'instance {{instance}}",
"alert": {
"title": "Confirmer le blocage de l'instance {{instance}}?",
"message": "Vous pouvez masquer ou bloquer certains utilisateurs.\n\nAprès avoir bloqué l'instance, tout son contenu, y compris les followers de cette instance, sera supprimé !",
"buttons": {
"confirm": "Confirmer"
}
}
}
},
"share": {
"status": {
"action": "Partager le pouet"
},
"account": {
"action": "Partage l'utilisateur"
}
},
"status": {
"title": "Actions du pouet",
"edit": {
"action": "Editer le pouet"
},
"delete": {
"action": "Supprimer le pouet",
"alert": {
"title": "Confirmer la suppression ?",
"message": "Tous les boosts et favoris seront effacés, y compris toutes les réponses.",
"buttons": {
"confirm": "Confirmer"
}
}
},
"deleteEdit": {
"action": "Supprimer le pouet et le republié",
"alert": {
"title": "Confirmer la suppression et le repost ?",
"message": "Tous les boosts et favoris seront effacés, y compris toutes les réponses.",
"buttons": {
"confirm": "Confirmer"
}
}
},
"mute": {
"action_false": "Couper le pouet et les réponses",
"action_true": "Couper le pouet et les réponses"
},
"pin": {
"action_false": "Pouet épinglé",
"action_true": "Détacher le pouet"
}
}
}

View File

@ -0,0 +1,3 @@
{
"frequentUsed": "Fréquemment utilisés"
}

View File

@ -0,0 +1,30 @@
{
"server": {
"textInput": {
"placeholder": "Domaine d'instance"
},
"button": "Connexion",
"information": {
"name": "Nom",
"accounts": "Utilisateurs",
"statuses": "Pouets",
"domains": "Univers"
},
"disclaimer": {
"base": "Le processus de connexion utilise le navigateur du système. Les informations de votre compte ne seront pas visibles par l'application tooot."
},
"terms": {
"base": "En vous connectant, vous acceptez la <0>politique de confidentialité</0> et les <1>conditions de service</1>."
}
},
"update": {
"alert": {
"title": "Connecté à cette instance",
"message": "Vous pouvez vous connecter à un autre compte, en maintenant un compte connecté existant",
"buttons": {
"cancel": "$t(common:buttons.cancel)",
"continue": "Continuer"
}
}
}
}

View File

@ -0,0 +1,10 @@
{
"title": "Sélectionnez la source du média",
"message": "Les données Media EXIF ne sont pas téléchargées",
"options": {
"image": "Télécharger des photos",
"image_max": "Télécharger des photos (max {{max}})",
"video": "Télécharger une vidéo",
"video_max": "Télécharger une vidéo (max {{max}})"
}
}

View File

@ -0,0 +1,8 @@
{
"HTML": {
"accessibilityHint": "Appuyez pour agrandir ou réduire le contenu",
"expanded": "{{hint}}{{moreLines}}",
"moreLines": " ({{count}} lignes en plus)",
"defaultHint": "Pouet long"
}
}

View File

@ -0,0 +1,16 @@
{
"follow": {
"function": "Suivre l'utilisateur"
},
"block": {
"function": "Bloquer l'utilisateur"
},
"button": {
"error": "Erreur de chargement",
"blocked_by": "Bloqué par l'utilisateur",
"blocking": "Débloquer",
"following": "Ne plus suivre",
"requested": "Retirer la demande",
"default": "Suivre"
}
}

View File

@ -0,0 +1,152 @@
{
"empty": {
"error": {
"message": "Erreur de chargement",
"button": "Réessayer"
},
"success": {
"message": "La chronologie est vide"
}
},
"end": {
"message": "Fin, qu'en est-il d'une tasse de <0 />"
},
"lookback": {
"message": "Dernière lecture à"
},
"refresh": {
"fetchPreviousPage": "Plus récent à partir d'ici",
"refetch": "À la dernière"
},
"shared": {
"actioned": {
"pinned": "Épinglé",
"favourite": "{{name}} a mis votre pouet en favoris",
"status": "{{name}} vient d'être posté",
"follow": "{{name}} vous suit",
"follow_request": "{{name}} a demandé à vous suivre",
"poll": "Un sondage auquel vous avez participé est maintenant terminé",
"reblog": {
"default": "{{name}} a partagé",
"notification": "{{name}} a partagé votre message"
},
"update": "Le reblog a été modifié"
},
"actions": {
"reply": {
"accessibilityLabel": "Répondre à ce pouet"
},
"reblogged": {
"accessibilityLabel": "Partager ce pouet",
"function": "Pouet de Boost",
"options": {
"title": "Choisir la visibilité du boost",
"public": "Boost public",
"unlisted": "Retirer le boost"
}
},
"favourited": {
"accessibilityLabel": "Ajouter ce pouet aux favoris",
"function": "Mettre le pouet en favori"
},
"bookmarked": {
"accessibilityLabel": "Ajouter ce pouet aux signets",
"function": "Pouet de signet"
}
},
"actionsUsers": {
"reblogged_by": {
"accessibilityLabel": "{{count}} utilisateurs ont boosté ce pouet",
"accessibilityHint": "Touchez pour connaître les utilisateurs",
"text": "$t(screenTabs:shared.users.statuses.reblogged_by)"
},
"favourited_by": {
"accessibilityLabel": "{{count}} utilisateurs ont boosté ce pouet",
"accessibilityHint": "Touchez pour connaître les utilisateurs",
"text": "$t(screenTabs:shared.users.statuses.favourited_by)"
},
"history": {
"accessibilityLabel": "Ce pouet a été modifié {{count}} fois",
"accessibilityHint": "Appuyer pour afficher l'historique d'édition complet",
"text_one": "{{count}} modification",
"text_other": "{{count}} modifications"
}
},
"attachment": {
"sensitive": {
"button": "Afficher les médias sensibles"
},
"unsupported": {
"text": "Erreur de chargement",
"button": "Essayer le lien distant"
}
},
"avatar": {
"accessibilityLabel": "Avatar de {{name}}",
"accessibilityHint": "Appuyez pour accéder à la page de {{name}}"
},
"content": {
"expandHint": "Contenu masqué"
},
"filtered": "Filtré: {{phrase}}.",
"fullConversation": "Conversations lues",
"translate": {
"default": "Traduire",
"succeed": "Traduit par {{provider}} de {{source}}",
"failed": "La traduction a échoué",
"source_not_supported": "cette langue n'est pas prise en charge",
"target_not_supported": "Cette langue n'est pas prise en charge"
},
"header": {
"shared": {
"account": {
"name": {
"accessibilityHint": "Nom de l'utilisateur"
},
"account": {
"accessibilityHint": "Compte de l'utilisateur"
}
},
"application": "Poussée avec {{application}}",
"edited": {
"accessibilityLabel": "Pouet édité"
},
"muted": {
"accessibilityLabel": "Pouet rendu muet"
},
"visibility": {
"direct": {
"accessibilityLabel": "Envoyer un message direct"
},
"private": {
"accessibilityLabel": "Visible uniquement pour les abonné·e·s"
}
}
},
"conversation": {
"withAccounts": "Avec",
"delete": {
"function": "Supprimer le message direct"
}
}
},
"poll": {
"meta": {
"button": {
"vote": "Voter",
"refresh": "Actualiser"
},
"count": {
"voters_one": "{{count}} utilisateur a voté",
"voters_other": "{{count}} utilisateurs ont voté",
"votes_one": "{{count}} votes",
"votes_other": "{{count}} votes"
},
"expiration": {
"expired": "Le vote a expiré",
"until": "Expire <0 />"
}
}
}
}
}

18
src/i18n/fr/screens.json Normal file
View File

@ -0,0 +1,18 @@
{
"screenshot": {
"title": "Protection de la confidentialité",
"message": "Veuillez ne pas divulguer l'identité d'un autre utilisateur, tel que le nom d'utilisateur, l'avatar, etc. Merci!",
"button": "Confirmer"
},
"localCorrupt": {
"message": "Session expirée, veuillez ré-essayer"
},
"pushError": {
"message": "Erreur des services push",
"description": "Veuillez réactiver la notification push dans les paramètres"
},
"shareError": {
"imageNotSupported": "Type d'image {{type}} non pris en charge",
"videoNotSupported": "Type de vidéo {{type}} non supporté"
}
}

View File

@ -0,0 +1,6 @@
{
"heading": "Partager avec...",
"content": {
"select_account": "Sélectionnez un compte"
}
}

View File

@ -0,0 +1,20 @@
{
"content": {
"altText": {
"heading": "Texte de remplacement"
},
"notificationsFilter": {
"heading": "Afficher les notifications",
"content": {
"follow": "$t(screenTabs:me.push.follow.heading)",
"follow_request": "Demande d'abonnement",
"favourite": "$t(screenTabs:me.push.favourite.heading)",
"reblog": "$t(screenTabs:me.push.reblog.heading)",
"mention": "$t(screenTabs:me.push.mention.heading)",
"poll": "$t(screenTabs:me.push.poll.heading)",
"status": "Pouet des utilisateurs abonnés",
"update": "Le reblog a été modifié"
}
}
}
}

View File

@ -0,0 +1,10 @@
{
"heading": "Annonces",
"content": {
"published": "Publié <0 />",
"button": {
"read": "Lire",
"unread": "Marqué comme lu"
}
}
}

View File

@ -0,0 +1,179 @@
{
"heading": {
"left": {
"button": "Abandonner",
"alert": {
"title": "Annuler lédition?",
"buttons": {
"save": "Enregistrer comme brouillon",
"delete": "Supprimer le brouillon",
"cancel": "Abandonner"
}
}
},
"right": {
"button": {
"default": "Pouet",
"conversation": "Pouet DM",
"reply": "Réponse de pouet",
"deleteEdit": "Pouet",
"edit": "Pouet",
"share": "Pouet"
},
"alert": {
"default": {
"title": "Échec du pouet",
"button": "Réessayer"
},
"removeReply": {
"title": "Le pouet répondu est introuvable",
"description": "Le pouet répondu a peut-être été supprimé. Voulez-vous le supprimer de votre référence ?",
"cancel": "$t(common:buttons.cancel)",
"confirm": "Supprimer la référence"
}
}
}
},
"content": {
"root": {
"header": {
"postingAs": "Pouet en tant que @{{acct}}@{{domain}}",
"spoilerInput": {
"placeholder": "Voir tous les messages d'avertissement"
},
"textInput": {
"placeholder": "Quavez-vous en tête",
"keyboardImage": {
"exceedMaximum": {
"title": "Nombre maximum de pièces jointes atteint",
"OK": "$t(common:buttons.OK)"
}
}
}
},
"footer": {
"attachments": {
"sensitive": "Marquer les pièces jointes comme étant sensibles",
"remove": {
"accessibilityLabel": "Retirer la pièce jointe téléchargée, numéro {{attachment}}"
},
"edit": {
"accessibilityLabel": "Editer la pièce jointe téléchargée, numéro {{attachment}}"
},
"upload": {
"accessibilityLabel": "Télécharger plus de pièces jointes"
}
},
"emojis": {
"accessibilityHint": "Tapotez pour ajouter des émojis au pouet"
},
"poll": {
"option": {
"placeholder": {
"accessibilityLabel": "Option du sondage {{index}}",
"single": "Choix unique",
"multiple": "Choix multiple"
}
},
"quantity": {
"reduce": {
"accessibilityLabel": "Réduire les options du sondage à {{amount}}",
"accessibilityHint": "Quantité minimale d'options de sondage atteinte, actuellement {{amount}}"
},
"increase": {
"accessibilityLabel": "Augmentez les options du sondage à {{amount}}",
"accessibilityHint": "Quantité maximum d'options de sondage atteinte, actuellement {{amount}}"
}
},
"multiple": {
"heading": "Type de choix",
"options": {
"single": "Choix unique",
"multiple": "Choix multiple",
"cancel": "$t(common:buttons.cancel)"
}
},
"expiration": {
"heading": "Validité",
"options": {
"300": "5 minutes",
"1800": "30 minutes",
"3600": "1 heure",
"21600": "6 heures",
"86400": "1 jour",
"259200": "3 jours",
"604800": "7 jours",
"cancel": "$t(common:buttons.cancel)"
}
}
}
},
"actions": {
"attachment": {
"accessibilityLabel": "Téléchargez une pièce-jointe",
"accessibilityHint": "La fonction de sondage sera désactivée lorsqu'il y a une pièce jointe",
"failed": {
"alert": {
"title": "Le téléchargement a échoué",
"button": "Réessayer"
}
}
},
"poll": {
"accessibilityLabel": "Ajouter un sondage",
"accessibilityHint": "La fonction d'attachement sera désactivée lorsque le sondage est actif"
},
"visibility": {
"accessibilityLabel": "La visibilité de pouet est {{visibility}}",
"title": "Visibilité de pouet",
"options": {
"public": "Public",
"unlisted": "Non listé",
"private": "Abonné·e·s uniquement",
"direct": "Message direct",
"cancel": "$t(common:buttons.cancel)"
}
},
"spoiler": {
"accessibilityLabel": "Divulgâchage"
},
"emoji": {
"accessibilityLabel": "Ajouter un émoji",
"accessibilityHint": "Ouvrir le panneau de sélection des émojis, glisser horizontalement pour changer de page"
}
},
"drafts_one": "Brouillon ({{count}})",
"drafts_other": "Brouillons ({{count}})"
},
"editAttachment": {
"header": {
"title": "Modifier la pièce jointe",
"right": {
"accessibilityLabel": "Enregistrement de la pièce jointe",
"failed": {
"title": "Impossible d'éditer",
"button": "Réessayer"
}
}
},
"content": {
"altText": {
"heading": "Décrire cette photo pour les personnes malvoyantes",
"placeholder": "Vous pouvez ajouter une description, parfois appelée alt-text, à vos médias afin qu'ils soient accessibles à un plus grand nombre de personnes, y compris celles qui sont aveugles ou malvoyantes.\n\nLes bonnes descriptions sont concises, ou présentent ce qui est dans vos médias avec suffisamment de précision pour comprendre leur contexte."
},
"imageFocus": "Faites glisser le cercle de focus pour mettre à jour le point de focus"
}
},
"draftsList": {
"header": {
"title": "Brouillon"
},
"warning": "Les brouillons ne sont stockés que localement, et peuvent être perdus dans des événements malheureux. Veuillez ne pas utiliser de brouillons pour un stockage à long terme.",
"content": {
"accessibilityHint": "Brouillon enregistré, appuyez pour modifier ce brouillon",
"textEmpty": "Le contenu est vide"
},
"checkAttachment": "Vérification des pièces jointes sur le serveur..."
}
}
}

View File

@ -0,0 +1,17 @@
{
"content": {
"actions": {
"accessibilityLabel": "Plus d'actions pour cette image",
"accessibilityHint": "Vous pouvez enregistrer ou partager cette image"
},
"options": {
"save": "Enregistrer l'image",
"share": "Partager l'image",
"cancel": "$t(common:buttons.cancel)"
},
"save": {
"succeed": "Image enregistrée",
"failed": "L'enregistrement de l'image a échoué"
}
}
}

View File

@ -0,0 +1,354 @@
{
"tabs": {
"local": {
"name": "Suit"
},
"public": {
"name": "",
"segments": {
"left": "Fédéré",
"right": "Local"
}
},
"notifications": {
"name": "Notifications"
},
"me": {
"name": "À propos de moi"
}
},
"common": {
"search": {
"accessibilityLabel": "Rechercher",
"accessibilityHint": "Rechercher des hashtags, des utilisateurs ou des pouets"
}
},
"notifications": {
"filter": {
"accessibilityLabel": "Filtrer",
"accessibilityHint": "Filtrer les types de notifications affichés"
}
},
"me": {
"stacks": {
"bookmarks": {
"name": "Signets"
},
"conversations": {
"name": "Messages directs"
},
"favourites": {
"name": "Favoris"
},
"fontSize": {
"name": "Taille de la police de Pouet"
},
"language": {
"name": "Langue"
},
"lists": {
"name": "Listes"
},
"list": {
"name": "Liste : {{list}}"
},
"push": {
"name": "Push de Notification"
},
"profile": {
"name": "Modifier le profil"
},
"profileName": {
"name": "Editer le nom d'affichage"
},
"profileNote": {
"name": "Éditer la description"
},
"profileFields": {
"name": "Éditer les métadonnées"
},
"settings": {
"name": "Paramètres de l'application"
},
"webSettings": {
"name": "Plus de paramètres de compte"
},
"switch": {
"name": "Passer sur un autre compte"
}
},
"fontSize": {
"demo": "<p>Ceci est un pouet de démo😊. Vous pouvez choisir parmi plusieurs options ci-dessous.<br /><br />Ce paramètre n'affecte que le contenu principal des pouets, mais pas les autres tailles de police.</p>",
"sizes": {
"S": "S",
"M": "M - Par Défaut",
"L": "L",
"XL": "XL",
"XXL": "XXL"
}
},
"profile": {
"cancellation": {
"title": "Modifications non sauvegardées",
"message": "Votre modification n'a pas été enregistrée. Voulez-vous annuler l'enregistrement des modifications ?",
"buttons": {
"cancel": "$t(common:buttons.cancel)",
"discard": "Ne pas tenir compte"
}
},
"feedback": {
"succeed": "{{type}} mis à jour",
"failed": "{{type}} Échec de la mise à jour, veuillez ré-essayer"
},
"root": {
"name": {
"title": "Nom Affiché"
},
"avatar": {
"title": "Avatar",
"description": "Sera réduit à 400x400px"
},
"header": {
"title": "Bandeau",
"description": "Sera réduit à 1500x500px"
},
"note": {
"title": "Description"
},
"fields": {
"title": "Metadonnés",
"total_one": "Champ {{count}}",
"total_other": "Champ {{count}}"
},
"visibility": {
"title": "Visibilité de la publication",
"options": {
"public": "Public",
"unlisted": "Non listé",
"private": "Abonné·e·s uniquement",
"cancel": "$t(common:buttons.cancel)"
}
},
"sensitive": {
"title": "Publication de médias sensibles"
},
"lock": {
"title": "Verrouiller le compte",
"description": "Nécessite que vous approuviez manuellement chaque abonné·e"
},
"bot": {
"title": "Compte Bot",
"description": "Ce compte effectue principalement des actions automatisées et peut ne pas être surveillé"
}
},
"fields": {
"group": "Groupe {{index}}",
"label": "Étiquette",
"content": "Contenu"
},
"mediaSelectionFailed": "Le traitement de l'image a échoué. Veuillez réessayer."
},
"push": {
"notAvailable": "Votre téléphone ne prend pas en charge la notification push de tooot",
"enable": {
"direct": "Activer les notifications push",
"settings": "Activer dans les paramètres"
},
"global": {
"heading": "Activer pour {{acct}}",
"description": "Les messages sont acheminés via le serveur de tooot"
},
"decode": {
"heading": "Détails du message",
"description": "Les messages acheminés par le serveur de tooot sont chiffrés, mais vous pouvez choisir de décoder le message sur le serveur. Le code source de notre serveur est open source et aucune politique de log."
},
"default": {
"heading": "Par défaut"
},
"follow": {
"heading": "Nouvel abonné"
},
"follow_request": {
"heading": "Demande d'abonnement"
},
"favourite": {
"heading": "Dans les favoris"
},
"reblog": {
"heading": "Boosté"
},
"mention": {
"heading": "Vous a mentionné(e)"
},
"poll": {
"heading": "Mise à jour du sondage"
},
"status": {
"heading": "Pouet des utilisateurs inscrits"
},
"howitworks": "Apprenez comment cela fonctionne"
},
"root": {
"announcements": {
"content": {
"unread": "{{amount}} non lus",
"read": "Tout lu",
"empty": "Aucun"
}
},
"push": {
"content": {
"enabled": "Activé",
"disabled": "Désactivé"
}
},
"update": {
"title": "Mettre à jour vers la dernière version"
},
"logout": {
"button": "Se déconnecter",
"alert": {
"title": "Déconnexion?",
"message": "Après vous être déconnecté, vous devez vous reconnecter",
"buttons": {
"logout": "Déconnexion",
"cancel": "$t(common:buttons.cancel)"
}
}
}
},
"settings": {
"fontsize": {
"heading": "$t(me.stacks.fontSize.name)",
"content": {
"S": "$t(me.fontSize.sizes.S)",
"M": "$t(me.fontSize.sizes.M)",
"L": "$t(me.fontSize.sizes.L)",
"XL": "$t(me.fontSize.sizes.XL)",
"XXL": "$t(me.fontSize.sizes.XXL)"
}
},
"language": {
"heading": "$t(me.stacks.language.name)",
"options": {
"cancel": "$t(common:buttons.cancel)"
}
},
"theme": {
"heading": "Apparence",
"options": {
"auto": "Comme le système",
"light": "Mode Clair",
"dark": "Mode sombre",
"cancel": "$t(common:buttons.cancel)"
}
},
"darkTheme": {
"heading": "Thème sombre",
"options": {
"lighter": "Plus claire",
"darker": "Plus sombre",
"cancel": "$t(common:buttons.cancel)"
}
},
"browser": {
"heading": "Ouverture du lien",
"options": {
"internal": "Dans l'application",
"external": "Ouvrir dans le navigateur système",
"cancel": "$t(common:buttons.cancel)"
}
},
"staticEmoji": {
"heading": "Utiliser des émojis statiques",
"description": "Si vous rencontrez des plantages fréquents de l'application lors de l'affichage de la liste d'émojis, vous pouvez essayer d'utiliser des émojis statiques."
},
"feedback": {
"heading": "Demande de fonctionnalités"
},
"support": {
"heading": "Support de tooot"
},
"review": {
"heading": "Examiner le tooot"
},
"contact": {
"heading": "Contacter tooot"
},
"analytics": {
"heading": "Aidez-nous à nous améliorer",
"description": "Collecte uniquement de l'usage relatif des non-utilisateurs"
},
"version": "Version {{version}}",
"instanceVersion": "Version de Mastodon v{{version}}"
},
"switch": {
"existing": "Choisir parmi les utilisateurs connectés",
"new": "Connectez-vous à une instance"
}
},
"shared": {
"account": {
"actions": {
"accessibilityLabel": "Actions pour l'utilisateur {{user}}",
"accessibilityHint": "Vous pouvez masquer, bloquer, signaler ou partager cet utilisateur"
},
"followed_by": " vous suit",
"moved": "Utilisateur déplacé",
"created_at": "Inscrit le : {{date}}",
"summary": {
"statuses_count": "{{count}} pouets",
"following_count": "$t(shared.users.accounts.following)",
"followers_count": "$t(shared.users.accounts.followers)"
},
"toots": {
"default": "Pouets",
"all": "Pouets et réponses"
},
"suspended": "Compte suspendu par les modérateurs de votre serveur"
},
"attachments": {
"name": "<0 /><1>\"s media</1>"
},
"search": {
"header": {
"prefix": "Recherche en cours",
"placeholder": "pour..."
},
"empty": {
"general": "Entrez le mot clé pour rechercher <bold>$t(screenTabs:shared.search.sections.accounts)</bold><unk><bold>$t(screenTabs:shared.search.sections.hashtags)</bold> ou <bold>$t(screenTabs:shared.search.sections.statuses)</bold>",
"advanced": {
"header": "Recherche avancée",
"example": {
"account": "$t(shared.search.header.prefix) $t(shared.search.sections.accounts)",
"hashtag": "$t(shared.search.header.prefix) $t(shared.search.sections.hashtags)",
"statusLink": "$t(shared.search.header.prefix) $t(shared.search.sections.statuses)",
"accountLink": "$t(shared.search.header.prefix) $t(shared.search.sections.accounts)"
}
}
},
"sections": {
"accounts": "Utilisateur",
"hashtags": "Hashtag",
"statuses": "Pouet"
},
"notFound": "Impossible de trouver <bold>{{searchTerm}}</bold> lié à {{type}}"
},
"toot": {
"name": "Discussions"
},
"users": {
"accounts": {
"following": "Abonnements {{count}}",
"followers": "{{count}} abonnés"
},
"statuses": {
"reblogged_by": "{{count}} boosté",
"favourited_by": "{{count}} mis en favori"
}
},
"history": {
"name": "Modifier l'historique"
}
}
}

View File

@ -1,15 +1,16 @@
import i18n from 'i18next' import i18n from 'i18next'
import { initReactI18next } from 'react-i18next' import { initReactI18next } from 'react-i18next'
import de from '@root/i18n/de/_all' import de from '@root/i18n/de'
import en from '@root/i18n/en/_all' import en from '@root/i18n/en'
import it from '@root/i18n/it/_all' import fr from '@root/i18n/fr'
import ja from '@root/i18n/ja/_all' import it from '@root/i18n/it'
import ko from '@root/i18n/ko/_all' import ja from '@root/i18n/ja'
import pt_BR from '@root/i18n/pt_BR/_all' import ko from '@root/i18n/ko'
import vi from '@root/i18n/vi/_all' import pt_BR from '@root/i18n/pt_BR'
import zh_Hans from '@root/i18n/zh-Hans/_all' import vi from '@root/i18n/vi'
import zh_Hant from '@root/i18n/zh-Hant/_all' import zh_Hans from '@root/i18n/zh-Hans'
import zh_Hant from '@root/i18n/zh-Hant'
import '@formatjs/intl-getcanonicallocales/polyfill' import '@formatjs/intl-getcanonicallocales/polyfill'
import '@formatjs/intl-locale/polyfill' import '@formatjs/intl-locale/polyfill'
@ -17,6 +18,7 @@ import '@formatjs/intl-locale/polyfill'
import '@formatjs/intl-pluralrules/polyfill' import '@formatjs/intl-pluralrules/polyfill'
import '@formatjs/intl-pluralrules/locale-data/de' import '@formatjs/intl-pluralrules/locale-data/de'
import '@formatjs/intl-pluralrules/locale-data/en' import '@formatjs/intl-pluralrules/locale-data/en'
import '@formatjs/intl-pluralrules/locale-data/fr'
import '@formatjs/intl-pluralrules/locale-data/it' import '@formatjs/intl-pluralrules/locale-data/it'
import '@formatjs/intl-pluralrules/locale-data/ja' import '@formatjs/intl-pluralrules/locale-data/ja'
import '@formatjs/intl-pluralrules/locale-data/ko' import '@formatjs/intl-pluralrules/locale-data/ko'
@ -27,6 +29,7 @@ import '@formatjs/intl-pluralrules/locale-data/zh'
import '@formatjs/intl-numberformat/polyfill' import '@formatjs/intl-numberformat/polyfill'
import '@formatjs/intl-numberformat/locale-data/de' import '@formatjs/intl-numberformat/locale-data/de'
import '@formatjs/intl-numberformat/locale-data/en' import '@formatjs/intl-numberformat/locale-data/en'
import '@formatjs/intl-numberformat/locale-data/fr'
import '@formatjs/intl-numberformat/locale-data/it' import '@formatjs/intl-numberformat/locale-data/it'
import '@formatjs/intl-numberformat/locale-data/ja' import '@formatjs/intl-numberformat/locale-data/ja'
import '@formatjs/intl-numberformat/locale-data/ko' import '@formatjs/intl-numberformat/locale-data/ko'
@ -38,6 +41,7 @@ import '@formatjs/intl-numberformat/locale-data/zh-Hant'
import '@formatjs/intl-datetimeformat/polyfill' import '@formatjs/intl-datetimeformat/polyfill'
import '@formatjs/intl-datetimeformat/locale-data/de' import '@formatjs/intl-datetimeformat/locale-data/de'
import '@formatjs/intl-datetimeformat/locale-data/en' import '@formatjs/intl-datetimeformat/locale-data/en'
import '@formatjs/intl-datetimeformat/locale-data/fr'
import '@formatjs/intl-datetimeformat/locale-data/it' import '@formatjs/intl-datetimeformat/locale-data/it'
import '@formatjs/intl-datetimeformat/locale-data/ja' import '@formatjs/intl-datetimeformat/locale-data/ja'
import '@formatjs/intl-datetimeformat/locale-data/ko' import '@formatjs/intl-datetimeformat/locale-data/ko'
@ -50,6 +54,7 @@ import '@formatjs/intl-datetimeformat/add-all-tz'
import '@formatjs/intl-relativetimeformat/polyfill' import '@formatjs/intl-relativetimeformat/polyfill'
import '@formatjs/intl-relativetimeformat/locale-data/de' import '@formatjs/intl-relativetimeformat/locale-data/de'
import '@formatjs/intl-relativetimeformat/locale-data/en' import '@formatjs/intl-relativetimeformat/locale-data/en'
import '@formatjs/intl-relativetimeformat/locale-data/fr'
import '@formatjs/intl-relativetimeformat/locale-data/it' import '@formatjs/intl-relativetimeformat/locale-data/it'
import '@formatjs/intl-relativetimeformat/locale-data/ja' import '@formatjs/intl-relativetimeformat/locale-data/ja'
import '@formatjs/intl-relativetimeformat/locale-data/ko' import '@formatjs/intl-relativetimeformat/locale-data/ko'
@ -65,7 +70,7 @@ i18n.use(initReactI18next).init({
ns: ['common'], ns: ['common'],
defaultNS: 'common', defaultNS: 'common',
resources: { de, en, it, ja, ko, 'pt-BR': pt_BR, vi, 'zh-Hans': zh_Hans, 'zh-Hant': zh_Hant }, resources: { de, en, fr, it, ja, ko, 'pt-BR': pt_BR, vi, 'zh-Hans': zh_Hans, 'zh-Hant': zh_Hant },
returnEmptyString: false, returnEmptyString: false,
saveMissing: true, saveMissing: true,

View File

@ -88,7 +88,7 @@
"content": { "content": {
"expandHint": "Contenuto nascosto" "expandHint": "Contenuto nascosto"
}, },
"filtered": "Filtrato", "filtered": "",
"fullConversation": "Leggi la conversazione", "fullConversation": "Leggi la conversazione",
"translate": { "translate": {
"default": "Traduci", "default": "Traduci",

View File

@ -304,7 +304,8 @@
"toots": { "toots": {
"default": "Toot", "default": "Toot",
"all": "Toot e risposte" "all": "Toot e risposte"
} },
"suspended": ""
}, },
"attachments": { "attachments": {
"name": "Media di <0 /><1>\"</1>" "name": "Media di <0 /><1>\"</1>"

View File

@ -1,6 +1,6 @@
{ {
"title": "メディアソースを選択", "title": "メディアソースを選択",
"message": "", "message": "メディアの EXIF データはアップロードされません",
"options": { "options": {
"image": "写真をアップロード", "image": "写真をアップロード",
"image_max": "写真をアップロード (最大{{max}}枚)", "image_max": "写真をアップロード (最大{{max}}枚)",

View File

@ -2,7 +2,7 @@
"HTML": { "HTML": {
"accessibilityHint": "タップして内容を展開または折りたたむ", "accessibilityHint": "タップして内容を展開または折りたたむ",
"expanded": "{{hint}}{{moreLines}}", "expanded": "{{hint}}{{moreLines}}",
"moreLines": "", "moreLines": " ({{count}} 行以上)",
"defaultHint": "長いトゥート" "defaultHint": "長いトゥート"
} }
} }

View File

@ -40,9 +40,9 @@
"accessibilityLabel": "このトゥートをブーストしますか?", "accessibilityLabel": "このトゥートをブーストしますか?",
"function": "トゥートをブースト", "function": "トゥートをブースト",
"options": { "options": {
"title": "", "title": "ブーストの可視性を選択",
"public": "", "public": "公開ブースト",
"unlisted": "" "unlisted": "未収載ブースト"
} }
}, },
"favourited": { "favourited": {
@ -88,7 +88,7 @@
"content": { "content": {
"expandHint": "内容を非表示にする" "expandHint": "内容を非表示にする"
}, },
"filtered": "フィルター済み", "filtered": "フィルター: {{phrase}}.",
"fullConversation": "スレッドを読む", "fullConversation": "スレッドを読む",
"translate": { "translate": {
"default": "翻訳", "default": "翻訳",

View File

@ -2,10 +2,10 @@
"screenshot": { "screenshot": {
"title": "プライバシー保護", "title": "プライバシー保護",
"message": "ユーザー名やアバターなど、他のユーザーを特定する情報は公開しないでください。", "message": "ユーザー名やアバターなど、他のユーザーを特定する情報は公開しないでください。",
"button": "確" "button": "確"
}, },
"localCorrupt": { "localCorrupt": {
"message": "ログイン期限が切れました。もう一度ログインしてください。" "message": "ログインの有効期限が切れました。もう一度ログインしてください。"
}, },
"pushError": { "pushError": {
"message": "プッシュサービスのエラー", "message": "プッシュサービスのエラー",

View File

@ -304,7 +304,8 @@
"toots": { "toots": {
"default": "投稿", "default": "投稿",
"all": "投稿と返信" "all": "投稿と返信"
} },
"suspended": "あなたのサーバーのモデレーターによって、アカウントは停止されました"
}, },
"attachments": { "attachments": {
"name": "<0 /><1>\" のメディア</1>" "name": "<0 /><1>\" のメディア</1>"

View File

@ -88,7 +88,7 @@
"content": { "content": {
"expandHint": "숨겨진 콘텐츠" "expandHint": "숨겨진 콘텐츠"
}, },
"filtered": "필터됨", "filtered": "",
"fullConversation": "대화 보기", "fullConversation": "대화 보기",
"translate": { "translate": {
"default": "번역", "default": "번역",

View File

@ -304,7 +304,8 @@
"toots": { "toots": {
"default": "툿", "default": "툿",
"all": "툿과 답장" "all": "툿과 답장"
} },
"suspended": ""
}, },
"attachments": { "attachments": {
"name": "<0 /><1>\"의 미디어</1>" "name": "<0 /><1>\"의 미디어</1>"

View File

@ -1,6 +1,7 @@
const LOCALES = { const LOCALES = {
de: 'Deutsch', de: 'Deutsch',
en: 'English', en: 'English',
fr: 'Français',
it: 'Italiano', it: 'Italiano',
ja: '日本語', ja: '日本語',
ko: '한국어', ko: '한국어',

22
src/i18n/pl/common.json Normal file
View File

@ -0,0 +1,22 @@
{
"buttons": {
"OK": "Ok",
"apply": "Zastosuj",
"cancel": "Anuluj"
},
"customEmoji": {
"accessibilityLabel": "Własne emoji {{emoji}}"
},
"message": {
"success": {
"message": "{{function}} pomyślnie"
},
"warning": {
"message": ""
},
"error": {
"message": "{{function}} nie powiodło się, spróbuj ponownie"
}
},
"separator": ", "
}

View File

@ -0,0 +1,76 @@
{
"accessibilityHint": "",
"account": {
"title": "",
"mute": {
"action_false": "",
"action_true": ""
},
"block": {
"action_false": "",
"action_true": ""
},
"reports": {
"action": ""
}
},
"copy": {
"action": "",
"succeed": ""
},
"instance": {
"title": "",
"block": {
"action": "",
"alert": {
"title": "",
"message": "",
"buttons": {
"confirm": ""
}
}
}
},
"share": {
"status": {
"action": ""
},
"account": {
"action": ""
}
},
"status": {
"title": "",
"edit": {
"action": ""
},
"delete": {
"action": "",
"alert": {
"title": "",
"message": "",
"buttons": {
"confirm": ""
}
}
},
"deleteEdit": {
"action": "",
"alert": {
"title": "",
"message": "",
"buttons": {
"confirm": ""
}
}
},
"mute": {
"action_false": "",
"action_true": ""
},
"pin": {
"action_false": "",
"action_true": ""
}
}
}

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1,30 @@
{
"server": {
"textInput": {
"placeholder": ""
},
"button": "",
"information": {
"name": "",
"accounts": "",
"statuses": "",
"domains": ""
},
"disclaimer": {
"base": ""
},
"terms": {
"base": ""
}
},
"update": {
"alert": {
"title": "",
"message": "",
"buttons": {
"cancel": "",
"continue": ""
}
}
}
}

View File

@ -0,0 +1,10 @@
{
"title": "",
"message": "",
"options": {
"image": "",
"image_max": "",
"video": "",
"video_max": ""
}
}

View File

@ -0,0 +1,8 @@
{
"HTML": {
"accessibilityHint": "",
"expanded": "",
"moreLines": "",
"defaultHint": ""
}
}

View File

@ -0,0 +1,16 @@
{
"follow": {
"function": ""
},
"block": {
"function": ""
},
"button": {
"error": "",
"blocked_by": "",
"blocking": "",
"following": "",
"requested": "",
"default": ""
}
}

View File

@ -0,0 +1,152 @@
{
"empty": {
"error": {
"message": "Błąd wczytania",
"button": "Spróbuj ponownie"
},
"success": {
"message": "Oś czasu pusta"
}
},
"end": {
"message": ""
},
"lookback": {
"message": ""
},
"refresh": {
"fetchPreviousPage": "",
"refetch": ""
},
"shared": {
"actioned": {
"pinned": "",
"favourite": "",
"status": "",
"follow": "",
"follow_request": "",
"poll": "",
"reblog": {
"default": "",
"notification": ""
},
"update": ""
},
"actions": {
"reply": {
"accessibilityLabel": ""
},
"reblogged": {
"accessibilityLabel": "",
"function": "",
"options": {
"title": "",
"public": "",
"unlisted": ""
}
},
"favourited": {
"accessibilityLabel": "",
"function": ""
},
"bookmarked": {
"accessibilityLabel": "",
"function": ""
}
},
"actionsUsers": {
"reblogged_by": {
"accessibilityLabel": "",
"accessibilityHint": "",
"text": ""
},
"favourited_by": {
"accessibilityLabel": "",
"accessibilityHint": "",
"text": ""
},
"history": {
"accessibilityLabel": "",
"accessibilityHint": "",
"text_one": "",
"text_other": ""
}
},
"attachment": {
"sensitive": {
"button": ""
},
"unsupported": {
"text": "",
"button": ""
}
},
"avatar": {
"accessibilityLabel": "",
"accessibilityHint": ""
},
"content": {
"expandHint": ""
},
"filtered": "",
"fullConversation": "",
"translate": {
"default": "",
"succeed": "",
"failed": "",
"source_not_supported": "",
"target_not_supported": ""
},
"header": {
"shared": {
"account": {
"name": {
"accessibilityHint": ""
},
"account": {
"accessibilityHint": ""
}
},
"application": "",
"edited": {
"accessibilityLabel": ""
},
"muted": {
"accessibilityLabel": ""
},
"visibility": {
"direct": {
"accessibilityLabel": ""
},
"private": {
"accessibilityLabel": ""
}
}
},
"conversation": {
"withAccounts": "",
"delete": {
"function": ""
}
}
},
"poll": {
"meta": {
"button": {
"vote": "",
"refresh": ""
},
"count": {
"voters_one": "",
"voters_other": "",
"votes_one": "",
"votes_other": ""
},
"expiration": {
"expired": "",
"until": ""
}
}
}
}
}

18
src/i18n/pl/screens.json Normal file
View File

@ -0,0 +1,18 @@
{
"screenshot": {
"title": "",
"message": "",
"button": ""
},
"localCorrupt": {
"message": ""
},
"pushError": {
"message": "",
"description": ""
},
"shareError": {
"imageNotSupported": "",
"videoNotSupported": ""
}
}

View File

@ -0,0 +1,6 @@
{
"heading": "",
"content": {
"select_account": ""
}
}

View File

@ -0,0 +1,20 @@
{
"content": {
"altText": {
"heading": ""
},
"notificationsFilter": {
"heading": "",
"content": {
"follow": "",
"follow_request": "",
"favourite": "",
"reblog": "",
"mention": "",
"poll": "",
"status": "",
"update": ""
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More