Compare commits

..

No commits in common. "main" and "1.4.0" have entirely different histories.
main ... 1.4.0

1064 changed files with 20002 additions and 52285 deletions

View File

@ -1,17 +0,0 @@
import_name: 'ArkanaKeys'
namespace: 'Keys'
result_path: 'Dependencies'
flavors:
- AppStore
swift_declaration_strategy: let
should_generate_unit_tests: true
package_manager: spm
environments:
- Debug
- Release
global_secrets:
# nothing
environment_secrets:
# Will lookup for <Key>Debug and <Key>Release env vars (assuming no flavor was declared)
# Mastodon Push Notification Endpoint
- NotificationEndpoint

View File

@ -1,7 +0,0 @@
# Required
# https://<your-domain>/relay-to/development
NotificationEndpointDebug=""
# https://<your-domain>/relay-to/production
NotificationEndpointRelease=""

View File

@ -1,75 +0,0 @@
#!/usr/bin/env bash
set -xeu
set -o pipefail
function finish() {
ditto -c -k --sequesterRsrc --keepParent "${RESULT_BUNDLE_PATH}" "${RESULT_BUNDLE_PATH}.zip"
rm -rf "${RESULT_BUNDLE_PATH}"
}
trap finish EXIT
SDK="${SDK:-iphoneos}"
WORKSPACE="${WORKSPACE:-Mastodon.xcworkspace}"
SCHEME="${SCHEME:-Mastodon}"
CONFIGURATION=${CONFIGURATION:-Release}
BUILD_DIR=${BUILD_DIR:-.build}
ARTIFACT_PATH=${RESULT_PATH:-${BUILD_DIR}/Artifacts}
RESULT_BUNDLE_PATH="${ARTIFACT_PATH}/${SCHEME}.xcresult"
ARCHIVE_PATH=${ARCHIVE_PATH:-${BUILD_DIR}/Archives/${SCHEME}.xcarchive}
DERIVED_DATA_PATH=${DERIVED_DATA_PATH:-${BUILD_DIR}/DerivedData}
EXPORT_OPTIONS_FILE=".github/support/ExportOptions.plist"
WORK_DIR=$(pwd)
API_PRIVATE_KEYS_PATH="${WORK_DIR}/${BUILD_DIR}/private_keys"
API_KEY_FILE="${API_PRIVATE_KEYS_PATH}/api_key.p8"
rm -rf "${RESULT_BUNDLE_PATH}"
rm -rf "${API_PRIVATE_KEYS_PATH}"
mkdir -p "${API_PRIVATE_KEYS_PATH}"
echo -n "${ENV_API_PRIVATE_KEY_BASE64}" | base64 --decode > "${API_KEY_FILE}"
BUILD_NUMBER=$(app-store-connect get-latest-testflight-build-number $ENV_APP_ID --issuer-id $ENV_ISSUER_ID --key-id $ENV_API_KEY_ID --private-key @file:$API_KEY_FILE)
BUILD_NUMBER=$((BUILD_NUMBER+1))
CURRENT_PROJECT_VERSION=${BUILD_NUMBER:-0}
echo "GITHUB_TAG_NAME=build-$CURRENT_PROJECT_VERSION" >> $GITHUB_ENV
agvtool new-version -all $CURRENT_PROJECT_VERSION
xcrun xcodebuild clean \
-workspace "${WORKSPACE}" \
-scheme "${SCHEME}" \
-configuration "${CONFIGURATION}"
xcrun xcodebuild archive \
-workspace "${WORKSPACE}" \
-scheme "${SCHEME}" \
-configuration "${CONFIGURATION}" \
-destination generic/platform=iOS \
-sdk "${SDK}" \
-parallelizeTargets \
-showBuildTimingSummary \
-derivedDataPath "${DERIVED_DATA_PATH}" \
-archivePath "${ARCHIVE_PATH}" \
-resultBundlePath "${RESULT_BUNDLE_PATH}" \
-allowProvisioningUpdates \
-authenticationKeyPath "${API_KEY_FILE}" \
-authenticationKeyID "${ENV_API_KEY_ID}" \
-authenticationKeyIssuerID "${ENV_ISSUER_ID}"
xcrun xcodebuild \
-exportArchive \
-archivePath "${ARCHIVE_PATH}" \
-exportOptionsPlist "${EXPORT_OPTIONS_FILE}" \
-exportPath "${ARTIFACT_PATH}/${SCHEME}.ipa" \
-allowProvisioningUpdates \
-authenticationKeyPath "${API_KEY_FILE}" \
-authenticationKeyID "${ENV_API_KEY_ID}" \
-authenticationKeyIssuerID "${ENV_ISSUER_ID}"
# Zip up the Xcode Archive into Artifacts folder.
ditto -c -k --sequesterRsrc --keepParent "${ARCHIVE_PATH}" "${ARTIFACT_PATH}/${SCHEME}.xcarchive.zip"

View File

@ -7,6 +7,6 @@ set -eo pipefail
xcodebuild -workspace Mastodon.xcworkspace \
-scheme Mastodon \
-destination "platform=iOS Simulator,name=iPhone SE (2nd generation)" \
-destination "platform=iOS Simulator,name=iPhone SE (2nd generation)" \
clean \
build | xcpretty

View File

@ -1,15 +1,9 @@
#!/bin/bash
# workaround https://github.com/CocoaPods/CocoaPods/issues/11355
# sed -i '' $'1s/^/source "https:\\/\\/github.com\\/CocoaPods\\/Specs.git"\\\n\\\n/' Podfile
sudo gem install cocoapods-keys
# Install Ruby Bundler
gem install bundler:2.3.11
# stub keys. DO NOT use in production
pod keys set notification_endpoint "<endpoint>"
pod keys set notification_endpoint_debug "<endpoint>"
# Install Ruby Gems
bundle install
# Setup notification endpoint
bundle exec arkana
bundle exec pod install
pod install

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>app-store</string>
<key>manageAppVersionAndBuildNumber</key>
<true/>
</dict>
</plist>

View File

@ -1,74 +0,0 @@
name: Build for Develop TestFlight
on:
push:
branches:
- develop
- release*
- ci-test
jobs:
build:
name: Build
runs-on: macOS-12
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup
env:
NotificationEndpointDebug: ${{ secrets.NotificationEndpointDebug }}
NotificationEndpointRelease: ${{ secrets.NotificationEndpointRelease }}
run: exec ./.github/scripts/setup.sh
- name: Install codemagic-cli-tools
uses: actions/setup-python@v4
with:
python-version: '3.11'
- run: |
pip3 install codemagic-cli-tools
- run: |
codemagic-cli-tools --version || true
- name: Import Code-Signing Certificates
uses: Apple-Actions/import-codesign-certs@v1 # https://github.com/Apple-Actions/import-codesign-certs
with:
keychain: build-p12
p12-file-base64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
p12-password: ${{ secrets.P12_PASSWORD }}
- name: Download Provisioning Profiles
uses: Apple-Actions/download-provisioning-profiles@v1 # https://github.com/Apple-Actions/download-provisioning-profiles
with:
bundle-id: org.joinmastodon.app
issuer-id: ${{ secrets.APPSTORE_ISSUER_ID }}
api-key-id: ${{ secrets.APPSTORE_KEY_ID }}
api-private-key: ${{ secrets.APPSTORE_PRIVATE_KEY }}
- name: Build
env:
ENV_APP_ID: ${{ secrets.APP_ID }}
ENV_ISSUER_ID: ${{ secrets.APPSTORE_ISSUER_ID }}
ENV_API_KEY_ID: ${{ secrets.APPSTORE_KEY_ID }}
ENV_API_PRIVATE_KEY: ${{ secrets.APPSTORE_PRIVATE_KEY }}
ENV_API_PRIVATE_KEY_BASE64: ${{ secrets.APP_STORE_CONNECT_KEY_BASE64 }}
run: exec ./.github/scripts/build-release.sh
- name: Upload TestFlight Build
uses: Apple-Actions/upload-testflight-build@master
with:
app-path: .build/Artifacts/Mastodon.ipa/Mastodon.ipa
issuer-id: ${{ secrets.APPSTORE_ISSUER_ID }}
api-key-id: ${{ secrets.APPSTORE_KEY_ID }}
api-private-key: ${{ secrets.APPSTORE_PRIVATE_KEY }}
- name: Tag commit
uses: tvdias/github-tagger@v0.0.1
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
tag: "${{ env.GITHUB_TAG_NAME }}"
- name: Clean up keychain and provisioning profile
if: ${{ always() }}
run: |
security delete-keychain build-p12.keychain-db

View File

@ -6,9 +6,6 @@ on:
- master
- develop
- feature/*
- feature-*
- issue/*
- issue-*
pull_request:
branches:
- develop
@ -18,14 +15,13 @@ on:
jobs:
build:
name: CI build
runs-on: macos-12
runs-on: macos-11
steps:
- name: checkout
uses: actions/checkout@v2
- name: force Xcode 13.2.1
run: sudo xcode-select -switch /Applications/Xcode_13.2.1.app
- name: setup
env:
NotificationEndpointDebug: ${{ secrets.NotificationEndpointDebug }}
NotificationEndpointRelease: ${{ secrets.NotificationEndpointRelease }}
run: exec ./.github/scripts/setup.sh
- name: build
run: exec ./.github/scripts/build.sh

7
.gitignore vendored
View File

@ -120,9 +120,6 @@ xcuserdata
# End of https://www.toptal.com/developers/gitignore/api/swift,swiftpm,xcode,cocoapods
# Localization/StringsConvertor/input
Localization/StringsConvertor/input
Localization/StringsConvertor/output
.DS_Store
env/**/**
!env/.env
.DS_Store

View File

@ -1,6 +1,6 @@
//
// AppSecret.swift
// MastodonCore
// AppShared
//
// Created by MainasuK Cirno on 2021-4-27.
//
@ -9,8 +9,8 @@
import Foundation
import CryptoKit
import KeychainAccess
import Keys
import MastodonCommon
import ArkanaKeys
public final class AppSecret {
@ -36,12 +36,12 @@ public final class AppSecret {
}()
init() {
let keys = MastodonKeys()
#if DEBUG
let keys = Keys.Debug()
self.notificationEndpoint = keys.notificationEndpoint
self.notificationEndpoint = keys.notification_endpoint_debug
#else
let keys = Keys.Release()
self.notificationEndpoint = keys.notificationEndpoint
self.notificationEndpoint = keys.notification_endpoint
#endif
}

18
AppShared/AppShared.h Normal file
View File

@ -0,0 +1,18 @@
//
// AppShared.h
// AppShared
//
// Created by MainasuK Cirno on 2021-4-27.
//
#import <Foundation/Foundation.h>
//! Project version number for AppShared.
FOUNDATION_EXPORT double AppSharedVersionNumber;
//! Project version string for AppShared.
FOUNDATION_EXPORT const unsigned char AppSharedVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <AppShared/PublicHeader.h>

22
AppShared/Info.plist Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.4.0</string>
<key>CFBundleVersion</key>
<string>121</string>
</dict>
</plist>

View File

@ -1,13 +1,12 @@
//
// UserDefaults+Notification.swift
// MastodonCommon
// AppShared
//
// Created by Cirno MainasuK on 2021-10-9.
//
import UIKit
import CryptoKit
import MastodonExtension
extension UserDefaults {
// always use hash value (SHA256) from accessToken as key
@ -39,15 +38,3 @@ extension UserDefaults {
}
}
extension UserDefaults {
@objc public dynamic var notificationBadgeCount: Int {
get {
register(defaults: [#function: 0])
return integer(forKey: #function)
}
set { self[#function] = newValue }
}
}

View File

@ -1,12 +1,13 @@
# Acknowledgments
- [Alamofire](https://github.com/Alamofire/Alamofire)
- [AlamofireImage](https://github.com/Alamofire/AlamofireImage)
- [AlamofireNetworkActivityIndicator](https://github.com/Alamofire/AlamofireNetworkActivityIndicator)
- [Arkana](https://github.com/rogerluan/arkana)
- [Alamofire](https://github.com/Alamofire/Alamofire)
- [CommonOSLog](https://github.com/mainasuk/CommonOSLog)
- [CryptoSwift](https://github.com/krzyzanowskim/CryptoSwift)
- [DateToolSwift](https://github.com/MatthewYork/DateTools)
- [DiffableDataSources](https://github.com/ra1028/DiffableDataSources)
- [DifferenceKit](https://github.com/ra1028/DifferenceKit)
- [FLAnimatedImage](https://github.com/Flipboard/FLAnimatedImage)
- [FLEX](https://github.com/FLEXTool/FLEX)
- [FPSIndicator](https://github.com/MainasuK/FPSIndicator)
@ -25,10 +26,9 @@
- [SwiftGen](https://github.com/SwiftGen/SwiftGen)
- [SwiftUI-Introspect](https://github.com/siteline/SwiftUI-Introspect)
- [SwiftyJSON](https://github.com/SwiftyJSON/SwiftyJSON)
- [TabBarPager](https://github.com/TwidereProject/TabBarPager)
- [Tabman](https://github.com/uias/Tabman)
- [TwidereX-iOS](https://github.com/TwidereProject/TwidereX-iOS)
- [ThirdPartyMailer](https://github.com/vtourraine/ThirdPartyMailer)
- [TOCropViewController](https://github.com/TimOliver/TOCropViewController)
- [TwidereX-iOS](https://github.com/TwidereProject/TwidereX-iOS)
- [TwitterProfile](https://github.com/OfTheWolf/TwitterProfile)
- [UITextView-Placeholder](https://github.com/devxoul/UITextView-Placeholder)
- [UITextView-Placeholder](https://github.com/devxoul/UITextView-Placeholder)

View File

@ -1,30 +1,30 @@
# Contributing
- File an issue to report a bug or feature request
- File the issue for bug report and feature request
- Translate the project in our [Crowdin](https://crowdin.com/project/mastodon-for-ios) project
- Make the Pull Request to contribute
## Bug Report
File an issue about the bug or feature request. Make sure you are installing the latest version of the app from TestFlight or App Store.
File the issue about the bug. Make sure you are installing the latest version app from TestFlight or App Store.
## Translation
[![Crowdin](https://badges.crowdin.net/mastodon-for-ios/localized.svg)](https://crowdin.com/project/mastodon-for-ios)
The translation will update regularly. Please request the language if it is not listed via an issue.
The translation will update regularly. Please request language if not listed via issue.
## Pull Request
You can create a pull request directly with small block code changes for bugfix or feature implementations. Before making a pull request with hundred lines of changes to this repository, please first discuss the change you wish to make via an issue.
You can make a pull request directly with small block code changes for bugfix or feature implementations. Before making a pull request with hundred lines of changes to this repository, please first discuss the change you wish to make via issue.
Also, there are lots of existing feature request issues that could be a good-first-issue discussing place.
Follow the git-flow pattern to make your pull request.
1. Ensure you have started a new branch based on the `develop` branch.
2. Write your changes and test them on **iPad and iPhone**.
3. Merge the `develop` branch into your branch then make a Pull Request. Please merge the branch and resolve any conflicts if `develop` updates. **Do not force push your commits.**
4. Make sure the permission for your fork is open to the reviewer. Code style fix, conflict resolution, and other changes may be committed by the reviewer directly.
1. Ensure you are checkout on the `develop` branch.
2. Write your codes and test them on **iPad and iPhone**.
3. Merge the `develop` into your branch then make a Pull Request. Please merge the branch and resolve any conflicts when the `develop` updates. **Do not force push your codes.**
4. Make sure the permission for your folk is open to the reviewer. Code style fix, conflict resolution, and other changes may be committed by the reviewer directly.
5. Request a code review and wait for approval. The PR will be merged when it is approved.
## Documentation
The documentation for this app is listed under the [Documentation](../Documentation/) folder. We are also welcoming contributions for documentation.
The documents for this app is list under the [Documentation](../Documentation/) folder. We are also welcome contributions for documentation.

View File

@ -7,18 +7,17 @@
- iOS 14.0+
Install the latest version of Xcode from the App Store or Apple Developer Download website. Also, we assert you have the [Homebrew](https://brew.sh) package manager.
Intell the latest version of Xcode from the App Store or Apple Developer Download website. Also, we assert you have the [Homebrew](https://brew.sh) package manager.
This guide may not suit your machine and actually setup procedure may change in the future. Please file the issue or Pull Request if there are any problems.
## CocoaPods
The app use [CocoaPods]() and [Arkana](https://github.com/rogerluan/arkana). Ruby Gems are managed through Bundler. The M1 Mac needs virtual ruby env to workaround compatibility issues. Make sure you have [Rosetta](https://support.apple.com/en-us/HT211861) installed if you are using the M1 Mac.
The app use [CocoaPods]() and [CocoaPods-Keys](https://github.com/orta/cocoapods-keys). The M1 Mac needs virtual ruby env to workaround compatibility issues.
#### Intel Mac
```zsh
gem install bundler
bundle install
sudo gem install cocoapods cocoapods-keys
```
#### M1 Mac
@ -41,39 +40,31 @@ rbenv global 3.0.3
ruby --version
# > ruby 3.0.3p157 (2021-11-24 revision 3fb7d2cadc) [arm64-darwin21]
gem install bundler
bundle install
sudo gem install cocoapods cocoapods-keys
```
## Bootstrap
```zsh
# make a clean build
bundle install
bundle exec pod clean
# setup arkana
# please check the `.env.example` to create your's or use the empty example directly
bundle exec arkana -e ./env/.env
# clean pods
bundle exec pod clean
sudo gem install cocoapods-clean
pod clean
# make install
bundle exec pod install --repo-update
pod install --repo-update
# open workspace
open Mastodon.xcworkspace
```
The Arkana plugin will setup the push notification endpoint. You can use the empty template from `./env/.env` or use your own `.env` file. To setup the push notification. Please check section `Push Notification` below.
The CocoaPods-Key plugin will request the push notification endpoint. You can fufill the empty string and set it later. To setup the push notification. Please check section `Push Notification` below.
The app requires the `App Group` capability. To make sure it works for your developer membership. Please check [AppSecret.swift](../MastodonSDK/Sources/MastodonCore/AppSecret.swift) file and set another unique `groupID` and update `App Group` settings.
The app requires the `App Group` capability. To make sure it works for your developer membership. Please check [AppSecret.swift](../AppShared/AppSecret.swift) file and set another unique `groupID` and update `App Group` settings.
#### Push Notification (Optional)
The app is compatible with [toot-relay](https://github.com/DagAgren/toot-relay) APNs. You can set your push notification endpoint via Arkana. There are two endpoints:
- NotificationEndpointDebug: for `DEBUG` usage. e.g. `https://<your.domin>/relay-to/development`
- NotificationEndpointRelease: for `RELEASE` usage. e.g. `https://<your.domin>/relay-to/production`
The app is compatible with [toot-relay](https://github.com/DagAgren/toot-relay) APNs. You can set your push notification endpoint via Cocoapod-Keys. There are two endpoints:
- notification_endpoint: for `RELEASE` usage
- notification_endpoint_debug: for `DEBUG` usage
Please check the [Establishing a Certificate-Based Connection to APNs
](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_certificate-based_connection_to_apns) document to generate the certificate and exports the p12 file.
@ -89,4 +80,4 @@ Please check and set the `notification.Topic` to the app BundleID in [toot-relay
## What's next
We welcome contributions! And if you have an interest to contribute codes. Here is a document that describes the app architecture and what's tech stack it uses.
We welcome contributions! And if you have an interest to contribute codes. Here is a document that describes the app architecture and what's tech stack it uses.

View File

@ -14,7 +14,7 @@ We use `xcodebuild` CLI tool to trigger UITest.
Set the `name` in `-destination` option to add device for snapshot. For example:
`-destination 'platform=iOS Simulator,name=iPad Pro (12.9-inch) (5th generation)' \`
You can list the available simulators:
You can list the avaiable simulator:
```zsh
# list the destinations
xcodebuild \

View File

@ -1,7 +0,0 @@
source "https://rubygems.org"
gem 'arkana'
gem "cocoapods"
gem "cocoapods-clean"
gem "xcpretty"

View File

@ -1,114 +0,0 @@
GEM
remote: https://rubygems.org/
specs:
CFPropertyList (3.0.5)
rexml
activesupport (6.1.7)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
zeitwerk (~> 2.3)
addressable (2.8.1)
public_suffix (>= 2.0.2, < 6.0)
algoliasearch (1.27.5)
httpclient (~> 2.8, >= 2.8.3)
json (>= 1.5.1)
arkana (1.2.0)
colorize (~> 0.8)
dotenv (~> 2.7)
yaml (~> 0.2)
atomos (0.1.3)
claide (1.1.0)
cocoapods (1.11.3)
addressable (~> 2.8)
claide (>= 1.0.2, < 2.0)
cocoapods-core (= 1.11.3)
cocoapods-deintegrate (>= 1.0.3, < 2.0)
cocoapods-downloader (>= 1.4.0, < 2.0)
cocoapods-plugins (>= 1.0.0, < 2.0)
cocoapods-search (>= 1.0.0, < 2.0)
cocoapods-trunk (>= 1.4.0, < 2.0)
cocoapods-try (>= 1.1.0, < 2.0)
colored2 (~> 3.1)
escape (~> 0.0.4)
fourflusher (>= 2.3.0, < 3.0)
gh_inspector (~> 1.0)
molinillo (~> 0.8.0)
nap (~> 1.0)
ruby-macho (>= 1.0, < 3.0)
xcodeproj (>= 1.21.0, < 2.0)
cocoapods-clean (0.0.1)
cocoapods-core (1.11.3)
activesupport (>= 5.0, < 7)
addressable (~> 2.8)
algoliasearch (~> 1.0)
concurrent-ruby (~> 1.1)
fuzzy_match (~> 2.0.4)
nap (~> 1.0)
netrc (~> 0.11)
public_suffix (~> 4.0)
typhoeus (~> 1.0)
cocoapods-deintegrate (1.0.5)
cocoapods-downloader (1.6.3)
cocoapods-plugins (1.0.0)
nap
cocoapods-search (1.0.1)
cocoapods-trunk (1.6.0)
nap (>= 0.8, < 2.0)
netrc (~> 0.11)
cocoapods-try (1.2.0)
colored2 (3.1.2)
colorize (0.8.1)
concurrent-ruby (1.1.10)
dotenv (2.8.1)
escape (0.0.4)
ethon (0.15.0)
ffi (>= 1.15.0)
ffi (1.15.5)
fourflusher (2.3.1)
fuzzy_match (2.0.4)
gh_inspector (1.1.3)
httpclient (2.8.3)
i18n (1.12.0)
concurrent-ruby (~> 1.0)
json (2.6.2)
minitest (5.16.3)
molinillo (0.8.0)
nanaimo (0.3.0)
nap (1.1.0)
netrc (0.11.0)
public_suffix (4.0.7)
rexml (3.2.5)
rouge (2.0.7)
ruby-macho (2.5.1)
typhoeus (1.4.0)
ethon (>= 0.9.0)
tzinfo (2.0.5)
concurrent-ruby (~> 1.0)
xcodeproj (1.22.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)
colored2 (~> 3.1)
nanaimo (~> 0.3.0)
rexml (~> 3.2.4)
xcpretty (0.3.0)
rouge (~> 2.0.7)
yaml (0.2.0)
zeitwerk (2.6.3)
PLATFORMS
arm64-darwin-21
arm64-darwin-22
x86_64-darwin-21
x86_64-darwin-22
DEPENDENCIES
arkana
cocoapods
cocoapods-clean
xcpretty
BUNDLED WITH
2.3.17

View File

@ -13,15 +13,15 @@
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>no unread notifications</string>
<string>no unread notification</string>
<key>one</key>
<string>1 unread notification</string>
<key>few</key>
<string>%ld unread notifications</string>
<key>many</key>
<string>%ld unread notifications</string>
<string>%ld unread notification</string>
<key>other</key>
<string>%ld unread notifications</string>
<string>%ld unread notification</string>
</dict>
</dict>
<key>a11y.plural.count.input_limit_exceeds</key>
@ -67,59 +67,6 @@
<key>other</key>
<string>%ld characters</string>
</dict>
</dict>
<key>a11y.plural.count.characters_left</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@character_count@ left</string>
<key>character_count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>no characters</string>
<key>one</key>
<string>1 character</string>
<key>few</key>
<string>%ld characters</string>
<key>many</key>
<string>%ld characters</string>
<key>other</key>
<string>%ld characters</string>
</dict>
</dict>
<key>plural.count.followed_by_and_mutual</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@names@%#@count_mutual@</string>
<key>names</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>other</key>
<string></string>
</dict>
<key>count_mutual</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>Followed by %1$@</string>
<key>one</key>
<string>Followed by %1$@, and another mutual</string>
<key>few</key>
<string>Followed by %1$@, and %ld mutuals</string>
<key>many</key>
<string>Followed by %1$@, and %ld mutuals</string>
<key>other</key>
<string>Followed by %1$@, and %ld mutuals</string>
</dict>
</dict>
<key>plural.count.metric_formatted.post</key>
<dict>
@ -143,28 +90,6 @@
<string>posts</string>
</dict>
</dict>
<key>plural.count.media</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@media_count@</string>
<key>media_count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>zero</key>
<string>0 media</string>
<key>one</key>
<string>1 media</string>
<key>few</key>
<string>%ld media</string>
<key>many</key>
<string>%ld media</string>
<key>other</key>
<string>%ld media</string>
</dict>
</dict>
<key>plural.count.post</key>
<dict>
<key>NSStringLocalizedFormatKey</key>

View File

@ -1,34 +1,23 @@
# Localization
[![Crowdin](https://badges.crowdin.net/mastodon-for-ios/localized.svg)](https://crowdin.com/project/mastodon-for-ios)
We use Crowdin for translations and some automation.
Mastodon localization template file
## How to contribute
### Help with translations
## How to contribute?
Head over [Crowdin][crowdin-mastodon-ios] for that. To help with translations, select your language and translate :-) If your language is not in the list, please feel free to [open a topic on Crowdin](crowdin-mastodon-ios-discussions).
Please use the [Crodwin](https://crowdin.com/project/mastodon-for-ios) to contribute. If your language is not in the list. Please feel free to open the issue.
Please note: You need to have an account on Crowdin to help with translations.
## How to maintains
### Add new strings
The project use a script to generate Xcode localized strings files.
This is mainly for developers.
```zsh
// enter workdir
cd Mastodon
1. Add new strings in `Localization/app.json` **and** the `Localizable.strings` for English.
2. Run `swiftgen` to generate the `Strings.swift`-file **or** have Xcode build the app (`swiftgen` is a Build phase, too).
3. Use `import MastodonLocalization` and its (new) `L10n`-enum and its properties where ever you need them in the app.
4. Once the updated `Localization/app.json` hits `develop`, it gets synced to Crowdin, where people can help with translations. `Localization/app.json` must be a valid json.
// merge PR from Crowdin bot
## How to update translations
If there are new translations, Crowdin pushes new commits to a branch called `l10n_develop` and creates a new Pull Request. Both, the branch and the PR might be updated once an hour. The project itself uses a script to generate the various `Localizable.strings`-files etc. for Xcode.
To update or add new translations, the workflow is as follows:
1. Merge the PR with `l10n_develop` into `develop`. It's usually called `New Crowdin Updates`
2. Run `update.localization.sh` on your computer.
3. Commit the changes and push `develop`.
[crowdin-mastodon-ios]: https://crowdin.com/project/mastodon-for-ios
[crowdin-mastodon-ios-discussions]: https://crowdin.com/project/mastodon-for-ios/discussions
// update resource
./update_localization.sh
```

View File

@ -1,51 +0,0 @@
"16wxgf" = "Příspěvek na Mastodon";
"751xkl" = "Textový obsah";
"CsR7G2" = "Příspěvek na Mastodon";
"HZSGTr" = "Jaký obsah se má přidat?";
"HdGikU" = "Odeslání se nezdařilo";
"KDNTJ4" = "Důvod selhání";
"RHxKOw" = "Odeslat příspěvek s textovým obsahem";
"RxSqsb" = "Příspěvek";
"WCIR3D" = "Zveřejnit ${content} na Mastodon";
"ZKJSNu" = "Příspěvek";
"ZS1XaK" = "${content}";
"ZbSjzC" = "Viditelnost";
"Zo4jgJ" = "Viditelnost příspěvku";
"apSxMG-dYQ5NN" = "Existuje ${count} možností odpovídajících 'Veřejný'.";
"apSxMG-ehFLjY" = "Existuje ${count} možností, které odpovídají „jen sledujícím“.";
"ayoYEb-dYQ5NN" = "${content}, veřejné";
"ayoYEb-ehFLjY" = "${content}, pouze sledující";
"dUyuGg" = "Příspěvek na Mastodon";
"dYQ5NN" = "Veřejný";
"ehFLjY" = "Pouze sledující";
"gfePDu" = "Odeslání se nezdařilo. ${failureReason}";
"k7dbKQ" = "Příspěvek byl úspěšně odeslán.";
"oGiqmY-dYQ5NN" = "Jen pro kontrolu, chtěli jste „Veřejný“?";
"oGiqmY-ehFLjY" = "Jen pro kontrolu, chtěli jste „Pouze sledující“?";
"rM6dvp" = "URL";
"ryJLwG" = "Příspěvek byl úspěšně odeslán. ";

View File

@ -1,46 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>There are ${count} options matching ${content}. - 2</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>Existuje %#@count_option@ odpovídající „${content}“.</string>
<key>count_option</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>one</key>
<string>1 option</string>
<key>few</key>
<string>%ld options</string>
<key>many</key>
<string>%ld options</string>
<key>other</key>
<string>%ld options</string>
</dict>
</dict>
<key>There are ${count} options matching ${visibility}.</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>There are %#@count_option@ matching ${visibility}.</string>
<key>count_option</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>one</key>
<string>1 option</string>
<key>few</key>
<string>%ld options</string>
<key>many</key>
<string>%ld options</string>
<key>other</key>
<string>%ld options</string>
</dict>
</dict>
</dict>
</plist>

View File

@ -1,51 +0,0 @@
"16wxgf" = "Publicar en Mastodon";
"751xkl" = "Texto a incluír";
"CsR7G2" = "Publicar en Mastodon";
"HZSGTr" = "Cal é o contido a publicar?";
"HdGikU" = "Fallou a publicación";
"KDNTJ4" = "Razón do fallo";
"RHxKOw" = "Enviar Publicación con texto";
"RxSqsb" = "Publicación";
"WCIR3D" = "Publicar ${content} en Mastodon";
"ZKJSNu" = "Publicación";
"ZS1XaK" = "${content}";
"ZbSjzC" = "Visibilidade";
"Zo4jgJ" = "Visibilidade da publicación";
"apSxMG-dYQ5NN" = "Hai ${count} opcións que coinciden con Público.";
"apSxMG-ehFLjY" = "Hai ${count} opcións que coinciden con 'Só seguidoras.";
"ayoYEb-dYQ5NN" = "${content}, Público";
"ayoYEb-ehFLjY" = "${content}, Só seguidoras";
"dUyuGg" = "Publicar en Mastodon";
"dYQ5NN" = "Público";
"ehFLjY" = "Só seguidoras";
"gfePDu" = "Fallou a publicación. ${failureReason}";
"k7dbKQ" = "Publicación correcta.";
"oGiqmY-dYQ5NN" = "Só para confirmar, querías Público'?";
"oGiqmY-ehFLjY" = "Só para confirmar, querías Só para seguidoras'?";
"rM6dvp" = "URL";
"ryJLwG" = "Publicación correcta. ";

View File

@ -1,38 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>There are ${count} options matching ${content}. - 2</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>Hai %#@count_option@ coincidencias con '${content}'.</string>
<key>count_option</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>one</key>
<string>1 opción</string>
<key>other</key>
<string>%ld opcións</string>
</dict>
</dict>
<key>There are ${count} options matching ${visibility}.</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>Hai %#@count_option@ coincidentes con '${visibility}'.</string>
<key>count_option</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>one</key>
<string>1 opción</string>
<key>other</key>
<string>%ld opcións</string>
</dict>
</dict>
</dict>
</plist>

View File

@ -1,51 +0,0 @@
"16wxgf" = "Birta á Mastodon";
"751xkl" = "Efni texta";
"CsR7G2" = "Birta á Mastodon";
"HZSGTr" = "Hvaða efni á að birta?";
"HdGikU" = "Birting færslu mistókst";
"KDNTJ4" = "Ástæða bilunar";
"RHxKOw" = "Senda færslu með textaefni";
"RxSqsb" = "Færsla";
"WCIR3D" = "Birta ${content} á Mastodon";
"ZKJSNu" = "Færsla";
"ZS1XaK" = "${content}";
"ZbSjzC" = "Sýnileiki";
"Zo4jgJ" = "Sýnileiki færslu";
"apSxMG-dYQ5NN" = "Það eru ${count} valkostir sem samsvara Opinbert.";
"apSxMG-ehFLjY" = "Það eru ${count} valkostir sem samsvara Einungis fylgjendur.";
"ayoYEb-dYQ5NN" = "${content}, opinbert";
"ayoYEb-ehFLjY" = "${content}, einungis fylgjendur";
"dUyuGg" = "Birta á Mastodon";
"dYQ5NN" = "Opinbert";
"ehFLjY" = "Einungis fylgjendur";
"gfePDu" = "Birting færslu mistókst. ${failureReason}";
"k7dbKQ" = "Það tókst að senda færsluna.";
"oGiqmY-dYQ5NN" = "Bara til að staðfesta, þú vildir 'Opinbert'?";
"oGiqmY-ehFLjY" = "Bara til að staðfesta, þú vildir ''Einungis fylgjendur'?";
"rM6dvp" = "URL-slóð";
"ryJLwG" = "Það tókst að senda færsluna. ";

View File

@ -1,38 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>There are ${count} options matching ${content}. - 2</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>Það eru %#@count_option@ sem samsvara ${content}.</string>
<key>count_option</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>one</key>
<string>1 valkostur</string>
<key>other</key>
<string>%ld valkostir</string>
</dict>
</dict>
<key>There are ${count} options matching ${visibility}.</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>Það eru %#@count_option@ sem samsvara ${visibility}.</string>
<key>count_option</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>one</key>
<string>1 valkostur</string>
<key>other</key>
<string>%ld valkostir</string>
</dict>
</dict>
</dict>
</plist>

View File

@ -29,9 +29,9 @@
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>one</key>
<string>%ld n uɣewwaṛ</string>
<string>1 uɣewwaṛ</string>
<key>other</key>
<string>%ld n iɣewwaṛen</string>
<string>%ld iɣewwaṛen</string>
</dict>
</dict>
</dict>

View File

@ -1,51 +0,0 @@
"16wxgf" = "Post on Mastodon";
"751xkl" = "Text Content";
"CsR7G2" = "Post on Mastodon";
"HZSGTr" = "What content to post?";
"HdGikU" = "Posting failed";
"KDNTJ4" = "Failure Reason";
"RHxKOw" = "Send Post with text content";
"RxSqsb" = "Post";
"WCIR3D" = "Post ${content} on Mastodon";
"ZKJSNu" = "Post";
"ZS1XaK" = "${content}";
"ZbSjzC" = "Visibility";
"Zo4jgJ" = "Post Visibility";
"apSxMG-dYQ5NN" = "There are ${count} options matching Public.";
"apSxMG-ehFLjY" = "There are ${count} options matching Followers Only.";
"ayoYEb-dYQ5NN" = "${content}, Public";
"ayoYEb-ehFLjY" = "${content}, Followers Only";
"dUyuGg" = "Post on Mastodon";
"dYQ5NN" = "공개";
"ehFLjY" = "팔로워 전용";
"gfePDu" = "게시를 실패했습니다. ${failureReason}";
"k7dbKQ" = "성공적으로 게시물을 전송했습니다.";
"oGiqmY-dYQ5NN" = "확인차 물어보건데, '공개'로 게시하시길 원합니까?";
"oGiqmY-ehFLjY" = "확인차 물어보건데, '팔로워 전용'으로 게시하시길 원합니까?";
"rM6dvp" = "URL";
"ryJLwG" = "성공적으로 게시물을 전송했습니다. ";

View File

@ -13,7 +13,7 @@
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>other</key>
<string>%ld 개의 옵션</string>
<string>%ld options</string>
</dict>
</dict>
<key>There are ${count} options matching ${visibility}.</key>
@ -27,7 +27,7 @@
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>other</key>
<string>%ld 개의 옵션</string>
<string>%ld options</string>
</dict>
</dict>
</dict>

View File

@ -1,51 +0,0 @@
"16wxgf" = "Postar no Mastodon";
"751xkl" = "Conteúdo do texto";
"CsR7G2" = "Postar no Mastodon";
"HZSGTr" = "Qual conteúdo a publicar?";
"HdGikU" = "Falha na publicação";
"KDNTJ4" = "Motivo da falha";
"RHxKOw" = "Enviar postagem com conteúdo de texto";
"RxSqsb" = "Postagem";
"WCIR3D" = "Postar ${content} no Mastodon";
"ZKJSNu" = "Postar";
"ZS1XaK" = "${content}";
"ZbSjzC" = "Visibilidade";
"Zo4jgJ" = "Visibilidade da publicação";
"apSxMG-dYQ5NN" = "Existem ${count} opções correspondentes a Público.";
"apSxMG-ehFLjY" = "Existem ${count} opções correspondentes a Apenas para seguidores.";
"ayoYEb-dYQ5NN" = "${content}, Público";
"ayoYEb-ehFLjY" = "${content}, Apenas para seguidores";
"dUyuGg" = "Postar no Mastodon";
"dYQ5NN" = "Público";
"ehFLjY" = "Apenas para seguidores";
"gfePDu" = "Falha na publicação. ${failureReason}";
"k7dbKQ" = "Publicação enviada com sucesso.";
"oGiqmY-dYQ5NN" = "Só para confirmar, você queria Público?";
"oGiqmY-ehFLjY" = "Só para confirmar, você queria Apenas para seguidores?";
"rM6dvp" = "URL";
"ryJLwG" = "Publicação enviada com sucesso. ";

View File

@ -1,38 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>There are ${count} options matching ${content}. - 2</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>Existem %#@count_option@ opções correspondentes a ${content}.</string>
<key>count_option</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>one</key>
<string>1 opção</string>
<key>other</key>
<string>%ld opções</string>
</dict>
</dict>
<key>There are ${count} options matching ${visibility}.</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>Existem %#@count_option@ opções correspondentes a ${visibility}.</string>
<key>count_option</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>one</key>
<string>1 opção</string>
<key>other</key>
<string>%ld opções</string>
</dict>
</dict>
</dict>
</plist>

View File

@ -12,8 +12,6 @@
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>zero</key>
<string>%ld options</string>
<key>one</key>
<string>1 option</string>
<key>other</key>
@ -30,8 +28,6 @@
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>zero</key>
<string>%ld options</string>
<key>one</key>
<string>1 option</string>
<key>other</key>

View File

@ -12,7 +12,7 @@
"RHxKOw" = "Send Post with text content";
"RxSqsb" = "Ziņa";
"RxSqsb" = "Post";
"WCIR3D" = "Post ${content} on Mastodon";
@ -34,9 +34,9 @@
"dUyuGg" = "Post on Mastodon";
"dYQ5NN" = "Publisks";
"dYQ5NN" = "Public";
"ehFLjY" = "Tikai sekotājiem";
"ehFLjY" = "Followers Only";
"gfePDu" = "Posting failed. ${failureReason}";

View File

@ -1,51 +0,0 @@
"16wxgf" = "Objavi na Mastodonu";
"751xkl" = "besedilo";
"CsR7G2" = "Objavi na Mastodonu";
"HZSGTr" = "Kakšno vsebino želite objaviti?";
"HdGikU" = "Objava ni uspela";
"KDNTJ4" = "Vzrok za neuspeh";
"RHxKOw" = "Pošlji objavo z besedilom";
"RxSqsb" = "Objavi";
"WCIR3D" = "Objavite ${content} na Mastodonu";
"ZKJSNu" = "Objavi";
"ZS1XaK" = "${content}";
"ZbSjzC" = "Vidnost";
"Zo4jgJ" = "Vidnost objave";
"apSxMG-dYQ5NN" = "Z \"Javno\" se ujema ${count} možnosti.";
"apSxMG-ehFLjY" = "S \"Samo sledilci\" se ujema ${count} možnosti.";
"ayoYEb-dYQ5NN" = "${content}, javno";
"ayoYEb-ehFLjY" = "${content}, samo sledilci";
"dUyuGg" = "Objavi na Mastodonu";
"dYQ5NN" = "Javno";
"ehFLjY" = "Samo sledilci";
"gfePDu" = "Objava je spodletela. ${failureReason}";
"k7dbKQ" = "Uspešno poslana objava.";
"oGiqmY-dYQ5NN" = "Da ne bo nesporazuma - želeli ste \"Javno\"?";
"oGiqmY-ehFLjY" = "Da ne bo nesporazuma - želeli ste \"Samo sledilci\"?";
"rM6dvp" = "URL";
"ryJLwG" = "Uspešno poslana objava. ";

View File

@ -1,46 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>There are ${count} options matching ${content}. - 2</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>Na voljo: %#@count_option@, ki se ujema z "${content}".</string>
<key>count_option</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>one</key>
<string>%ld možnost</string>
<key>two</key>
<string>%ld možnosti</string>
<key>few</key>
<string>%ld možnosti</string>
<key>other</key>
<string>%ld možnosti</string>
</dict>
</dict>
<key>There are ${count} options matching ${visibility}.</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>Na voljo: %#@count_option@, ki se ujema z "${visibility}".</string>
<key>count_option</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>one</key>
<string>%ld možnost</string>
<key>two</key>
<string>%ld možnosti</string>
<key>few</key>
<string>%ld možnosti</string>
<key>other</key>
<string>%ld možnosti</string>
</dict>
</dict>
</dict>
</plist>

View File

@ -1,51 +0,0 @@
"16wxgf" = "Publicera på Mastodon";
"751xkl" = "Textinnehåll";
"CsR7G2" = "Publicera på Mastodon";
"HZSGTr" = "Vilket innehåll ska publiceras?";
"HdGikU" = "Publiceringen misslyckades";
"KDNTJ4" = "Felorsak";
"RHxKOw" = "Skicka inlägg med textinnehåll";
"RxSqsb" = "Inlägg";
"WCIR3D" = "Publicera ${content} på Mastodon";
"ZKJSNu" = "Inlägg";
"ZS1XaK" = "${content}";
"ZbSjzC" = "Synlighet";
"Zo4jgJ" = "Inläggssynlighet";
"apSxMG-dYQ5NN" = "Det finns ${count} alternativ som matchar Offentligt.";
"apSxMG-ehFLjY" = "Det finns ${count} alternativ som matchar Endast följare.";
"ayoYEb-dYQ5NN" = "${content}, Offentligt";
"ayoYEb-ehFLjY" = "${content}, Endast följare";
"dUyuGg" = "Publicera på Mastodon";
"dYQ5NN" = "Offentligt";
"ehFLjY" = "Endast följare";
"gfePDu" = "Kunde inte publicera. ${failureReason}";
"k7dbKQ" = "Inlägget har publicerats.";
"oGiqmY-dYQ5NN" = "Bara för att bekräfta, ville du ha 'Offentligt'?";
"oGiqmY-ehFLjY" = "Bara för att bekräfta, ville du ha 'Endast följare'?";
"rM6dvp" = "URL";
"ryJLwG" = "Inlägget har publicerats. ";

View File

@ -0,0 +1,51 @@
"16wxgf" = "Posta på Mastodon";
"751xkl" = "Textinnehåll";
"CsR7G2" = "Posta på Mastodon";
"HZSGTr" = "Vilket innehåll ska jag posta?";
"HdGikU" = "Inlägget misslyckades";
"KDNTJ4" = "Felorsak";
"RHxKOw" = "Skicka inlägg med textinnehåll";
"RxSqsb" = "Posta";
"WCIR3D" = "Posta ${content} på Mastodon";
"ZKJSNu" = "Posta";
"ZS1XaK" = "${content}";
"ZbSjzC" = "Synlighet";
"Zo4jgJ" = "Inläggssynlighet";
"apSxMG-dYQ5NN" = "Det finns ${count} alternativ som matchar Publikt.";
"apSxMG-ehFLjY" = "Det finns ${count} alternativ som matchar Endast följare.";
"ayoYEb-dYQ5NN" = "${content}, Publikt";
"ayoYEb-ehFLjY" = "${content}, Endast följare";
"dUyuGg" = "Posta på Mastodon";
"dYQ5NN" = "Publikt";
"ehFLjY" = "Endast följare";
"gfePDu" = "Inlägget misslyckades. ${failureReason}";
"k7dbKQ" = "Inlägget har postats.";
"oGiqmY-dYQ5NN" = "Bara för att bekräfta, ville du ha 'Publikt'?";
"oGiqmY-ehFLjY" = "Bara för att bekräfta, ville du ha 'Endast följare'?";
"rM6dvp" = "URL";
"ryJLwG" = "Inlägget har postats. ";

View File

@ -1,46 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>There are ${count} options matching ${content}. - 2</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>There are %#@count_option@ matching ${content}.</string>
<key>count_option</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>one</key>
<string>1 option</string>
<key>few</key>
<string>%ld options</string>
<key>many</key>
<string>%ld options</string>
<key>other</key>
<string>%ld options</string>
</dict>
</dict>
<key>There are ${count} options matching ${visibility}.</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>There are %#@count_option@ matching ${visibility}.</string>
<key>count_option</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>%ld</string>
<key>one</key>
<string>1 option</string>
<key>few</key>
<string>%ld options</string>
<key>many</key>
<string>%ld options</string>
<key>other</key>
<string>%ld options</string>
</dict>
</dict>
</dict>
</plist>

View File

@ -30,7 +30,7 @@
"ayoYEb-dYQ5NN" = "${content}, Công khai";
"ayoYEb-ehFLjY" = "${content}, Chỉ người theo dõi";
"ayoYEb-ehFLjY" = "${content}, Riêng tư";
"dUyuGg" = "Đăng lên Mastodon";

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