New file |
| | |
| | | # |
| | | # Be sure to run `pod spec lint WATwitterImpl.podspec' to ensure this is a |
| | | # valid spec and to remove all comments including this before submitting the spec. |
| | | # |
| | | # To learn more about Podspec attributes see http://docs.cocoapods.org/specification.html |
| | | # To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/ |
| | | # |
| | | |
| | | Pod::Spec.new do |s| |
| | | |
| | | s.name = 'WATwitterImpl' |
| | | s.version = '3.6.4' |
| | | s.summary = 'WATwitterImpl framework in testing environment.' |
| | | s.license = 'MIT' |
| | | s.author = { "Wuyx" => "wuyixin_gh@gamehollywood.com" } |
| | | s.homepage = 'http://repo.wingsdk.cn:8082/summary/WATwitterImpl.git' |
| | | s.source = { :git => "http://admin@repo.wingsdk.cn:8082/r/WATwitterImpl.git" , :tag => s.version} |
| | | s.platform = :ios |
| | | s.ios.deployment_target = "9.0" |
| | | s.vendored_frameworks = 'frameworks/*.framework' |
| | | s.resources = ['config/*.xml','frameworks/TwitterKitResources.bundle','frameworks/TwitterShareExtensionUIResources.bundle'] |
| | | s.requires_arc = true |
| | | s.dependency 'WASdkIntf', '~> 3.6.4' #此处添加私有库依赖 |
| | | s.dependency 'WASdkImpl', '~> 3.6.4' |
| | | end |
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <config> |
| | | <version val="WATwitter3.6.4"/> |
| | | <comps> |
| | | <!-- 公共模块 --> |
| | | <comp module="CORE" plaf="TWITTER" mandatory="YES" value="WATwitterCore" desc="公共模块"/> |
| | | <!-- 用户模块 --> |
| | | <comp module="USR" plaf="TWITTER" mandatory="NO" value="WATwitterUser" desc="Twitter用户账户"/> |
| | | </comps> |
| | | </config> |
New file |
| | |
| | | // |
| | | // TWTRAPIErrorCode.h |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * The NSError domain of errors surfaced by the Twitter API. |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRAPIErrorDomain; |
| | | |
| | | /** |
| | | * Error codes surfaced by the Twitter API. |
| | | * @see https://dev.twitter.com/docs/error-codes-responses |
| | | */ |
| | | typedef NS_ENUM(NSUInteger, TWTRAPIErrorCode) { |
| | | /** |
| | | * Your call could not be completed as dialed. |
| | | */ |
| | | TWTRAPIErrorCodeCouldNotAuthenticate = 32, |
| | | |
| | | /** |
| | | * Corresponds with an HTTP 404 - the specified resource was not found. |
| | | */ |
| | | TWTRAPIErrorCodePageNotExist = 34, |
| | | |
| | | /** |
| | | * Not authorized to use this endpoint. |
| | | */ |
| | | TWTRAPIErrorCodeNotAuthorizedForEndpoint = 37, |
| | | |
| | | /** |
| | | * Generic API error code for invalid parameter |
| | | */ |
| | | TWTRAPIErrorCodeInvalidParameter = 44, |
| | | |
| | | /** |
| | | * Corresponds with an HTTP 403 — the access token being used belongs to a suspended user and they can't complete the action you're trying to take |
| | | */ |
| | | TWTRAPIErrorCodeAccountSuspended = 64, |
| | | |
| | | /** |
| | | * Corresponds to a HTTP request to a retired v1-era URL. |
| | | */ |
| | | TWTRAPIErrorCodeAPIVersionRetired = 68, |
| | | |
| | | /** |
| | | * The request limit for this resource has been reached for the current rate limit window. |
| | | */ |
| | | TWTRAPIErrorCodeRateLimitExceeded = 88, |
| | | |
| | | /** |
| | | * The access token used in the request is incorrect or has expired. Used in API v1.1. |
| | | */ |
| | | TWTRAPIErrorCodeInvalidOrExpiredToken = 89, |
| | | |
| | | /** |
| | | * Only SSL connections are allowed in the API, you should update your request to a secure connection. See [how to connect using SSL](https://dev.twitter.com/docs/security/using-ssl). |
| | | */ |
| | | TWTRAPIErrorCodeSSLInvalid = 92, |
| | | |
| | | /** |
| | | * Corresponds with an HTTP 503 - Twitter is temporarily over capacity. |
| | | */ |
| | | TWTRAPIErrorCodeOverCapacity = 130, |
| | | |
| | | /** |
| | | * Corresponds with an HTTP 500 - An unknown internal error occurred. |
| | | */ |
| | | TWTRAPIErrorCodeInternalError = 131, |
| | | |
| | | /** |
| | | * Corresponds with a HTTP 401 - it means that your oauth_timestamp is either ahead or behind our acceptable range. |
| | | */ |
| | | TWTRAPIErrorCodeCouldNotAuthenticateTimestampOutOfRange = 135, |
| | | |
| | | /** |
| | | * You have already favorited this status. |
| | | */ |
| | | TWTRAPIErrorCodeAlreadyFavorited = 139, |
| | | |
| | | /** |
| | | * Corresponds with HTTP 403 — returned when a user cannot follow another user due to some kind of limit. |
| | | */ |
| | | TWTRAPIErrorCodeCannotFollowOverLimit = 161, |
| | | |
| | | /** |
| | | * Corresponds with HTTP 403 — returned when a Tweet cannot be viewed by the authenticating user, usually due to the Tweet's author having protected their Tweets. |
| | | */ |
| | | TWTRAPIErrorCodeNotAuthorizedToSeeStatus = 179, |
| | | |
| | | /** |
| | | * Corresponds with HTTP 403 — returned when a Tweet cannot be posted due to the user having no allowance remaining to post. Despite the text in the error message indicating that this error is only returned when a daily limit is reached, this error will be returned whenever a posting limitation has been reached. Posting allowances have roaming windows of time of unspecified duration. |
| | | */ |
| | | TWTRAPIErrorCodeOverDailyStatusUpdateLimit = 185, |
| | | |
| | | /** |
| | | * The status text has been Tweeted already by the authenticated account. |
| | | */ |
| | | TWTRAPIErrorCodeStatusIsDuplicate = 187, |
| | | |
| | | /** |
| | | * Typically sent with 1.1 responses with HTTP code 400. The method requires authentication but it was not presented or was wholly invalid. |
| | | */ |
| | | TWTRAPIErrorCodeBadAuthenticationData = 215, |
| | | |
| | | /** |
| | | * We constantly monitor and adjust our filters to block spam and malicious activity on the Twitter platform. These systems are tuned in real-time. If you get this response our systems have flagged the Tweet or DM as possibly fitting this profile. If you feel that the Tweet or DM you attempted to create was flagged in error, please report the details around that to us by filing a ticket at https://support.twitter.com/forms/platform |
| | | */ |
| | | TWTRAPIErrorCodeRequestIsAutomated = 226, |
| | | |
| | | /** |
| | | * Returned as a challenge in xAuth when the user has login verification enabled on their account and needs to be directed to twitter.com to [generate a temporary password](https://twitter.com/settings/applications). |
| | | */ |
| | | TWTRAPIErrorCodeUserMustVerifyLogin = 231, |
| | | |
| | | /** |
| | | * Returned from server in digits sign-in flow if user provides wrong confirmation code |
| | | */ |
| | | TWTRAPIErrorCodeChallengeCodeInvalid = 236, |
| | | |
| | | /** |
| | | * "Bad guest token." The token has probably expired. Try calling `-[Twitter logInGuestWithCompletion:]` again later. |
| | | */ |
| | | TWTRAPIErrorCodeBadGuestToken = 239, |
| | | |
| | | /** |
| | | * Rate limiting case for /1/sdk/login |
| | | */ |
| | | TWTRAPIErrorCodeLoginRateExceeded = 245, |
| | | |
| | | /** |
| | | * Corresponds to a HTTP request to a retired URL. |
| | | */ |
| | | TWTRAPIErrorCodeEndpointRetired = 251, |
| | | |
| | | /** |
| | | * Corresponds with HTTP 403 — returned when the application is restricted from POST, PUT, or DELETE actions. See [How to appeal application suspension and other disciplinary actions](https://support.twitter.com/articles/72585). |
| | | */ |
| | | TWTRAPIErrorCodeApplicationCannotPerformWriteAction = 261, |
| | | |
| | | /** |
| | | * Corresponds with HTTP 403. The authenticated user account cannot mute itself. |
| | | */ |
| | | TWTRAPIErrorCodeCannotMuteSelf = 271, |
| | | |
| | | /** |
| | | * Corresponds with HTTP 403. The authenticated user account is not muting the account a call is attempting to unmute. |
| | | */ |
| | | TWTRAPIErrorCodeCannotMuteSpecifiedUser = 272, |
| | | |
| | | /** |
| | | * Rate limiting case for /1.1/device/register.json endpint |
| | | */ |
| | | TWTRAPIErrorCodeDeviceRegisterRateExceeded = 299, |
| | | |
| | | /** |
| | | * Phone's carrier not suppported and we can not deliver the sms/make the voice call |
| | | */ |
| | | TWTRAPIErrorCodeDeviceCarrierNotSupported = 286, |
| | | |
| | | /** |
| | | * You have already retweeted this tweet. |
| | | */ |
| | | TWTRAPIErrorCodeAlreadyRetweeted = 327, |
| | | |
| | | /** |
| | | * Returned in API v1.1 when a request cannot be served due to the application's rate limit having been exhausted for the resource. See [Rate Limiting in API v1.1](https://dev.twitter.com/docs/rate-limiting/1.1). |
| | | */ |
| | | TWTRAPIErrorCodeTooManyRequests = 429 |
| | | }; |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRAuthConfig.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * Authentication configuration details. Encapsulates credentials required to authenticate a Twitter application. You can obtain your credentials at https://apps.twitter.com/. |
| | | */ |
| | | @interface TWTRAuthConfig : NSObject |
| | | |
| | | /** |
| | | * The consumer key of the Twitter application. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *consumerKey; |
| | | /** |
| | | * The consumer secret of the Twitter application. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *consumerSecret; |
| | | |
| | | /** |
| | | * Returns an `TWTRAuthConfig` object initialized by copying the values from the consumer key and consumer secret. |
| | | * |
| | | * @param consumerKey The consumer key. |
| | | * @param consumerSecret The consumer secret. |
| | | */ |
| | | - (instancetype)initWithConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret; |
| | | |
| | | /** |
| | | * Unavailable. Use `initWithConsumerKey:consumerSecret:` instead. |
| | | */ |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRAuthSession.h |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * The base session which all sessions must conform to. |
| | | */ |
| | | @protocol TWTRBaseSession <NSObject, NSCoding> |
| | | @end |
| | | |
| | | /** |
| | | * Encapsulates the authorization details of an OAuth Session. |
| | | */ |
| | | @protocol TWTRAuthSession <TWTRBaseSession> |
| | | |
| | | @property (nonatomic, readonly, copy) NSString *authToken; |
| | | @property (nonatomic, readonly, copy) NSString *authTokenSecret; |
| | | @property (nonatomic, readonly, copy) NSString *userID; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRConstants.h |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * The NSError domain of errors surfaced by the Twitter SDK. |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRErrorDomain; |
| | | |
| | | /** |
| | | * Error codes surfaced by the Twitter SDK. |
| | | */ |
| | | typedef NS_ENUM(NSInteger, TWTRErrorCode) { |
| | | |
| | | /** |
| | | * Unknown error. |
| | | */ |
| | | TWTRErrorCodeUnknown = -1, |
| | | |
| | | /** |
| | | * Authentication has not been set up yet. You must call -[Twitter logInWithCompletion:] or -[Twitter logInGuestWithCompletion:] |
| | | */ |
| | | TWTRErrorCodeNoAuthentication = 0, |
| | | |
| | | /** |
| | | * Twitter has not been initialized yet. Call +[Fabric with:@[TwitterKit]] or -[Twitter startWithConsumerKey:consumerSecret:]. |
| | | */ |
| | | TWTRErrorCodeNotInitialized = 1, |
| | | |
| | | /** |
| | | * User has declined to grant permission to information such as their email address. |
| | | */ |
| | | TWTRErrorCodeUserDeclinedPermission = 2, |
| | | |
| | | /** |
| | | * User has granted permission to their email address but no address is associated with their account. |
| | | */ |
| | | TWTRErrorCodeUserHasNoEmailAddress = 3, |
| | | |
| | | /** |
| | | * A resource has been requested by ID, but that ID was not found. |
| | | */ |
| | | TWTRErrorCodeInvalidResourceID = 4, |
| | | |
| | | /** |
| | | * A request has been issued for an invalid URL. |
| | | */ |
| | | TWTRErrorCodeInvalidURL = 5, |
| | | |
| | | /** |
| | | * Type mismatch in parsing JSON from the Twitter API. |
| | | */ |
| | | TWTRErrorCodeMismatchedJSONType = 6, |
| | | |
| | | /** |
| | | * Fail to save to keychain. |
| | | */ |
| | | TWTRErrorCodeKeychainSerializationFailure = 7, |
| | | |
| | | /** |
| | | * Fail to save to disk. |
| | | */ |
| | | TWTRErrorCodeDiskSerializationError = 8, |
| | | |
| | | /** |
| | | * Error authenticating with the webview. |
| | | */ |
| | | TWTRErrorCodeWebViewError = 9, |
| | | |
| | | /** |
| | | * A required parameter is missing. |
| | | */ |
| | | TWTRErrorCodeMissingParameter = 10 |
| | | }; |
| | | |
| | | /** |
| | | * The NSError domain of errors surfaced by the Twitter SDK during the login operation. |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRLogInErrorDomain; |
| | | |
| | | /** |
| | | * Error codes surfaced by the Twitter SDK with the `TWTRLogInErrorDomain` error domain. |
| | | */ |
| | | typedef NS_ENUM(NSInteger, TWTRLogInErrorCode) { |
| | | |
| | | /** |
| | | * Unknown error. |
| | | */ |
| | | TWTRLogInErrorCodeUnknown = -1, |
| | | |
| | | /** |
| | | * User denied login. |
| | | */ |
| | | TWTRLogInErrorCodeDenied = 0, |
| | | |
| | | /** |
| | | * User canceled login. |
| | | */ |
| | | TWTRLogInErrorCodeCancelled = 1, |
| | | |
| | | /** |
| | | * No Twitter account found. |
| | | */ |
| | | TWTRLogInErrorCodeNoAccounts = 2, |
| | | |
| | | /** |
| | | * Reverse auth with linked account failed. |
| | | */ |
| | | TWTRLogInErrorCodeReverseAuthFailed = 3, |
| | | |
| | | /** |
| | | * Refreshing session tokens failed. |
| | | */ |
| | | TWTRLogInErrorCodeCannotRefreshSession = 4, |
| | | |
| | | /** |
| | | * No such session or session is not tracked |
| | | * in the associated session store. |
| | | */ |
| | | TWTRLogInErrorCodeSessionNotFound = 5, |
| | | |
| | | /** |
| | | * The login request failed. |
| | | */ |
| | | TWTRLogInErrorCodeFailed = 6, |
| | | |
| | | /** |
| | | * The system account credentials are no longer valid and the |
| | | * user will need to update their credentials in the Settings app. |
| | | */ |
| | | TWTRLogInErrorCodeSystemAccountCredentialsInvalid = 7, |
| | | |
| | | /** |
| | | * There was no Twitter iOS app installed to attemp |
| | | * the Mobile SSO flow. |
| | | */ |
| | | TWTRLoginErrorNoTwitterApp = 8, |
| | | }; |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRCoreOAuthSigning.h |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTROAuthEchoRequestURLStringKey; |
| | | FOUNDATION_EXPORT NSString *const TWTROAuthEchoAuthorizationHeaderKey; |
| | | |
| | | @protocol TWTRCoreOAuthSigning <NSObject> |
| | | |
| | | /** |
| | | * @name OAuth Echo |
| | | */ |
| | | |
| | | /** |
| | | * OAuth Echo is a means to securely delegate OAuth authorization to a third party while interacting with an API. |
| | | * For example, you may wish to verify a user's credentials from your app's server (the third party) rather than your app. |
| | | * This method provides you with the OAuth signature to add to the third party's request to `URLString`, as well as the formed |
| | | * URL with the query string to send that request to. |
| | | * This is equivalent to calling `-URLRequestWithMethod:URL:parameters:error:` and getting the URL and the `Authorization` HTTP header out of the request. |
| | | * |
| | | * @param method Request method, GET, POST, PUT, DELETE, etc. |
| | | * @param URLString The full URL of the Twitter endpoint you plan to send a request to. E.g. https://api.twitter.com/1.1/account/verify_credentials.json |
| | | * @param parameters Request parameters. |
| | | * @param error Error in the `TWTRErrorDomain` domain. The code will be `TWTRErrorCodeInvalidURL` if the `URLString`'s host is not api.twitter.com |
| | | * |
| | | * @return `nil` if there's an error or a missing required parameter, or a dictionary with the fully formed request URL under `TWTROAuthEchoRequestURLStringKey` (`NSString`), and the `Authorization` header in `TWTROAuthEchoAuthorizationHeaderKey` (`NSString`), to be used to sign the request. |
| | | * |
| | | * @see More information about OAuth Echo: https://dev.twitter.com/oauth/echo |
| | | */ |
| | | - (NSDictionary *)OAuthEchoHeadersForRequestMethod:(NSString *)method URLString:(NSString *)URLString parameters:(nullable NSDictionary *)parameters error:(NSError **)error; |
| | | |
| | | /** |
| | | * This method provides you with the OAuth signature, as well as the formed URL with the query string, to send a request to `verify_credentials`. |
| | | * |
| | | * @return A dictionary with the fully formed Request URL under `TWTROAuthEchoRequestURLStringKey` (`NSString`), and the `Authorization` header in `TWTROAuthEchoAuthorizationHeaderKey` (`NSString`), to be used to sign the request. |
| | | * |
| | | * @see More information about OAuth Echo: https://dev.twitter.com/oauth/echo |
| | | * @see More information about Verify Credentials: https://dev.twitter.com/rest/reference/get/account/verify_credentials |
| | | */ |
| | | - (NSDictionary *)OAuthEchoHeadersToVerifyCredentials; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRDefines.h |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #pragma once |
| | | |
| | | #define TWC_STR_HELPER(x) #x |
| | | #define TWC_STR(x) TWC_STR_HELPER(x) |
| | | |
| | | #define IS_UIKIT_AVAILABLE (TARGET_OS_IOS || TARGET_OS_TV) |
| | | #define IS_SOCIAL_ACCOUNTS_AVAILABLE (TARGET_OS_MAC && !TARGET_OS_WATCH && !TARGET_OS_TV) |
New file |
| | |
| | | // |
| | | // TWTRGuestSession.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import <TwitterCore/TWTRAuthSession.h> |
| | | |
| | | @class TWTRGuestSession; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * Completion block called when guest login succeeds or fails. |
| | | * |
| | | * @param guestSession A `TWTRGuestSession` containing the OAuth tokens or nil. |
| | | * @param error Error that will be non nil if the authentication request failed. |
| | | */ |
| | | typedef void (^TWTRGuestLogInCompletion)(TWTRGuestSession *_Nullable guestSession, NSError *_Nullable error); |
| | | |
| | | /** |
| | | * `TWTRGuestSession` represents a guest session authenticated with the Twitter API. See `TWTRSession` for user sessions. |
| | | */ |
| | | @interface TWTRGuestSession : NSObject <TWTRBaseSession> |
| | | |
| | | /** |
| | | * The bearer access token for guest auth. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *accessToken; |
| | | |
| | | /** |
| | | * The guest access token. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *guestToken; |
| | | |
| | | /** |
| | | * This property can be used to make a best guess about whether the token will |
| | | * still be valid or not. |
| | | * |
| | | * Guest tokens expire after a short time interval but |
| | | * the actual interval is not specified. This property will return YES if a sufficient |
| | | * amount of time has passed indicating that the token is probably no longer valid. |
| | | * In most situations you should make a request with the token and see if the API |
| | | * accepts the token or not. |
| | | */ |
| | | @property (nonatomic, readonly) BOOL probablyNeedsRefreshing; |
| | | |
| | | /** |
| | | * Returns an `TWTRGuestSession` object initialized by copying the values from the dictionary or nil if the dictionary is missing. |
| | | * |
| | | * @param sessionDictionary (required) The dictionary received after successfull authentication from Twitter guest-only authentication. |
| | | */ |
| | | - (instancetype)initWithSessionDictionary:(NSDictionary *)sessionDictionary; |
| | | |
| | | /** |
| | | * Returns a `TWTRGuestSession` object |
| | | * |
| | | * @param accessToken the access token |
| | | * @param guestToken the guest access token |
| | | */ |
| | | - (instancetype)initWithAccessToken:(NSString *)accessToken guestToken:(nullable NSString *)guestToken; |
| | | |
| | | /** |
| | | * Unavailable. Use `-initWithSessionDictionary:` instead. |
| | | */ |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRSession.h |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <TwitterCore/TWTRAuthConfig.h> |
| | | #import <TwitterCore/TWTRAuthSession.h> |
| | | #import <TwitterCore/TWTRGuestSession.h> |
| | | |
| | | @class TWTRSession; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * Completion block called when user login succeeds or fails. |
| | | * |
| | | * @param session Contains the OAuth tokens and minimal information associated with the logged in user or nil. |
| | | * @param error Error that will be non nil if the authentication request failed. |
| | | */ |
| | | typedef void (^TWTRLogInCompletion)(TWTRSession *_Nullable session, NSError *_Nullable error); |
| | | |
| | | /** |
| | | * TWTRSession represents a user's session authenticated with the Twitter API. |
| | | */ |
| | | @interface TWTRSession : NSObject <TWTRAuthSession> |
| | | |
| | | /** |
| | | * The authorization token. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *authToken; |
| | | /** |
| | | * The authorization token secret. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *authTokenSecret; |
| | | /** |
| | | * The username associated with the access token. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *userName; |
| | | /** |
| | | * The user ID associated with the access token. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *userID; |
| | | |
| | | /** |
| | | * Returns an `TWTRSession` object initialized by copying the values from the dictionary or nil if the dictionary is missing. |
| | | * |
| | | * @param sessionDictionary (required) The dictionary received after successfull authentication from Twitter OAuth. |
| | | */ |
| | | - (instancetype)initWithSessionDictionary:(NSDictionary *)sessionDictionary; |
| | | |
| | | /** |
| | | * Returns a `TWTRSession` object initialized by copying the values |
| | | * from the dictionary returned from a Mobile SSO redirect URL. |
| | | * |
| | | * @param authDictionary (required) The dictionary received after successful |
| | | * authentication from Twitter Mobile SSO. |
| | | */ |
| | | - (instancetype)initWithSSOResponse:(NSDictionary *)authDictionary; |
| | | |
| | | /** |
| | | * Returns an `TWTRSession` object initialized by copying the given tokens and user info. |
| | | * |
| | | * @param authToken (required) The authorization token for the session |
| | | * @param authTokenSecret (required) The authorization token secret for the session |
| | | * @param userName (required) The username for the user associated with the session. |
| | | * @param userID (required) The unique ID for the user associated with the session. |
| | | * |
| | | * @return A `TWTRSession` object initialized with the provided parameters. |
| | | */ |
| | | - (instancetype)initWithAuthToken:(NSString *)authToken authTokenSecret:(NSString *)authTokenSecret userName:(NSString *)userName userID:(NSString *)userID NS_DESIGNATED_INITIALIZER; |
| | | |
| | | /** |
| | | * Unavailable. Use -initWithSessionDictionary: instead. |
| | | */ |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRSessionStore.h |
| | | // TwitterCore |
| | | // |
| | | // Copyright (c) 2015 Twitter Inc. All rights reserved. |
| | | // |
| | | |
| | | @class TWTRAuthConfig; |
| | | @class TWTRGuestSession; |
| | | @class TWTRSession; |
| | | @protocol TWTRAuthSession; |
| | | @protocol TWTRAPIServiceConfig; |
| | | @protocol TWTRErrorLogger; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | #pragma mark - TWTRSessionRefreshingStore Protocol |
| | | |
| | | /** |
| | | * Completion block called when a session refresh succeeds or fails. |
| | | * |
| | | * @param refreshedSession The refreshed session |
| | | * @param error Error that will be non nil if the refresh request failed |
| | | */ |
| | | typedef void (^TWTRSessionStoreRefreshCompletion)(id _Nullable refreshedSession, NSError *_Nullable error); |
| | | |
| | | /** |
| | | * Protocol for session stores that can refresh expired sessions. |
| | | */ |
| | | @protocol TWTRSessionRefreshingStore <NSObject> |
| | | |
| | | /** |
| | | * Refresh an expired session. |
| | | * |
| | | * @param sessionClass The class of the session |
| | | * @param sessionID ID of the session wherever applicable e.g. `userID` if it's a user session. |
| | | * @param completion The completion block to call when the refresh request succeeds or fails. |
| | | */ |
| | | - (void)refreshSessionClass:(Class)sessionClass sessionID:(nullable NSString *)sessionID completion:(TWTRSessionStoreRefreshCompletion)completion; |
| | | |
| | | /** |
| | | * Determines whether the given session has expired. |
| | | * |
| | | * @param session The session to check for expiration |
| | | * @param response API request response to check for expiration |
| | | * |
| | | * @return Whether the session has expired. |
| | | */ |
| | | - (BOOL)isExpiredSession:(id)session response:(NSHTTPURLResponse *)response; |
| | | |
| | | /** |
| | | * Determines whether the given session has expired based on a given error. |
| | | * |
| | | * @param session The session to check for expiration |
| | | * @param error API request error to check for expiration |
| | | * |
| | | * @return Whether the session has expired. |
| | | */ |
| | | - (BOOL)isExpiredSession:(id)session error:(NSError *)error; |
| | | |
| | | @end |
| | | |
| | | #pragma mark - TWTRUserSessionStore Protocol |
| | | |
| | | /** |
| | | * Completion block called when a user session saved to the session store or fails. |
| | | * |
| | | * @param session The saved session |
| | | * @param error Error that will be non nil if the save request fails. |
| | | */ |
| | | typedef void (^TWTRSessionStoreSaveCompletion)(id<TWTRAuthSession> _Nullable session, NSError *_Nullable error); |
| | | |
| | | /** |
| | | * Completion block called when fetching all stored user sessions completes or fails. |
| | | * |
| | | * @param sessions All stored user sessions or empty array if there are no user sessions found. |
| | | */ |
| | | typedef void (^TWTRSessionStoreBatchFetchCompletion)(NSArray *sessions); |
| | | |
| | | /** |
| | | * Completion block to call when the session is deleted or fails. |
| | | * |
| | | * @param session The deleted session or nil if none was found for the user. |
| | | */ |
| | | typedef void (^TWTRSessionStoreDeleteCompletion)(id<TWTRAuthSession> _Nullable session); |
| | | |
| | | /** |
| | | * Protocol for session store that manages user sessions. |
| | | */ |
| | | @protocol TWTRUserSessionStore <NSObject> |
| | | |
| | | /** |
| | | * Saves the existing session to the store after validations. |
| | | * |
| | | * @param session The user session to save |
| | | * @param completion Completion block to call when the save request succeeds or fails |
| | | */ |
| | | - (void)saveSession:(id<TWTRAuthSession>)session completion:(TWTRSessionStoreSaveCompletion)completion; |
| | | |
| | | /** |
| | | * Fetches the user session for for the given auth tokens and saves it to the store after validations. |
| | | * |
| | | * @param authToken The existing authToken to use for authentication. |
| | | * @param authTokenSecret The existing authTokenSecret to use for authentication. |
| | | * @param completion Completion block to call when the save request succeeds or fails |
| | | */ |
| | | - (void)saveSessionWithAuthToken:(NSString *)authToken authTokenSecret:(NSString *)authTokenSecret completion:(TWTRSessionStoreSaveCompletion)completion; |
| | | |
| | | /** |
| | | * Checks to see if the user is logged in and has a saved session. |
| | | * |
| | | * @param userID The user ID to fetch session for. |
| | | */ |
| | | - (nullable id<TWTRAuthSession>)sessionForUserID:(NSString *)userID; |
| | | |
| | | /** |
| | | * Retrieve all logged in user sessions in ascending order of last saved date |
| | | * |
| | | * @note This is a blocking call. |
| | | */ |
| | | - (NSArray *)existingUserSessions; |
| | | |
| | | - (BOOL)hasLoggedInUsers; |
| | | |
| | | /** |
| | | * Retrieves the last logged in user session. |
| | | * |
| | | * @return The last logged in user session. |
| | | */ |
| | | - (nullable id<TWTRAuthSession>)session; |
| | | |
| | | /** |
| | | * Deletes the local Twitter user session from this app. This will not remove the system Twitter account nor make a network request to invalidate the session. |
| | | * |
| | | * @param userID ID of the user to log out |
| | | */ |
| | | - (void)logOutUserID:(NSString *)userID; |
| | | |
| | | @end |
| | | |
| | | #pragma mark - TWTRGuestSessionStore Protocol |
| | | |
| | | /** |
| | | * Completion block called when retrieving a guest session succeeds or fails. |
| | | * |
| | | * @param guestSession The retrieved guest session |
| | | * @param error Error that will be non nil if the save request fails. |
| | | */ |
| | | typedef void (^TWTRSessionGuestLogInCompletion)(TWTRGuestSession *_Nullable guestSession, NSError *_Nullable error); |
| | | |
| | | /** |
| | | * Protocol for session stores that can manage guest sessions. |
| | | */ |
| | | @protocol TWTRGuestSessionStore <NSObject> |
| | | |
| | | /** |
| | | * Log in as a guest user and return the guest session. This can be used when the user is not a Twitter user. |
| | | * |
| | | * @param completion Completion block to call when the authentication succeeds or fails. |
| | | * |
| | | * @warning This method assumes your application, as indicated by the `consumerKey` and `consumerSecret` in the `authConfig`, has been whitelisted for guest authentication. |
| | | */ |
| | | - (void)fetchGuestSessionWithCompletion:(TWTRSessionGuestLogInCompletion)completion; |
| | | |
| | | @end |
| | | |
| | | #pragma mark - Composite TWTRSessionStore Protocol |
| | | |
| | | /** |
| | | * Convenience composite protocol of a store that handles user, guest, and refreshable sessions. |
| | | */ |
| | | @protocol TWTRSessionStore <TWTRUserSessionStore, TWTRGuestSessionStore, TWTRSessionRefreshingStore> |
| | | |
| | | /** |
| | | * Returns the store's auth config. |
| | | */ |
| | | @property (nonatomic, readonly) TWTRAuthConfig *authConfig; |
| | | |
| | | @end |
| | | |
| | | #pragma mark - Concrete Session Store Class |
| | | |
| | | /** |
| | | * Concrete implementation of <TWTRSessionStore>. This session store supports fetching and storage of |
| | | * user and guest sessions. In addition, the session store also supports refreshing of such sessions when they expire. |
| | | * |
| | | * @warning Instances of the session manager at the same path are not synchronized. The session store |
| | | * will simply choose the latest version in the case of conflicts. |
| | | */ |
| | | @interface TWTRSessionStore : NSObject <TWTRSessionStore> |
| | | |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | /** |
| | | * Provides a mechanism for reloading the session store. This method will force the session store |
| | | * to find any sessions that may have been saved by another session store or application that is |
| | | * using the same keychain access groups. |
| | | * |
| | | * Most applications will not need to call this method. You may need to call this method if you are |
| | | * using multiple stores within your application and you need to synchronize when one writes to the |
| | | * store. The more likely case for needing to call this method is if you are sharing credentials |
| | | * between applications. In this situation you will want to call this method when the application |
| | | * comes back to the foreground. |
| | | * |
| | | * This method does not need to be called when the store is created because this process happens |
| | | * by default at time of instantiation. |
| | | * |
| | | * You should avoid calling this method if you do not have a specific reason to do so, like the reasons |
| | | * mentioned above as this method does cause disk I/O and multiple calls can cause performance problems. |
| | | */ |
| | | - (void)reloadSessionStore; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TwitterCore.h |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #if !TARGET_OS_TV |
| | | #import <Accounts/Accounts.h> |
| | | #endif |
| | | #import <CoreData/CoreData.h> |
| | | #if !TARGET_OS_TV |
| | | #import <Social/Social.h> |
| | | #endif |
| | | #import "TWTRDefines.h" |
| | | |
| | | #if IS_UIKIT_AVAILABLE |
| | | #import <UIKit/UIKit.h> |
| | | #else |
| | | #import <Cocoa/Cocoa.h> |
| | | #endif |
| | | |
| | | #if __IPHONE_OS_VERSION_MIN_REQUIRED < 80000 |
| | | #error "TwitterCore doesn't support iOS 7.x and lower. Please, change your minimum deployment target to iOS 8.0" |
| | | #endif |
| | | |
| | | #import "TWTRAPIErrorCode.h" |
| | | #import "TWTRAuthConfig.h" |
| | | #import "TWTRAuthSession.h" |
| | | #import "TWTRConstants.h" |
| | | #import "TWTRCoreOAuthSigning.h" |
| | | #import "TWTRGuestSession.h" |
| | | #import "TWTRSession.h" |
| | | #import "TWTRSessionStore.h" |
New file |
| | |
| | | framework module TwitterCore { |
| | | umbrella header "TwitterCore.h" |
| | | |
| | | export * |
| | | module * { export * } |
| | | } |
New file |
| | |
| | | explicit module TwitterCore.Private { |
| | | } |
New file |
| | |
| | | // |
| | | // TFSScribe.h |
| | | // TFSScribe |
| | | // |
| | | // Created by Tanner Oakes on 10/10/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | #ifndef NS_DESIGNATED_INITIALIZER |
| | | #define NS_DESIGNATED_INITIALIZER __attribute((objc_designated_initializer)) |
| | | #endif |
| | | |
| | | FOUNDATION_EXTERN NSString *const TFSScribeDebugPreferencesKey; |
| | | |
| | | FOUNDATION_EXTERN NSString *const TFSScribeEventNotification; // Triggered when the scribe API call returns |
| | | FOUNDATION_EXTERN NSString *const TFSScribeFlushNotification; // Triggered after scribe flush |
| | | FOUNDATION_EXTERN NSString *const TFSScribeFlushTokenInfoKey; // Key in userInfo dictionary corresponding to the token used in the flush request. |
| | | |
| | | FOUNDATION_EXTERN const NSInteger TFSScribeServiceUpdateValue; |
| | | |
| | | /** |
| | | * Result of handling outgoing scribe events. |
| | | */ |
| | | typedef NS_ENUM(NSUInteger, TFSScribeServiceRequestDisposition) { |
| | | /** |
| | | * Indicates that the outgoing events were handled successfully. |
| | | */ |
| | | TFSScribeServiceRequestDispositionSuccess, |
| | | /** |
| | | * Indicates that handling failed due to a client side problem, such as a network |
| | | * timeout or the request being cancelled. |
| | | */ |
| | | TFSScribeServiceRequestDispositionClientError, |
| | | /** |
| | | * Indicates that handling failed due to the server rejecting the sent data. |
| | | */ |
| | | TFSScribeServiceRequestDispositionServerError, |
| | | }; |
| | | |
| | | /** |
| | | * Object representing a scribe event. These methods must be thread safe. |
| | | */ |
| | | @protocol TFSScribeEventParameters <NSObject> |
| | | |
| | | /** |
| | | * Binary representation of the scribe event. This is what will be kept in |
| | | * the store and returned when flush is called. |
| | | */ |
| | | - (NSData *)data; |
| | | /** |
| | | * Dictionary representation of the event used for logging purposes. |
| | | */ |
| | | - (NSDictionary *)dictionaryRepresentation; |
| | | /** |
| | | * User ID of event |
| | | */ |
| | | - (NSString *)userID; |
| | | |
| | | @end |
| | | |
| | | @class TFSScribe; |
| | | |
| | | @protocol TFSScribeErrorDelegate <NSObject> |
| | | |
| | | /** |
| | | * Scribe will call this method on an arbitrary queue if it encounters |
| | | * an internal error. |
| | | */ |
| | | - (void)scribeService:(TFSScribe *)service didEncounterError:(NSError *)error; |
| | | |
| | | @end |
| | | |
| | | typedef void (^TFSScribeRequestBatchedImpressionEventBlock)(id<TFSScribeEventParameters> scribeEventParameters); |
| | | typedef void (^TFSScribeRequestCompletionBlock)(TFSScribeServiceRequestDisposition disposition); |
| | | |
| | | @protocol TFSScribeRequestHandler <NSObject> |
| | | |
| | | /** |
| | | * TFSScribe will call this method once it has prepared all of the outgoing events. |
| | | * This method will be called on a background queue. |
| | | * |
| | | * @param outgoingEvents Prepared outgoing events |
| | | * @param userID User ID to send events for. Must not be nil. |
| | | * @param completionHandler Execute the completion block once the events have been handled with the appropriate disposition. The completion block can be executed on any queue. |
| | | */ |
| | | - (void)handleScribeOutgoingEvents:(NSString *)outgoingEvents userID:(NSString *)userID completionHandler:(TFSScribeRequestCompletionBlock)completionHandler; |
| | | |
| | | @optional |
| | | |
| | | /** |
| | | * When flushing a user ID, this method will be called with an array of impressions |
| | | * for you to batch. After the method is executed, the impressions will be deleted |
| | | * from the store. If this method is not implemented, impressions will still be |
| | | * deleted. |
| | | * |
| | | * @param impressions Array of TFSScribeImpressions objects. |
| | | * @param batchedHandler Call the batchedHandler block for each event data you generate from the impressions. |
| | | */ |
| | | - (void)handleImpressionsBatch:(NSArray *)impressions batchedImpressionHandler:(TFSScribeRequestBatchedImpressionEventBlock)batchedHandler; |
| | | |
| | | @end |
| | | |
| | | @interface TFSScribe : NSObject |
| | | |
| | | @property (nonatomic, weak) id<TFSScribeErrorDelegate> errorDelegate; |
| | | |
| | | + (BOOL)isDebugEnabled; |
| | | + (void)setDebugEnabled:(BOOL)enabled; |
| | | |
| | | /** |
| | | * Init the scribe. |
| | | * |
| | | * @param storeURL File URL to store the persisted data. Pass nil to use an in-memory store. |
| | | */ |
| | | - (instancetype)initWithStoreURL:(NSURL *)storeURL; |
| | | |
| | | /** |
| | | * Init the scribe. |
| | | * |
| | | * @param storeURL File URL to store the persisted data. Pass nil to use an in-memory store. |
| | | * @param modelURL File URL to the location of the mom on disk. Not necessary if you are using the framework, or if your mom is in the mainBundle. |
| | | */ |
| | | - (instancetype)initWithStoreURL:(NSURL *)storeURL modelURL:(NSURL *)modelURL NS_DESIGNATED_INITIALIZER; |
| | | |
| | | /** |
| | | * Opens the scribe asynchronously. |
| | | */ |
| | | - (void)open; |
| | | |
| | | /** |
| | | * Opens the scribe asynchronously. |
| | | * |
| | | * @param startBlock Block will be executed on a background queue immediately prior to opening. Can be nil. |
| | | * @param completionBlock Block will be executed on a background queue immediately after opening. Can be nil. |
| | | */ |
| | | - (void)openWithStartBlock:(dispatch_block_t)startBlock completionBlock:(dispatch_block_t)completionBlock; |
| | | |
| | | /** |
| | | * Closes the scribe asynchronously. |
| | | */ |
| | | - (void)close; |
| | | |
| | | /** |
| | | * Closes the scribe asynchronously. |
| | | * |
| | | * @param startBlock Block will be executed on a background queue immediately prior to closing. Can be nil. |
| | | * @param completionBlock Block will be executed on a background queue immediately after closing. Can be nil. |
| | | */ |
| | | - (void)closeWithStartBlock:(dispatch_block_t)startBlock completionBlock:(dispatch_block_t)completionBlock; |
| | | |
| | | /** |
| | | * Suspend the scribe's internal background queue. This could be used to improve scrolling performance on older devices. |
| | | */ |
| | | - (void)suspend; |
| | | /** |
| | | * Resume the scribe's internal background queue. |
| | | */ |
| | | - (void)resume; |
| | | |
| | | /** |
| | | * Flush all events for the given userID. If no events or impressions exist |
| | | * |
| | | * @param userID User ID to flush events for. Must not be nil. |
| | | * @param requestHandler Once the events have been prepared, the request handler will be called to handle the events. Must not be nil. |
| | | */ |
| | | - (void)flushUserID:(NSString *)userID requestHandler:(id<TFSScribeRequestHandler>)requestHandler; |
| | | |
| | | /** |
| | | * Flush all events for the given userID. |
| | | * |
| | | * @param userID User ID to flush events for. Must not be nil. |
| | | * @param token A token to be included with notification userInfo dictionaries. |
| | | * @param requestHandler Once the events have been prepared, the request handler will be called to handle the events. Must not be nil. |
| | | */ |
| | | - (void)flushUserID:(NSString *)userID token:(NSString *)token requestHandler:(id<TFSScribeRequestHandler>)requestHandler; |
| | | |
| | | /** |
| | | * Delete all events for the given userID. Events for user ID of 0 (anonymous user) will not be deleted. |
| | | */ |
| | | - (void)deleteUserID:(NSString *)userID; |
| | | |
| | | /** |
| | | * Schedule an event to be added to scribe. |
| | | */ |
| | | - (void)enqueueEvent:(id<TFSScribeEventParameters>)eventParameters; |
| | | |
| | | /** |
| | | * Schedule an impression to be added to scribe. |
| | | */ |
| | | - (void)enqueueImpression:(NSData *)contentData eventName:(NSString *)eventName query:(NSString *)query clientVersion:(NSString *)clientVersion userID:(NSString *)userID; |
| | | |
| | | #if UIAUTOMATION |
| | | - (void)clearScribeDatabase; |
| | | #endif |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRAPIConstants.h |
| | | // |
| | | // Created by Kang Chen on 3/25/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRAPIConstantsParamID; |
| | | FOUNDATION_EXPORT NSString *const TWTRAPIConstantsFieldID; |
| | | FOUNDATION_EXPORT NSString *const TWTRAPIConstantsFieldIDString; |
New file |
| | |
| | | // |
| | | // TWTRAPIConstantsUser.h |
| | | // |
| | | // Created by Jacob Harding on 6/9/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRAPIConstantsUserShowURL; |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRAPIConstantsVerifyCredentialsURL; |
| | | |
| | | // parameters |
| | | FOUNDATION_EXPORT NSString *const TWTRAPIConstantsUserParamUserID; |
| | | FOUNDATION_EXPORT NSString *const TWTRAPIConstantsUserParamIncludeEmail; |
| | | FOUNDATION_EXPORT NSString *const TWTRAPIConstantsUserParamSkipStatus; |
New file |
| | |
| | | // |
| | | // TWTRAPINetworkErrorsShim.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Kang Chen on 1/15/15. |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import "TWTRNetworkingPipeline.h" |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | Abstraction around the Twitter REST API networking response validation and errors to handle various |
| | | quirks of the API. |
| | | */ |
| | | @interface TWTRAPINetworkErrorsShim : NSObject |
| | | |
| | | /** |
| | | * @param response response from the API request |
| | | * @param responseData data from the request response |
| | | */ |
| | | - (instancetype)initWithHTTPResponse:(NSURLResponse *)response responseData:(NSData *)responseData NS_DESIGNATED_INITIALIZER; |
| | | |
| | | - (instancetype)init __unavailable; |
| | | /** |
| | | * Validates the error response while taking into account some Twitter-specific quirks. |
| | | * |
| | | * @return the normalized error if there was something to surface from either the HTTP response |
| | | * or API response |
| | | */ |
| | | |
| | | - (nullable NSError *)validate; |
| | | |
| | | @end |
| | | |
| | | /// This class just simply wraps the TWTRAPINetworkErrorsShim class so that we can use |
| | | /// something that conforms to the TWTRNetworkingResponseValidating. It simply creates |
| | | /// an instance of TWTRAPINetworkErrorsShim for each validation call. Eventually, the |
| | | /// TWTRAPINetworkErrorsShim class can be removed or hidden. |
| | | @interface TWTRAPIResponseValidator : NSObject <TWTRNetworkingResponseValidating> |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRAPIServiceConfig.h |
| | | // TwitterCore |
| | | // |
| | | // Copyright (c) 2015 Twitter Inc. All rights reserved. |
| | | // |
| | | |
| | | @protocol TWTRAPIServiceConfig <NSObject> |
| | | |
| | | @property (nonatomic, readonly, copy) NSString *apiHost; |
| | | @property (nonatomic, readonly, copy) NSString *apiScheme; |
| | | |
| | | /** |
| | | * A unique name to assign to this service. It is recommended |
| | | * that reverse dns be used to make the name unique. |
| | | */ |
| | | @property (nonatomic, readonly, copy) NSString *serviceName; |
| | | |
| | | @end |
| | | |
| | | FOUNDATION_EXPORT NSURL *TWTRAPIURLWithPath(id<TWTRAPIServiceConfig> apiServiceConfig, NSString *path); |
| | | |
| | | FOUNDATION_EXPORT NSURL *TWTRAPIURLWithParams(id<TWTRAPIServiceConfig> apiServiceConfig, NSString *path, NSDictionary *params); |
New file |
| | |
| | | // |
| | | // TWTRAPIServiceConfigRegistry.h |
| | | // TwitterCore |
| | | // |
| | | // Created by Chase Latta on 8/18/15. |
| | | // Copyright (c) 2015 Twitter Inc. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import "TWTRAPIServiceConfig.h" |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | typedef NS_ENUM(NSInteger, TWTRAPIServiceConfigType) { TWTRAPIServiceConfigTypeDefault, TWTRAPIServiceConfigTypeCards, TWTRAPIServiceConfigTypeUpload }; |
| | | |
| | | @interface TWTRAPIServiceConfigRegistry : NSObject |
| | | |
| | | /** |
| | | * Returns the default registry instance. |
| | | */ |
| | | + (instancetype)defaultRegistry; |
| | | |
| | | /** |
| | | * Registers a service config with the receiver. |
| | | * |
| | | * @param config the config object to register. |
| | | * @param type the type of config object to register. |
| | | */ |
| | | - (void)registerServiceConfig:(id<TWTRAPIServiceConfig>)config forType:(TWTRAPIServiceConfigType)type; |
| | | |
| | | /** |
| | | * Returns a config object that has been registered for the given type or nil if nothing has been registered. |
| | | */ |
| | | - (nullable id<TWTRAPIServiceConfig>)configForType:(TWTRAPIServiceConfigType)type; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRAppAuthProvider.h |
| | | // |
| | | // Created by Alden Keefe Sampson on 4/2/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import "TWTRAuthenticationProvider.h" |
| | | |
| | | @class TWTRAuthConfig; |
| | | @protocol TWTRAPIServiceConfig; |
| | | |
| | | @interface TWTRAppAuthProvider : TWTRAuthenticationProvider |
| | | |
| | | - (instancetype)init __unavailable; |
| | | |
| | | - (instancetype)initWithAuthConfig:(TWTRAuthConfig *)authConfig apiServiceConfig:(id<TWTRAPIServiceConfig>)apiServiceConfig; |
| | | |
| | | /** |
| | | * Authenticate with App Auth |
| | | * |
| | | * @param completion (required) The completion that will be called upon success or error. |
| | | * Will be called on an arbitrary queue. |
| | | */ |
| | | - (void)authenticateWithCompletion:(TWTRAuthenticationProviderCompletion)completion; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRAppInstallationUUID.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Joey Carmello on 3/27/15. |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | @interface TWTRAppInstallationUUID : NSObject |
| | | |
| | | + (NSString *)appInstallationUUID; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRAppleSocialAuthenticaticationProvider.h |
| | | // TWTRAuthentication |
| | | // |
| | | // Created by Mustafa Furniturewala on 2/7/14. |
| | | // Copyright (c) 2014 Mustafa Furniturewala. All rights reserved. |
| | | // |
| | | |
| | | #import "TWTRAuthenticationProvider.h" |
| | | |
| | | @class TWTRAuthConfig; |
| | | @protocol TWTRErrorLogger; |
| | | @protocol TWTRAPIServiceConfig; |
| | | |
| | | __TVOS_UNAVAILABLE @interface TWTRAppleSocialAuthenticaticationProvider : TWTRAuthenticationProvider |
| | | |
| | | - |
| | | (instancetype)init __unavailable; |
| | | |
| | | - (instancetype)initWithAuthConfig:(TWTRAuthConfig *)authConfig apiServiceConfig:(id<TWTRAPIServiceConfig>)apiServiceConfig errorLogger:(id<TWTRErrorLogger>)errorLogger; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRAssertionMacros.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Kang Chen on 3/5/15. |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <TwitterCore/TWTRConstants.h> |
| | | |
| | | #ifdef __OBJC__ |
| | | |
| | | #define TWTRParameterAssertSettingError(condition, errorPointer) \ |
| | | NSParameterAssert((condition)); \ |
| | | if (!(condition)) { \ |
| | | NSLog(@"[TwitterKit] %@ Invalid parameter not satisfying: %s", NSStringFromSelector(_cmd), #condition); \ |
| | | if (errorPointer != NULL) { \ |
| | | *errorPointer = [NSError errorWithDomain:TWTRErrorDomain code:TWTRErrorCodeMissingParameter userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Missing parameter %s", #condition]}]; \ |
| | | } \ |
| | | } |
| | | |
| | | #define TWTRParameterAssertOrReturnValue(condition, returnValue) \ |
| | | NSParameterAssert((condition)); \ |
| | | if (!(condition)) { \ |
| | | NSLog(@"[TwitterKit] %@ Invalid parameter not satisfying: %s", NSStringFromSelector(_cmd), #condition); \ |
| | | return returnValue; \ |
| | | } |
| | | |
| | | #define TWTRParameterAssertOrReturnNil(condition) \ |
| | | NSParameterAssert((condition)); \ |
| | | if (!(condition)) { \ |
| | | NSLog(@"[TwitterKit] %@ Invalid parameter not satisfying: %s", NSStringFromSelector(_cmd), #condition); \ |
| | | return nil; \ |
| | | } |
| | | |
| | | #define TWTRParameterAssertOrReturn(condition) \ |
| | | NSParameterAssert((condition)); \ |
| | | if (!(condition)) { \ |
| | | NSLog(@"[TwitterKit] %@ Invalid parameter not satisfying: %s", NSStringFromSelector(_cmd), #condition); \ |
| | | return; \ |
| | | } |
| | | |
| | | #define TWTRAssertMainThread() \ |
| | | if (![NSThread isMainThread]) { \ |
| | | [NSException raise:NSInternalInconsistencyException format:@"Need to be on the main thread."]; \ |
| | | return; \ |
| | | } |
| | | |
| | | // Check a single argument, and call a completion block if it's missing |
| | | #define TWTRCheckArgumentWithCompletion(condition, completion) \ |
| | | TWTRParameterAssertOrReturn(completion); \ |
| | | NSError *parameterError; \ |
| | | TWTRParameterAssertSettingError((condition), ¶meterError); \ |
| | | if (parameterError) { \ |
| | | completion(nil, nil, parameterError); \ |
| | | return; \ |
| | | } |
| | | |
| | | #define TWTRCheckArgumentWithCompletion2(condition, completion) \ |
| | | TWTRParameterAssertOrReturn(completion); \ |
| | | NSError *parameterError; \ |
| | | TWTRParameterAssertSettingError((condition), ¶meterError); \ |
| | | if (parameterError) { \ |
| | | completion(nil, parameterError); \ |
| | | return; \ |
| | | } |
| | | |
| | | #endif |
New file |
| | |
| | | // |
| | | // TWTRAuthConfigSessionsValidator.h |
| | | // TwitterCore |
| | | // |
| | | // Created by Chase Latta on 10/8/15. |
| | | // Copyright © 2015 Twitter Inc. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | @class TWTRAuthConfig; |
| | | @class TWTRAuthConfigStore; |
| | | @protocol TWTRSessionStore_Private; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | @interface TWTRAuthConfigSessionsValidator : NSObject |
| | | |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | - (instancetype)initWithConfigStore:(TWTRAuthConfigStore *)configStore sessionStore:(id<TWTRSessionStore_Private>)sessionStore; |
| | | |
| | | /** |
| | | * Calling this method will check that the auth config used by the |
| | | * session store matches the config stored in the config store. |
| | | * If they do not match it will clear the sessions from the session store. |
| | | * It will then store the session store's config in the config store. |
| | | * @note If the config store does not have a saved auth config the store will not be purged. If we did not do this all users would be logged out the first time this validator is used. |
| | | */ |
| | | - (void)validateSessionStoreContainsValidAuthConfig; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRAuthConfigStore.h |
| | | // TwitterCore |
| | | // |
| | | // Created by Chase Latta on 10/8/15. |
| | | // Copyright © 2015 Twitter Inc. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | @class TWTRAuthConfig; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | @interface TWTRAuthConfigStore : NSObject |
| | | |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | /** |
| | | * Initializes the auth config store |
| | | * |
| | | * @param nameSpace the namespace to associate with this store. |
| | | */ |
| | | - (instancetype)initWithNameSpace:(NSString *)nameSpace; |
| | | |
| | | /** |
| | | * Saves the given auth config replacing the last saved config. |
| | | */ |
| | | - (void)saveAuthConfig:(TWTRAuthConfig *)authConfig; |
| | | |
| | | /** |
| | | * Returns the auth config object that was last saved or nil |
| | | * if there is none. |
| | | */ |
| | | - (nullable TWTRAuthConfig *)lastSavedAuthConfig; |
| | | |
| | | /** |
| | | * Removes the last saved auth config. |
| | | */ |
| | | - (void)forgetAuthConfig; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRAuthenticationConstants.h |
| | | // TWTRAuthentication |
| | | // |
| | | // Created by Mustafa Furniturewala on 2/5/14. |
| | | // Copyright (c) 2014 Mustafa Furniturewala. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | #pragma mark Twitter API |
| | | FOUNDATION_EXPORT NSString *const TWTRTwitterDomain; |
| | | |
| | | #pragma mark - Authentication |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthDirectoryLegacyName; |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthDirectoryName; |
| | | FOUNDATION_EXPORT NSString *const TWTRSDKScheme; |
| | | FOUNDATION_EXPORT NSString *const TWTRSDKRedirectHost; |
| | | |
| | | #pragma mark - Paths |
| | | FOUNDATION_EXPORT NSString *const TWTRTwitterRequestTokenPath; |
| | | FOUNDATION_EXPORT NSString *const TWTRTwitterAuthenticatePath; |
| | | FOUNDATION_EXPORT NSString *const TWTRTwitterAccessTokenPath; |
| | | FOUNDATION_EXPORT NSString *const TWTRAppAuthTokenPath; |
| | | FOUNDATION_EXPORT NSString *const TWTRGuestAuthTokenPath; |
| | | |
| | | #pragma mark - OAuth strings |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthOAuthTokenKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthOAuthSecretKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthAppOAuthTokenKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRGuestAuthOAuthTokenKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthAppOAuthUserIDKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthAppOAuthScreenNameKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthAppOAuthVerifierKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthAppOAuthDeniedKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthAppOAuthAppKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthAppOAuthCallbackConfirmKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthAppOAuthCallbackKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthTokenTypeKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthTokenKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthSecretKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthUsernameKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthTokenSeparator; |
| | | |
| | | #pragma mark - HTTP Headers |
| | | FOUNDATION_EXPORT NSString *const TWTRAuthorizationHeaderField; |
| | | FOUNDATION_EXPORT NSString *const TWTRGuestTokenHeaderField; |
| | | |
| | | #pragma mark - Resources |
| | | FOUNDATION_EXPORT NSString *const TWTRLoginButtonImageLocation; |
| | | |
| | | #pragma mark - Errors |
| | | FOUNDATION_EXPORT NSString *const TWTRMissingAccessTokenMsg; |
| | | |
| | | typedef NS_ENUM(NSInteger, TWTRAuthType) { |
| | | TWTRAuthTypeApp = 1, |
| | | |
| | | TWTRAuthTypeGuest = 2, |
| | | |
| | | TWTRAuthTypeUser = 3 |
| | | }; |
New file |
| | |
| | | // |
| | | // TWTRAuthorizationProvider.h |
| | | // TWTRAuthentication |
| | | // |
| | | // Created by Mustafa Furniturewala on 2/5/14. |
| | | // Copyright (c) 2014 Mustafa Furniturewala. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | typedef void (^TWTRAuthenticationProviderCompletion)(NSDictionary *responseObject, NSError *error); |
| | | |
| | | @interface TWTRAuthenticationProvider : NSObject |
| | | |
| | | /** |
| | | * Authenticate with the Twitter API |
| | | * |
| | | * @param completion (required) The completion block to be called upon succes or failure. |
| | | * Will be called on an arbitrary queue. |
| | | */ |
| | | - (void)authenticateWithCompletion:(TWTRAuthenticationProviderCompletion)completion; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRAuthenticationProvider_Private.h |
| | | // |
| | | // Created by Mustafa Furniturewala on 5/28/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #ifndef Twitter_TWTRAuthenticationProvider_Private_h |
| | | #define Twitter_TWTRAuthenticationProvider_Private_h |
| | | |
| | | #import "TWTRAuthenticationProvider.h" |
| | | |
| | | @interface TWTRAuthenticationProvider () |
| | | |
| | | + (void)validateResponseWithResponse:(NSURLResponse *)response data:(NSData *)data connectionError:(NSError *)connectionError completion:(TWTRAuthenticationProviderCompletion)completion; |
| | | |
| | | @end |
| | | |
| | | #endif |
New file |
| | |
| | | // |
| | | // TWTRAuthenticator.h |
| | | // TWTRAuthenticator |
| | | // |
| | | // Created by Mustafa Furniturewala on 2/4/14. |
| | | // Copyright (c) 2014 Mustafa Furniturewala. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import <TwitterCore/TwitterCore.h> |
| | | #import "TWTRAuthenticationConstants.h" |
| | | |
| | | /** |
| | | * The TWTRAuthenticator has been deprecated. Users should use the TWTRSessionStore |
| | | * in favor of the authenticator. |
| | | */ |
| | | @interface TWTRAuthenticator : NSObject |
| | | |
| | | + (NSDictionary *)authenticationResponseForAuthType:(TWTRAuthType)authType __attribute__((deprecated("This class is removed in favor of TWTRSessionStore"))); |
| | | + (void)logoutAuthType:(TWTRAuthType)authType __attribute__((deprecated("This class is removed in favor of TWTRSessionStore"))); |
| | | |
| | | /** |
| | | * Save authentiation information to keychain and to disk. |
| | | * |
| | | * @param authDict Authentication dictionary received from the Twitter API. |
| | | * @param authType The TWTRAuthType of the response being saved. |
| | | * @param error An error object to return information about any error situations encountered. |
| | | * |
| | | * @return Returns YES if everything saved correctly, NO if errors were encountered. |
| | | */ |
| | | + (BOOL)saveAuthenticationWithDictionary:(NSDictionary *)authDict forAuthType:(TWTRAuthType)authType error:(out NSError *__autoreleasing *)error __attribute__((deprecated("This class is removed in favor of TWTRSessionStore"))); |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRColorUtil.h |
| | | // |
| | | // Created by Jacob Harding on 5/8/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #if IS_UIKIT_AVAILABLE |
| | | #import <UIKit/UIKit.h> |
| | | #else |
| | | #import <Cocoa/Cocoa.h> |
| | | |
| | | // This adds type name compatibility, but definitely not API cmopatibility for these classes. This |
| | | // is really a temporarly workaround to get this code building for OS X. |
| | | typedef NSColor UIColor; |
| | | typedef NSImage UIImage; |
| | | #endif |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | // Based off of rosetta color palette, |
| | | // see https://svn.twitter.biz/design/main/resources/colors/rosetta_colors.html (go/colors). |
| | | @interface TWTRColorUtil : NSObject |
| | | |
| | | #pragma mark - Black and White |
| | | |
| | | + (UIColor *)blackColor; |
| | | + (UIColor *)whiteColor; |
| | | |
| | | #pragma mark - Blues |
| | | |
| | | + (UIColor *)blueColor; |
| | | + (UIColor *)blueTextColor; |
| | | + (UIColor *)lightBlueColor; |
| | | + (UIColor *)mediumBlueColor; |
| | | + (UIColor *)darkBlueColor; |
| | | |
| | | #pragma mark - Reds |
| | | |
| | | + (UIColor *)redColor; |
| | | + (UIColor *)darkRedColor; |
| | | |
| | | #pragma mark - Purples |
| | | |
| | | + (UIColor *)darkPurpleColor; |
| | | + (UIColor *)deepPurpleColor; |
| | | + (UIColor *)mediumPurpleColor; |
| | | |
| | | #pragma mark - Grays |
| | | |
| | | + (UIColor *)grayTextColor; |
| | | + (UIColor *)darkGrayTextColor; |
| | | + (UIColor *)grayColor; |
| | | + (UIColor *)borderGrayColor; |
| | | + (UIColor *)darkBorderGrayColor; |
| | | + (UIColor *)faintGrayColor; |
| | | + (UIColor *)mediumGrayColor; |
| | | + (UIColor *)darkGrayColor; |
| | | |
| | | #pragma mark - Component Colors |
| | | |
| | | + (UIColor *)textColor; |
| | | + (UIColor *)imagePlaceholderColor; |
| | | |
| | | #pragma mark - Utilities |
| | | |
| | | + (NSInteger)hexWithColor:(UIColor *)color; |
| | | + (UIColor *)colorFromHex:(NSInteger)hex; |
| | | |
| | | + (UIImage *)imageWithColor:(UIColor *)color; |
| | | + (BOOL)isLightColor:(UIColor *)color; |
| | | + (BOOL)isLightColor:(UIColor *)color lightnessThreshold:(CGFloat)lightnessThreshold; |
| | | |
| | | + (BOOL)isOpaqueColor:(UIColor *)color; |
| | | |
| | | #pragma mark - Color calculations |
| | | |
| | | /** |
| | | * Returns a secondary text color by |
| | | * a) picking an alpha component based on whether the background color is light |
| | | * b) applying that alpha component to the primary text color |
| | | */ |
| | | + (UIColor *)secondaryTextColorFromPrimaryTextColor:(UIColor *)primaryTextColor backgroundColor:(UIColor *)backgroundColor; |
| | | |
| | | /** |
| | | * Returns a media background color by |
| | | * a) picking an alpha component based on whether the background color is light |
| | | * b) applying that alpha component to either solid white or black, based on the background |
| | | */ |
| | | + (UIColor *)mediaBackgroundColorFromBackgroundColor:(UIColor *)backgroundColor; |
| | | |
| | | /** |
| | | * Returns a logo color appropriate for the background color. |
| | | */ |
| | | + (UIColor *)logoColorFromBackgroundColor:(UIColor *)backgroundColor; |
| | | |
| | | /** |
| | | * Returns a color for the text of a button given its background |
| | | * color. This is intended for use in buttons or to highlight text. |
| | | * |
| | | * @param backgroundColor Background color where the text is displayed. |
| | | * |
| | | * @return Color of the text. |
| | | */ |
| | | + (UIColor *)contrastingTextColorFromBackgroundColor:(UIColor *)backgroundColor; |
| | | |
| | | /** |
| | | * Returns a darker color based on the original color and a percent to darken. |
| | | * |
| | | * @param color The original color |
| | | * @param lightnessLevel Lightness levels to lighten. Capped to 0 and 1.0. |
| | | */ |
| | | + (UIColor *)darkerColorForColor:(UIColor *)color lightnessLevel:(CGFloat)lightnessLevel; |
| | | |
| | | /** |
| | | * Returns a darker color based on the original color and a percent to lighten. |
| | | * |
| | | * @param color The original color |
| | | * @param lightnessLevel Lightness levels to lighten. Capped to 0 and 1.0. |
| | | */ |
| | | + (UIColor *)lighterColorForColor:(UIColor *)color lightnessLevel:(CGFloat)lightnessLevel; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRCoreConstants.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Joey Carmello on 4/1/15. |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRCoreVersion; |
| | | FOUNDATION_EXPORT NSString *const TWTRCoreBundleID; |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRTwitterCoreVersion; |
| | | FOUNDATION_EXPORT NSString *const TWTRTwitterCoreBuildNumber; // a numeric value that identifies each build uniquely |
New file |
| | |
| | | // |
| | | // TWTRCoreLanguage.h |
| | | // TwitterCore |
| | | // |
| | | // Created by Manuel Deschamps on 6/5/15. |
| | | // Copyright (c) 2015 Twitter Inc. All rights reserved. |
| | | // |
| | | |
| | | @interface TWTRCoreLanguage : NSObject |
| | | |
| | | + (NSString *)preferredLanguage; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRCoreOAuthSigning+Private.h |
| | | // TwitterCore |
| | | // |
| | | // Created by Javier Soto on 5/8/15. |
| | | // Copyright (c) 2015 Twitter Inc. All rights reserved. |
| | | // |
| | | |
| | | @class TWTRAuthConfig; |
| | | @protocol TWTRAuthSession; |
| | | |
| | | FOUNDATION_EXTERN NSDictionary *TWTRCoreOAuthSigningOAuthEchoHeaders(TWTRAuthConfig *authConfig, id<TWTRAuthSession> authSession, NSString *requestMethod, NSString *URLString, NSDictionary *parameters, NSString *expectedAPIHost, NSError **error); |
New file |
| | |
| | | // |
| | | // TWTRDateFormatters.h |
| | | // |
| | | // Created by Steven Hepting on 7/21/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | @interface TWTRDateFormatters : NSObject |
| | | |
| | | /** |
| | | * For use in parsing the Twitter API only. |
| | | * |
| | | * @return formatter that handles Twitter's API format. |
| | | */ |
| | | + (NSDateFormatter *)serverParsingDateFormatter; |
| | | |
| | | /** |
| | | * For use in parsing the HTTP `date` header only |
| | | * |
| | | * @return formatter that handles HTTP `date` header format |
| | | */ |
| | | + (NSDateFormatter *)HTTPDateHeaderParsingFormatter; |
| | | |
| | | /** |
| | | * For use in compact Tweet view when 24 hours < createdAt < current year. |
| | | * |
| | | * @return formatter that emits abbreviated month and day e.g. Aug 5. |
| | | */ |
| | | + (NSDateFormatter *)dayAndMonthDateFormatter; |
| | | |
| | | /** |
| | | * For use in timestamp accessibility labels |
| | | * |
| | | * @return formatter with NSDateFormatterLongStyle e.g. November 23, 1937 |
| | | */ |
| | | + (NSDateFormatter *)systemLongDateFormatter; |
| | | |
| | | /** |
| | | * For use in compact Tweet view when current year < createdAt. |
| | | * |
| | | * @return formatter that emits just the date without time e.g. MM/DD/YY |
| | | */ |
| | | + (NSDateFormatter *)shortHistoricalDateFormatter; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRDateFormatters.h |
| | | // |
| | | // Created by Steven Hepting on 7/21/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | @interface TWTRDateFormatters () |
| | | |
| | | + (void)resetCache; |
| | | + (void)setLocale:(NSLocale *)locale; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRDateUtil.h |
| | | // |
| | | // Created by Kang Chen on 8/4/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | @interface TWTRDateUtil : NSObject |
| | | |
| | | /** |
| | | * Determines whether the given date is in the current year. |
| | | * |
| | | * @param date the date to determine whether this is in the current year |
| | | * |
| | | * @return whether the date is in the current year |
| | | */ |
| | | + (BOOL)isDateInCurrentYear:(NSDate *)date; |
| | | |
| | | /** |
| | | * String suitable for reading out in accessibility label of timestamp. |
| | | * |
| | | * @param date The date to be read out |
| | | * |
| | | * @return The string suitable for reading by VoiceOver |
| | | */ |
| | | + (NSString *)accessibilityTextForDate:(NSDate *)date; |
| | | |
| | | /** |
| | | * Checks if two dates are within a certain interval of each other. |
| | | * |
| | | * @param date the future date |
| | | * @param interval time interval to check for |
| | | * @param fromDate the older date to check against |
| | | * |
| | | * @return true if date - fromDate is <= interval |
| | | */ |
| | | + (BOOL)isDate:(NSDate *)date withinInterval:(NSTimeInterval)interval fromDate:(NSDate *)fromDate; |
| | | |
| | | /** |
| | | * Checks if two dates are within the same calendar day in UTC. |
| | | * |
| | | * @param date a date |
| | | * @param date2 another date |
| | | * |
| | | * @return true if two dates are within the same calendar day |
| | | */ |
| | | + (BOOL)date:(NSDate *)date isWithinSameUTCDayAsDate:(NSDate *)date2; |
| | | |
| | | /** |
| | | * Returns a new date of the specified time in UTC. |
| | | * |
| | | * @param year the 4-digit year e.g. YYYY |
| | | * @param month the month within the year e.g. 1 for Jan, 11 for Nov |
| | | * @param day the day within the month |
| | | * @param hour the hour in 24-hour format e.g. 23 for 11PM |
| | | * @param minute the minute |
| | | * @param second the second |
| | | * |
| | | * @return a new date in the specified UTC time. |
| | | */ |
| | | + (NSDate *)UTCDateWithYear:(NSUInteger)year month:(NSUInteger)month day:(NSUInteger)day hour:(NSUInteger)hour minute:(NSUInteger)minute second:(NSUInteger)second; |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRDictUtil.h |
| | | // |
| | | // Created by Jacob Harding on 5/29/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import <UIKit/UIKit.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | @interface TWTRDictUtil : NSObject |
| | | |
| | | + (CGFloat)CGFloatForKey:(NSString *)key fromDict:(NSDictionary *)dict; |
| | | + (double)doubleForKey:(NSString *)key fromDict:(NSDictionary *)dict; |
| | | + (BOOL)boolForKey:(NSString *)key fromDict:(NSDictionary *)dict; |
| | | + (NSInteger)intForKey:(NSString *)key fromDict:(NSDictionary *)dict; |
| | | + (long long)longlongForKey:(NSString *)key fromDict:(NSDictionary *)dict; |
| | | + (NSUInteger)unsignedIntegerForKey:(NSString *)key fromDict:(NSDictionary *)dict; |
| | | + (NSString *)stringFromNumberForKey:(NSString *)key fromDict:(NSDictionary *)dict; |
| | | + (id)objectForKey:(NSString *)key fromDict:(NSDictionary *)dict; |
| | | + (NSString *)stringForKey:(NSString *)key fromDict:(NSDictionary *)dict; |
| | | + (NSDate *)dateForKey:(NSString *)key fromDict:(NSDictionary *)dict; |
| | | + (NSDictionary *)dictForKey:(NSString *)key fromDict:(NSDictionary *)dict; |
| | | + (NSArray *)arrayForKey:(NSString *)key fromDict:(NSDictionary *)dict; |
| | | |
| | | @end |
| | | |
| | | @interface TWTRArrayUtil : NSObject |
| | | |
| | | /** |
| | | * Returns a CGFloat at the given index. This method does not check bounds. |
| | | */ |
| | | + (CGFloat)CGFloatAtIndex:(NSInteger)index; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRErrorLogger.h |
| | | // TwitterCore |
| | | // |
| | | // Created by Kang Chen on 7/16/15. |
| | | // Copyright (c) 2015 Twitter Inc. All rights reserved. |
| | | // |
| | | |
| | | /** |
| | | * Protocol for loggers that support error logging. |
| | | */ |
| | | @protocol TWTRErrorLogger <NSObject> |
| | | |
| | | /** |
| | | * Logs that an error was encountered inside our SDK. |
| | | * |
| | | * @param error (required) An NSError object describing this error case. |
| | | * @param errorMessage (required) A message describing the error that occurred. |
| | | */ |
| | | - (void)didEncounterError:(NSError *)error withMessage:(NSString *)errorMessage; |
| | | |
| | | @end |
New file |
| | |
| | | /* |
| | | |
| | | Copyright 2011 TweetDeck Inc. All rights reserved. |
| | | |
| | | Redistribution and use in source and binary forms, with or without |
| | | modification, are permitted provided that the following conditions are met: |
| | | |
| | | 1. Redistributions of source code must retain the above copyright notice, |
| | | this list of conditions and the following disclaimer. |
| | | |
| | | 2. Redistributions in binary form must reproduce the above copyright notice, |
| | | this list of conditions and the following disclaimer in the documentation |
| | | and/or other materials provided with the distribution. |
| | | |
| | | THIS SOFTWARE IS PROVIDED BY TWEETDECK INC. ``AS IS'' AND ANY EXPRESS OR |
| | | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| | | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
| | | EVENT SHALL TWEETDECK INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
| | | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| | | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| | | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| | | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| | | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| | | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| | | |
| | | The views and conclusions contained in the software and documentation are |
| | | those of the authors and should not be interpreted as representing official |
| | | policies, either expressed or implied, of TweetDeck Inc. |
| | | |
| | | */ |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | /* |
| | | This OAuth implementation doesn't cover the whole spec (eg. it’s HMAC only). |
| | | But you'll find it works with almost all the OAuth implementations you need |
| | | to interact with in the wild. How ace is that?! |
| | | */ |
| | | @interface TWTRGCOAuth : NSObject { |
| | | @private |
| | | NSString *signatureSecret; |
| | | NSDictionary *OAuthParameters; |
| | | } |
| | | |
| | | /* |
| | | Set the user agent to be used for all requests. |
| | | */ |
| | | + (void)setUserAgent:(NSString *)agent; |
| | | |
| | | /* |
| | | Set the time offset to be used for timestamp calculations. |
| | | */ |
| | | + (void)setTimeStampOffset:(time_t)offset; |
| | | |
| | | /* |
| | | Control HTTPS cookie storage for all generated requests |
| | | */ |
| | | + (void)setHTTPShouldHandleCookies:(BOOL)handle; |
| | | |
| | | /** |
| | | Creates and returns a URL request that will perform an HTTP operation for the given method. All |
| | | of the appropriate fields will be parameter encoded as necessary so do not |
| | | encode them yourself. The contents of the parameters dictionary must be string |
| | | key/value pairs. You are contracted to consume the NSURLRequest *immediately*. |
| | | */ |
| | | + (NSURLRequest *)URLRequestForPath:(NSString *)path HTTPMethod:(NSString *)HTTPMethod parameters:(NSDictionary *)parameters scheme:(NSString *)scheme host:(NSString *)host consumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret accessToken:(NSString *)accessToken tokenSecret:(NSString *)tokenSecret; |
| | | |
| | | /* |
| | | Creates and returns a URL request that will perform a GET HTTP operation. All |
| | | of the appropriate fields will be parameter encoded as necessary so do not |
| | | encode them yourself. The contents of the parameters dictionary must be string |
| | | key/value pairs. You are contracted to consume the NSURLRequest *immediately*. |
| | | */ |
| | | + (NSURLRequest *)URLRequestForPath:(NSString *)path GETParameters:(NSDictionary *)parameters host:(NSString *)host consumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret accessToken:(NSString *)accessToken tokenSecret:(NSString *)tokenSecret; |
| | | |
| | | /* |
| | | Performs the same operation as the above method but allows a customizable URL |
| | | scheme, e.g. HTTPS. |
| | | */ |
| | | + (NSURLRequest *)URLRequestForPath:(NSString *)path GETParameters:(NSDictionary *)parameters scheme:(NSString *)scheme host:(NSString *)host consumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret accessToken:(NSString *)accessToken tokenSecret:(NSString *)tokenSecret; |
| | | |
| | | /* |
| | | Creates and returns a URL request that will perform a DELETE HTTP operation. All |
| | | of the appropriate fields will be parameter encoded as necessary so do not |
| | | encode them yourself. The contents of the parameters dictionary must be string |
| | | key/value pairs. You are contracted to consume the NSURLRequest *immediately*. |
| | | */ |
| | | + (NSURLRequest *)URLRequestForPath:(NSString *)path DELETEParameters:(NSDictionary *)parameters host:(NSString *)host consumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret accessToken:(NSString *)accessToken tokenSecret:(NSString *)tokenSecret; |
| | | |
| | | /* |
| | | Performs the same operation as the above method but allows a customizable URL |
| | | scheme, e.g. HTTPS. |
| | | */ |
| | | + (NSURLRequest *)URLRequestForPath:(NSString *)path DELETEParameters:(NSDictionary *)parameters scheme:(NSString *)scheme host:(NSString *)host consumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret accessToken:(NSString *)accessToken tokenSecret:(NSString *)tokenSecret; |
| | | |
| | | /* |
| | | Creates and returns a URL request that will perform a POST HTTP operation. All |
| | | data will be sent as form URL encoded. Restrictions on the arguments to this |
| | | method are the same as the GET request methods. |
| | | */ |
| | | + (NSURLRequest *)URLRequestForPath:(NSString *)path POSTParameters:(NSDictionary *)parameters host:(NSString *)host consumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret accessToken:(NSString *)accessToken tokenSecret:(NSString *)tokenSecret; |
| | | |
| | | /* |
| | | Performs the same operation as the above method but allows a customizable URL |
| | | scheme, e.g. HTTPS. |
| | | */ |
| | | + (NSURLRequest *)URLRequestForPath:(NSString *)path POSTParameters:(NSDictionary *)parameters scheme:(NSString *)scheme host:(NSString *)host consumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret accessToken:(NSString *)accessToken tokenSecret:(NSString *)tokenSecret; |
| | | |
| | | /** |
| | | * Convenience method that takes in a `NSURLRequest` but performs the same operation as the above. |
| | | * |
| | | * @param request The request to sign |
| | | * @param consumerKey The app consumer key |
| | | * @param consumerSecret The app consumer secret |
| | | * @param accessToken The oauth access token |
| | | * @param tokenSecret The oauth access token secret |
| | | * |
| | | * @return A signed request given the oauth credentials |
| | | */ |
| | | + (NSURLRequest *)URLRequestFromRequest:(NSURLRequest *)request consumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret accessToken:(NSString *)accessToken tokenSecret:(NSString *)tokenSecret; |
| | | |
| | | @end |
| | | |
| | | /* |
| | | |
| | | XAuth example (because you may otherwise be scratching your head): |
| | | |
| | | NSURLRequest *xauth = [GCOAuth URLRequestForPath:@"/oauth/access_token" |
| | | POSTParameters:[NSDictionary dictionaryWithObjectsAndKeys: |
| | | username, @"x_auth_username", |
| | | password, @"x_auth_password", |
| | | @"client_auth", @"x_auth_mode", |
| | | nil] |
| | | host:@"api.twitter.com" |
| | | consumerKey:CONSUMER_KEY |
| | | consumerSecret:CONSUMER_SECRET |
| | | accessToken:nil |
| | | tokenSecret:nil]; |
| | | |
| | | OAuth Echo example (we have found that some consumers require HTTPS for the |
| | | echo, so to be safe we always do it): |
| | | |
| | | NSURLRequest *echo = [GCOAuth URLRequestForPath:@"/1/account/verify_credentials.json" |
| | | GETParameters:nil |
| | | scheme:@"https" |
| | | host:@"api.twitter.com" |
| | | consumerKey:CONSUMER_KEY |
| | | consumerSecret:CONSUMER_SECRET |
| | | accessToken:accessToken |
| | | tokenSecret:tokenSecret]; |
| | | NSMutableURLRequest *rq = [NSMutableURLRequest new]; |
| | | [rq setValue:[[echo URL] absoluteString] forHTTPHeaderField:@"X-Auth-Service-Provider"]; |
| | | [rq setValue:[echo valueForHTTPHeaderField:@"Authorization"] forHTTPHeaderField:@"X-Verify-Credentials-Authorization"]; |
| | | // Now consume rq with an NSURLConnection |
| | | [rq release]; |
| | | |
| | | |
| | | Suggested usage would be to make some categories for this class that |
| | | automatically adds both secrets, both tokens and host information. This |
| | | makes usage less cumbersome. Eg: |
| | | |
| | | [TwitterOAuth GET:@"/1/statuses/home_timeline.json"]; |
| | | [TwitterOAuth GET:@"/1/statuses/home_timeline.json" queryParameters:dictionary]; |
| | | |
| | | At TweetDeck we have TDAccount classes that represent separate user logins |
| | | for different services when instantiated. |
| | | |
| | | */ |
New file |
| | |
| | | // |
| | | // TWTRGenericKeychainItem.h |
| | | // TwitterCore |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | extern NSString *const TWTRGenericKeychainItemErrorDomain; |
| | | |
| | | /** |
| | | * The TWTRGenericKeychainQuery provides an simple model object |
| | | * that can be used in conjuction with TWTRGenericKeychainItem to |
| | | * retrieve items in the keychain. |
| | | */ |
| | | @interface TWTRGenericKeychainQuery : NSObject |
| | | |
| | | /** |
| | | * The name of the service corresponding with kSecAttrService. |
| | | * If this value is specified the genericValue and accessGroup values are ignored. |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) NSString *service; |
| | | |
| | | /** |
| | | * The name of the account corresponding with kSecAttrAccount. |
| | | * If this value is specified the genericValue and accessGroup values are ignored. |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) NSString *account; |
| | | |
| | | /** |
| | | * A generic value corresponding with kSecAttrGeneric. |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) NSString *genericValue; |
| | | |
| | | /** |
| | | * The access group corresponding with kSecAttrAccessGroup. |
| | | * This value is not used in equality checks. |
| | | * Note: This value is ignored in the simulator. |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) NSString *accessGroup; |
| | | |
| | | /** |
| | | * A query that will return all the items in the keychain. |
| | | */ |
| | | + (instancetype)queryForAllItems; |
| | | |
| | | /** |
| | | * A query that will return all items with the given service. |
| | | */ |
| | | + (instancetype)queryForService:(NSString *)service; |
| | | |
| | | /** |
| | | * A query that will return all items with the given account. |
| | | */ |
| | | + (instancetype)queryForAccount:(NSString *)account; |
| | | |
| | | /** |
| | | * A query that will match all items that contain both the service and account. |
| | | */ |
| | | + (instancetype)queryForService:(NSString *)service account:(NSString *)account; |
| | | |
| | | /** |
| | | * A query that will return all items with the given generic value. |
| | | */ |
| | | + (instancetype)queryForGenericValue:(NSString *)genericValue; |
| | | |
| | | /** |
| | | * A query that will return all items with the given access group. |
| | | */ |
| | | + (instancetype)queryForAccessGroup:(NSString *)accessGroup; |
| | | |
| | | @end |
| | | |
| | | /** |
| | | * The TWTRGenericKeychainItem provides a convenience wrapper |
| | | * around the security framework's keychain access. All of |
| | | * the items stored using this class will be stored as |
| | | * kSecClassGenericPassword objects. |
| | | */ |
| | | @interface TWTRGenericKeychainItem : NSObject |
| | | |
| | | /** |
| | | * A value which specifies the item's service attribute. This |
| | | * value represents the service associated with this item. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *service; |
| | | |
| | | /** |
| | | * A value which represents the items account name. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *account; |
| | | |
| | | /** |
| | | * The item that is intended to be kept secret. This may be |
| | | * something like a password for an account or an oauth token. |
| | | * |
| | | * @warning If this data is too large it will fail to save. The size |
| | | * should be smaller than ~2mb but can change from device to device. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSData *secret; |
| | | |
| | | /** |
| | | * An optional value that can be set on the item. |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) NSString *genericValue; |
| | | |
| | | /** |
| | | * Returns the date that the item was last saved to the store. This value |
| | | * is nil until the item is actually saved. |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) NSDate *lastSavedDate; |
| | | |
| | | /** |
| | | * An optional value that can be used to specify the items accesss group. |
| | | * If this value is not set the default access group which is only |
| | | * accessible from the calling application will be used. |
| | | * |
| | | * Refer to 'Keychain Services Programming Guide' for more information |
| | | * regarding access groups. Most of the time you will |
| | | * want to leave this value empty. |
| | | * |
| | | * This value may not be empty upon fetch even if it is empty when it is saved. This |
| | | * is because the security framework will fill it with the default value which |
| | | * is not specified. |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) NSString *accessGroup; |
| | | |
| | | /** |
| | | * Fetches all of the stored items for the given query. |
| | | * If the returned array is nil it indicates that an error |
| | | * has occurred and the error parameter will be set. If no |
| | | * items are found an empty array will be returned. |
| | | * |
| | | * The query results will depend on the specificity of the query |
| | | * object as described in its documetation. |
| | | */ |
| | | + (NSArray *)storedItemsMatchingQuery:(TWTRGenericKeychainQuery *)query error:(NSError **)error; |
| | | |
| | | /** |
| | | * Removes all the items matching the given query. |
| | | */ |
| | | + (BOOL)removeAllItemsForQuery:(TWTRGenericKeychainQuery *)query error:(NSError **)error; |
| | | |
| | | /** |
| | | * Initializes a TWTRGenericKeychainItem object with the given values. |
| | | * This does not automatically save the object, you must call -[TWTRGenericKeychainItem storeInKeychain:] |
| | | to actually save the object. |
| | | * |
| | | * A keychain item is uniquely constrained by the service/account combination. Any action performed |
| | | * with the keychain item will override any existing keychain items with the given service/account |
| | | * combination. |
| | | * |
| | | * @param service the service for this item. |
| | | * @param account the account associated with this item. |
| | | * @param secret the secret value to store. |
| | | * @param genericValue an additional value to associate with this item. |
| | | * @param accessGroup the access group for this item. If empty uses the default access group. * |
| | | */ |
| | | - (instancetype)initWithService:(NSString *)service account:(NSString *)account secret:(NSData *)secret; |
| | | - (instancetype)initWithService:(NSString *)service account:(NSString *)account secret:(NSData *)secret genericValue:(nullable NSString *)genericValue; |
| | | - (instancetype)initWithService:(NSString *)service account:(NSString *)account secret:(NSData *)secret genericValue:(nullable NSString *)genericValue accessGroup:(nullable NSString *)accessGroup; |
| | | |
| | | /** |
| | | * Call this method to store the keychain item in the store. |
| | | * |
| | | * A TWTRGenericKeychainItem is only unique based on the account |
| | | * and the service specified. If the item exists and the replaceExisting parameter |
| | | * is YES the value will be replaced. If this parameter is NO the operation will |
| | | * fail. |
| | | * |
| | | * @param replacesExisting whether an existing value should be replaced, Default = YES |
| | | * @param error an optional error that will be set if the operation fails. |
| | | * @return a value representing if the operation was successful |
| | | */ |
| | | - (BOOL)storeInKeychain:(NSError **)error; |
| | | - (BOOL)storeInKeychainReplacingExisting:(BOOL)replaceExisting error:(NSError **)error; |
| | | |
| | | /** |
| | | * Attempts to remove the wrapper from the keychain. |
| | | * |
| | | * The keychain item is only unique based on the service/account |
| | | * pair. So a value that is created with the same service/account |
| | | * but different secret will remove the existing value. |
| | | * |
| | | * @return a value representing if the operation was successful |
| | | */ |
| | | - (BOOL)removeFromKeychain:(NSError **)error; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRGuestAuthProvider.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Kang Chen on 1/27/15. |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | @class TWTRAuthConfig; |
| | | @protocol TWTRAPIServiceConfig; |
| | | #import "TWTRAuthenticationProvider.h" |
| | | |
| | | /** |
| | | Manages activation of new guest tokens. |
| | | |
| | | @see TWTRAuthenticator |
| | | */ |
| | | @interface TWTRGuestAuthProvider : TWTRAuthenticationProvider |
| | | |
| | | - (instancetype)init __unavailable; |
| | | - (instancetype)initWithAuthConfig:(TWTRAuthConfig *)authConfig apiServiceConfig:(id<TWTRAPIServiceConfig>)apiServiceConfig accessToken:(NSString *)accessToken __attribute__((nonnull(1, 2)))NS_DESIGNATED_INITIALIZER; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRGuestAuthRequestSigner.h |
| | | // TwitterCore |
| | | // |
| | | // Created by Kang Chen on 6/25/15. |
| | | // Copyright (c) 2015 Twitter Inc. All rights reserved. |
| | | // |
| | | |
| | | @class TWTRAuthConfig; |
| | | @class TWTRGuestSession; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * Signer abstracting logic to sign a guest authenticated network request. |
| | | */ |
| | | @interface TWTRGuestAuthRequestSigner : NSObject |
| | | |
| | | /** |
| | | * Signs the given request with the appropriate guest authentication headers. |
| | | * |
| | | * @param URLRequest The URL request to sign |
| | | * @param session The guest session containing guest tokens required to sign the request |
| | | * |
| | | * @return The signed URL request |
| | | */ |
| | | + (NSURLRequest *)signedURLRequest:(NSURLRequest *)URLRequest session:(TWTRGuestSession *)session; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRKeychainWrapper.h |
| | | // TWTRAuthentication |
| | | // |
| | | // Created by Mustafa Furniturewala on 2/19/14. |
| | | // Copyright (c) 2014 Mustafa Furniturewala. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import "TWTRAuthenticationConstants.h" |
| | | |
| | | @interface TWTRKeychainWrapper : NSObject |
| | | |
| | | @property (nonatomic, retain) NSMutableDictionary *keychainItemData; |
| | | @property (nonatomic, retain) NSMutableDictionary *genericPasswordQuery; |
| | | |
| | | // Designated initializer. |
| | | - (id)initWithAccount:(NSString *)account service:(NSString *)service accessGroup:(NSString *)accessGroup; |
| | | - (BOOL)setObject:(id)inObject forKey:(id)key; |
| | | - (id)objectForKey:(id)key; |
| | | |
| | | // Initializes and resets the default generic keychain item data. |
| | | - (void)resetKeychainItem; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRMultiThreadUtil.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Kang Chen on 3/16/15. |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | @interface TWTRMultiThreadUtil : NSObject |
| | | |
| | | /** |
| | | * Checks that this method was called from a main thread. |
| | | * Call this method from common methods in the public API of this class to catch the most obvious issues. |
| | | */ |
| | | + (void)assertMainThread; |
| | | |
| | | /** |
| | | * Warns the user that a method was invoked from a background thread, which is not supported. |
| | | * On debug builds this throws an exception, on release builds it logs to the console. |
| | | */ |
| | | + (void)warnForBackgroundThreadUsage; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRMultipartFormDocument.h |
| | | // TwitterCore |
| | | // |
| | | // Created by Chase Latta on 8/19/15. |
| | | // Copyright (c) 2015 Twitter Inc. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | typedef void (^TWTRMultipartFormDocumentLoadDataCallback)(NSData *data); |
| | | |
| | | @interface TWTRMultipartFormElement : NSObject |
| | | |
| | | /** |
| | | * The name of the form element. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *name; |
| | | |
| | | /** |
| | | * The content type of the form element. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *contentType; |
| | | |
| | | /** |
| | | * An optional filename for this element. |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) NSString *fileName; |
| | | |
| | | /** |
| | | * The content's data. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSData *content; |
| | | |
| | | /** |
| | | * Returns a fully initialized form element to be used in a multipart for document. |
| | | * |
| | | * @param name the name of the element |
| | | * @param contentType the elements content type |
| | | * @param fileName an optional file name |
| | | * @param content the data associated with this item |
| | | */ |
| | | - (instancetype)initWithName:(NSString *)name contentType:(NSString *)contentType fileName:(nullable NSString *)fileName content:(NSData *)content NS_DESIGNATED_INITIALIZER; |
| | | |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | @end |
| | | |
| | | /** |
| | | * A class representing a multipart form document. |
| | | */ |
| | | @interface TWTRMultipartFormDocument : NSObject |
| | | |
| | | /** |
| | | * The forms boundary |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *boundary; |
| | | |
| | | /** |
| | | * Returns a value appropriate for the Content-Type header field |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *contentTypeHeaderField; |
| | | |
| | | /** |
| | | * Instantiates the document with the given elements. |
| | | * |
| | | * @param formElements the elements to append to this document |
| | | */ |
| | | - (instancetype)initWithFormElements:(NSArray *)formElements NS_DESIGNATED_INITIALIZER; |
| | | |
| | | /** |
| | | * Asynchrounously loads the body data. |
| | | * |
| | | * @param callbackQueue the queue to invoke the handler on |
| | | * @param completion the completion block to call with the loaded data. |
| | | */ |
| | | - (void)loadBodyDataWithCallbackQueue:(dispatch_queue_t)callbackQueue completion:(TWTRMultipartFormDocumentLoadDataCallback)completion; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRNetworkingConstants.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Kang Chen on 11/12/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRNetworkingErrorDomain; |
| | | FOUNDATION_EXPORT NSString *const TWTRNetworkingUserAgentHeaderKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRNetworkingStatusCodeKey; |
| | | |
| | | #pragma mark - HTTP Headers |
| | | FOUNDATION_EXPORT NSString *const TWTRContentTypeHeaderField; |
| | | FOUNDATION_EXPORT NSString *const TWTRContentLengthHeaderField; |
| | | FOUNDATION_EXPORT NSString *const TWTRContentTypeURLEncoded; |
| | | FOUNDATION_EXPORT NSString *const TWTRAcceptEncodingHeaderField; |
| | | FOUNDATION_EXPORT NSString *const TWTRAcceptEncodingGzip; |
| | | |
| | | /** |
| | | * Internal API error codes |
| | | * These error codes belong to the `TWTRAPIErrorDomain` error domain. |
| | | * @see https://cgit.twitter.biz/birdcage/tree/macaw/macaw-core/src/main/scala/com/twitter/macaw/monorail/ApiError.scala |
| | | */ |
| | | // TODO: Move these to the public header because they can all surface to the developer? |
| | | typedef NS_ENUM(NSUInteger, TWTRTwitterAPIErrorCode) { |
| | | /** |
| | | * "%s parameter is invalid" |
| | | */ |
| | | TWTRTwitterAPIErrorInvalidParameter = 44, |
| | | |
| | | /** |
| | | * "The email address associated with this account is invalid." |
| | | */ |
| | | TWTRTwitterAPIErrorInvalidEmailAddress = 56, |
| | | |
| | | /** |
| | | * "Client is not permitted to perform this action" |
| | | */ |
| | | TWTRTwitterAPIErrorClientNotPrivileged = 87, |
| | | |
| | | /** |
| | | * "Rate limit exceeded" |
| | | */ |
| | | TWTRTwitterAPIErrorRateLimitExceeded = 88, |
| | | |
| | | /** |
| | | * "Account update failed: %s." |
| | | */ |
| | | TWTRTwitterAPIErrorAccountUpdateFailure = 120, |
| | | |
| | | /** |
| | | * "Bad Authentication data." |
| | | */ |
| | | TWTRTwitterAPIErrorCodeBadAuthenticationData = 215, |
| | | |
| | | /** |
| | | * "The login verification request has expired" |
| | | */ |
| | | TWTRTwitterAPIErrorExpiredLoginVerificationRequest = 235, |
| | | |
| | | /** |
| | | * "The challenge response is incorrect" |
| | | */ |
| | | TWTRTwitterAPIErrorIncorrectChallengeResponse = 236, |
| | | |
| | | /** |
| | | * "That is not an active login verification request ID" |
| | | */ |
| | | TWTRTwitterAPIErrorMissingLoginVerificationRequest = 237, |
| | | |
| | | /** |
| | | * "Your signup request looks similar to automated requests from a computer. To protect our users from spam and other malicious activity, we can't create an account for you right now. Please try again later." |
| | | */ |
| | | TWTRTwitterAPIErrorTieredActionSignupSpammerPhoneVerify = 240, |
| | | |
| | | /** |
| | | * "User is over the limit for login verification. Please try again in an hour." |
| | | */ |
| | | TWTRTwitterAPIErrorOverLimitLoginVerificationStart = 245, |
| | | |
| | | /** |
| | | * "User is over the limit for login verification attempts. Please try signing in again." |
| | | */ |
| | | TWTRTwitterAPIErrorOverLimitLoginVerificationAttempt = 246, |
| | | |
| | | /** |
| | | * "The login request is not yet approved." |
| | | */ |
| | | TWTRTwitterAPIErrorNotYetApprovedLoginVerification = 253, |
| | | |
| | | /** |
| | | * "There was a failure sending the login verification request" |
| | | */ |
| | | TWTRTwitterAPIErrorFailureSendingLoginVerificationRequest = 266, |
| | | |
| | | /** |
| | | * "User is not an SDK user" |
| | | */ |
| | | TWTRTwitterAPIErrorUserIsNotSdkUser = 269, |
| | | |
| | | /** |
| | | * "We are unable to verify this phone number." |
| | | */ |
| | | TWTRTwitterAPIErrorDeviceRegistrationGeneralError = 284, |
| | | |
| | | /** |
| | | * "This phone number is already registered." |
| | | */ |
| | | TWTRTwitterAPIErrorDeviceAlreadyRegistered = 285, |
| | | |
| | | /** |
| | | * "We cannot send a text message to this phone number because its operator is not supported." |
| | | */ |
| | | TWTRTwitterAPIErrorDeviceOperatorUnsupported = 286, |
| | | |
| | | /** |
| | | * "Device registration contains incorrect/unformatted input. |
| | | */ |
| | | TWTRTwitterAPIErrorDeviceRegistrationInvalidInput = 300, |
| | | |
| | | /** |
| | | * "Device registration attempted on pending device." |
| | | */ |
| | | TWTRTwitterAPIErrorDeviceDeviceRegistrationPending = 301, |
| | | |
| | | /** |
| | | * "Internal operation failed during device registration." |
| | | */ |
| | | TWTRTwitterAPIErrorDeviceRegistrationOperationFailed = 302, |
| | | |
| | | /** |
| | | * "Phone number normalization failed during device registration" |
| | | */ |
| | | TWTRTwitterAPIErrorDeviceRegistrationPhoneNormalizationFailed = 303, |
| | | |
| | | /** |
| | | * "Phone number country not detected upon normalization during device registration" |
| | | */ |
| | | TWTRTwitterAPIErrorDeviceRegistrationPhoneCountryDetectionFailed = 304, |
| | | }; |
New file |
| | |
| | | // |
| | | // TWTRNetworkingPipeline.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <TwitterCore/TWTRSessionStore.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | @protocol TWTRNetworkingResponseValidating; |
| | | |
| | | typedef void (^TWTRNetworkingPipelineCallback)(NSData *_Nullable data, NSURLResponse *_Nullable response, NSError *_Nullable error); |
| | | |
| | | @interface TWTRNetworkingPipeline : NSObject |
| | | |
| | | /** |
| | | *if set, this object will be used to validate network responses. |
| | | */ |
| | | @property (nonatomic, readonly, nullable) id<TWTRNetworkingResponseValidating> responseValidator; |
| | | |
| | | /** |
| | | * Use the initWithURLSession: method instead. |
| | | */ |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | /** |
| | | * Returns an instance of the networking pipeline |
| | | * |
| | | * @param URLSession URLSession object to invoke network requests on. |
| | | * @param responseValidator an optional response validator to use to validate responses. |
| | | */ |
| | | - (instancetype)initWithURLSession:(NSURLSession *)URLSession responseValidator:(nullable id<TWTRNetworkingResponseValidating>)responseValidator NS_DESIGNATED_INITIALIZER; |
| | | |
| | | /** |
| | | * Enqueues a request in the pipeline. |
| | | * |
| | | * @param request The HTTP Request to send |
| | | * @param sessionStore The session store that will provide the session. |
| | | * @param userID The userId to sign the request for or nil if using the guest session |
| | | * @param completion The completion block to invoke on completion. |
| | | */ |
| | | - (NSProgress *)enqueueRequest:(NSURLRequest *)request sessionStore:(id<TWTRSessionStore>)sessionStore; |
| | | - (NSProgress *)enqueueRequest:(NSURLRequest *)request sessionStore:(id<TWTRSessionStore>)sessionStore requestingUser:(nullable NSString *)userID; |
| | | |
| | | /** |
| | | * Enqueues a request in the pipeline. |
| | | * |
| | | * @param request The HTTP request to send. |
| | | * @param sessionStore The session store that will provide the session. |
| | | * @param userID The user to sign the request for or nil if using the guest session. |
| | | * @param completion The completion block to invoke on completion. |
| | | */ |
| | | - (NSProgress *)enqueueRequest:(NSURLRequest *)request sessionStore:(id<TWTRSessionStore>)sessionStore requestingUser:(nullable NSString *)userID completion:(nullable TWTRNetworkingPipelineCallback)completion; |
| | | |
| | | @end |
| | | |
| | | @protocol TWTRNetworkingResponseValidating <NSObject> |
| | | |
| | | @required |
| | | /** |
| | | * This method should return an NO if the response represents an error state. |
| | | */ |
| | | - (BOOL)validateResponse:(nullable NSURLResponse *)response data:(nullable NSData *)data error:(NSError **)error; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRNetworkingPipelinePackage.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Chase Latta on 6/22/15. |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <TwitterCore/TWTRSessionStore.h> |
| | | #import "TWTRNetworkingPipeline.h" |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | @interface TWTRNetworkingPipelinePackage : NSObject <NSCopying> |
| | | |
| | | /** |
| | | * The URL request object that will be executed by this package. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSURLRequest *request; |
| | | |
| | | /** |
| | | * The session store that will be used by the package to provide session information. |
| | | */ |
| | | @property (nonatomic, readonly) id<TWTRSessionStore> sessionStore; |
| | | |
| | | /** |
| | | * The userID associated with this package or nil to signify that |
| | | * the guest session should be used. |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) NSString *userID; |
| | | |
| | | /** |
| | | The calback block to execute when the request is finished or fails. |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) TWTRNetworkingPipelineCallback callback; |
| | | |
| | | /** |
| | | A counter to track the attempts (with retries) of the request operation associated with the this package. It can be useful |
| | | to avoid retrying a request indefinitely (stop after certain threshold). It starts with 1 |
| | | */ |
| | | @property (nonatomic, readonly) NSInteger attemptCounter; |
| | | |
| | | /** |
| | | * A UUI associated with this package. |
| | | */ |
| | | @property (nonatomic, readonly) NSUUID *UUID; |
| | | |
| | | - (instancetype)initWithRequest:(NSURLRequest *)request sessionStore:(id<TWTRSessionStore>)sessionStore userID:(nullable NSString *)userID completion:(nullable TWTRNetworkingPipelineCallback)callback NS_DESIGNATED_INITIALIZER; |
| | | |
| | | + (instancetype)packageWithRequest:(NSURLRequest *)request sessionStore:(id<TWTRSessionStore>)sessionStore userID:(nullable NSString *)userID completion:(nullable TWTRNetworkingPipelineCallback)callback; |
| | | |
| | | /* |
| | | Create a copy of current package instance with attemptCounter being added by one. current package object remain unchanged. |
| | | */ |
| | | - (instancetype)copyForRetry; |
| | | |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRNetworkingPipelineQueue.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Chase Latta on 6/23/15. |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import <TwitterCore/TWTRNetworkingPipeline.h> |
| | | |
| | | @class TWTRNetworkingPipelinePackage; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | typedef NS_ENUM(NSInteger, TWTRNetworkingPipelineQueueType) { |
| | | /** |
| | | * Queues that depend on having a valid guest session |
| | | */ |
| | | TWTRNetworkingPipelineQueueTypeGuest, |
| | | |
| | | /** |
| | | * Queues that depend on having a valid user session |
| | | */ |
| | | TWTRNetworkingPipelineQueueTypeUser |
| | | }; |
| | | |
| | | @interface TWTRNetworkingPipelineQueue : NSObject |
| | | |
| | | /** |
| | | * Returns the type that this queue was initialized with. |
| | | */ |
| | | @property (nonatomic, readonly) TWTRNetworkingPipelineQueueType queueType; |
| | | |
| | | /** |
| | | * A response validator to use to validate network responses. |
| | | */ |
| | | @property (nonatomic, readonly, nullable) id<TWTRNetworkingResponseValidating> responseValidator; |
| | | |
| | | /** |
| | | * Initializes the queue witht the given type. |
| | | * |
| | | * @param type The type of queue to initialize |
| | | * @param session The NSURLSession to send requests with |
| | | * @param responseValidator The response validator to use for this queue |
| | | */ |
| | | - (instancetype)initWithType:(TWTRNetworkingPipelineQueueType)type URLSession:(NSURLSession *)session responseValidator:(nullable id<TWTRNetworkingResponseValidating>)responseValidator NS_DESIGNATED_INITIALIZER; |
| | | |
| | | /** |
| | | * Convenience initializer to make a new guest pipeline. |
| | | */ |
| | | + (instancetype)guestPipelineQueueWithURLSession:(NSURLSession *)session responseValidator:(nullable id<TWTRNetworkingResponseValidating>)responseValidator; |
| | | |
| | | /** |
| | | * Convenience initializer to make a new user pipeline. |
| | | */ |
| | | + (instancetype)userPipelineQueueWithURLSession:(NSURLSession *)session responseValidator:(nullable id<TWTRNetworkingResponseValidating>)responseValidator; |
| | | |
| | | /** |
| | | * Enqueues a package for processing. |
| | | * @return an NSProgress object which can be used to cancel the request. |
| | | */ |
| | | - (NSProgress *)enqueuePipelinePackage:(TWTRNetworkingPipelinePackage *)package; |
| | | |
| | | /** |
| | | * Use -[TWTRNetworkingPipelineQueue initWithType:URLSession:] instead. |
| | | */ |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRNetworkingUtil.h |
| | | // TWTRNetworking |
| | | // |
| | | // Created by Mustafa Furniturewala on 4/7/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | @interface TWTRNetworkingUtil : NSObject |
| | | |
| | | + (NSString *)queryStringFromParameters:(NSDictionary *)parameters; |
| | | + (NSString *)percentEscapedQueryStringWithString:(NSString *)string encoding:(NSStringEncoding)encoding; |
| | | + (NSDictionary *)parametersFromQueryString:(NSString *)queryString; |
| | | + (NSString *)percentUnescapedQueryStringWithString:(NSString *)string encoding:(NSStringEncoding)encoding; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRRequestSigningOperation.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Chase Latta on 6/24/15. |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | @class TWTRGuestSession; |
| | | @class TWTRNetworkingPipelinePackage; |
| | | @class TWTRSession; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * The block that is executed after the request is signed. |
| | | */ |
| | | typedef void (^TWTRRequestSigningSuccessBlock)(NSURLRequest *signedRequest); |
| | | |
| | | /** |
| | | * The block that is executed if the operation is cancelled. |
| | | */ |
| | | typedef void (^TWTRRequestSigningCancelBlock)(void); |
| | | |
| | | typedef TWTRGuestSession *_Nonnull (^TWTRGuestSessionProvider)(void); |
| | | typedef TWTRSession *_Nonnull (^TWTRUserSessionProvider)(void); |
| | | |
| | | /** |
| | | * Do not instantiate this operation directly. Use one of the concrete |
| | | * subclasses instead. |
| | | */ |
| | | @interface TWTRRequestSigningOperation : NSOperation |
| | | |
| | | @property (nonatomic, readonly) TWTRNetworkingPipelinePackage *networkingPackage; |
| | | |
| | | /** |
| | | * Creates a signing operation. |
| | | * |
| | | * @param package the pipeline package that holds the request to sign |
| | | * @param successBlock a block to execute when the package is signed. |
| | | * @param cancelBlock a block to execute when the operation is cancelled. |
| | | * |
| | | * @note the callback blocks will execute on arbitrary queues. |
| | | */ |
| | | - (instancetype)initWithPackage:(TWTRNetworkingPipelinePackage *)package success:(nullable TWTRRequestSigningSuccessBlock)successBlock cancel:(nullable TWTRRequestSigningCancelBlock)cancelBlock; |
| | | |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | /** |
| | | * Subclasses must implement this method to return the signed request. |
| | | */ |
| | | - (NSURLRequest *)signRequest:(NSURLRequest *)request; |
| | | |
| | | @end |
| | | |
| | | @interface TWTRGuestRequestSigningOperation : TWTRRequestSigningOperation |
| | | |
| | | /** |
| | | * Creates a guest signing operation. |
| | | * |
| | | * @param package the pipeline package that holds the request to sign. |
| | | * @param sessionProvider a block that will execute to provide the session at invocation time. |
| | | * @param successBlock a block to execute when the package is signed. |
| | | * @param cancelBlock a block to execute when the operation is cancelled. |
| | | * |
| | | * @note the callback blocks will execute on arbitrary queues. |
| | | */ |
| | | - (instancetype)initWithPackage:(TWTRNetworkingPipelinePackage *)package sessionProvider:(TWTRGuestSessionProvider)sessionProvider success:(nullable TWTRRequestSigningSuccessBlock)successBlock cancel:(nullable TWTRRequestSigningCancelBlock)cancelBlock; |
| | | |
| | | @end |
| | | |
| | | @interface TWTRUserRequestSigningOperation : TWTRRequestSigningOperation |
| | | |
| | | /** |
| | | * Creates a user signing operation. |
| | | * |
| | | * @param package the pipeline package that holds the request to sign. |
| | | * @param sessionProvider a block that will execute to provide the session at invocation time. |
| | | * @param successBlock a block to execute when the package is signed. |
| | | * @param cancelBlock a block to execute when the operation is cancelled. |
| | | * |
| | | * @note the callback blocks will execute on arbitrary queues. |
| | | */ |
| | | - (instancetype)initWithPackage:(TWTRNetworkingPipelinePackage *)package sessionProvider:(TWTRUserSessionProvider)sessionProvider success:(nullable TWTRRequestSigningSuccessBlock)successBlock cancel:(nullable TWTRRequestSigningCancelBlock)cancelBlock; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRResoucesUtil.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Kang Chen on 8/22/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | #if IS_UIKIT_AVAILABLE |
| | | #import <UIKit/UIKit.h> |
| | | #else |
| | | #import <Cocoa/Cocoa.h> |
| | | #endif |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRResourcesUtilLanguageType; |
| | | |
| | | @interface TWTRResourcesUtil : NSObject |
| | | |
| | | /** |
| | | * Returns the bundle given its name. This is useful for retrieving any bundle and future refactoring |
| | | * such as when Digits has its own kit resources. |
| | | * |
| | | * @param bundlePath path of the bundle e.g. TwitterKitResources.bundle |
| | | * |
| | | * @return the bundle |
| | | */ |
| | | + (NSBundle *)bundleWithBundlePath:(NSString *)bundlePath; |
| | | |
| | | /** |
| | | * Retrieves the localized bundle of the given resource bundle. |
| | | * |
| | | * @param bundle localized bundle |
| | | * |
| | | * @return localized bundle |
| | | */ |
| | | + (NSBundle *)localizedBundleWithBundle:(NSBundle *)bundle; |
| | | |
| | | /** |
| | | * Retrieves the localized bundle for the given bundle path. |
| | | * |
| | | * @param bundlePath path of the bundle e.g. TwitterKitResources.bundle |
| | | * |
| | | * @return localized bundle in the given resource bundle path |
| | | */ |
| | | + (NSBundle *)localizedBundleWithBundlePath:(NSString *)bundlePath; |
| | | |
| | | /** |
| | | * Retrieves the localized string for the given key. If the string is not found in the right locale strings file, falls back to English. |
| | | * |
| | | * @param key key for the desired localized string, e.g. "BUTTON_OKAY" |
| | | * @param bundlePath path of the bundle e.g. TwitterKitResources.bundle |
| | | * |
| | | * @return localized string |
| | | */ |
| | | + (NSString *)localizedStringForKey:(NSString *)key bundlePath:(NSString *)bundlePath; |
| | | |
| | | /** |
| | | * Constructs the canonical user agent string based on |
| | | * kit info in the main bundle. |
| | | * |
| | | * @return Kit user agent string for URL requests. |
| | | */ |
| | | + (NSString *)userAgentFromKitBundle; |
| | | |
| | | /** |
| | | * Returns the localized display name of the application. |
| | | */ |
| | | + (NSString *)localizedApplicationDisplayName; |
| | | |
| | | /** |
| | | * Returns the platform of the application. |
| | | */ |
| | | + (NSString *)platform; |
| | | |
| | | /** |
| | | * Returns the screen scale of the application. |
| | | */ |
| | | + (CGFloat)screenScale; |
| | | |
| | | /** |
| | | * Set the version of the parent Kit (Twitter Kit or Digits) |
| | | */ |
| | | + (void)setKitVersion:(nullable NSString *)version; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRScribeCardEvent.h |
| | | // TwitterCore |
| | | // |
| | | // Created by Kang Chen on 9/30/15. |
| | | // Copyright © 2015 Twitter Inc. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import "TWTRScribeSerializable.h" |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * Type of promotional card. Numeric values are direct mapping of what's in the backend. |
| | | */ |
| | | typedef NS_ENUM(NSUInteger, TWTRScribePromotionCardType) { |
| | | /** |
| | | * Image App Card |
| | | */ |
| | | TWTRScribePromotionCardTypeImageAppDownload = 8, |
| | | }; |
| | | |
| | | /** |
| | | * Immutable representation of a scribe Card event item. |
| | | */ |
| | | @interface TWTRScribeCardEvent : NSObject <TWTRScribeSerializable> |
| | | |
| | | @property (nonatomic, readonly) TWTRScribePromotionCardType promotionCardType; |
| | | |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | - (instancetype)initWithPromotionCardType:(TWTRScribePromotionCardType)promotionCardType; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRScribeClientEventNamespace.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Kang Chen on 11/14/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import "TWTRScribeSerializable.h" |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeClientEventNamespaceEmptyValue; |
| | | |
| | | /** |
| | | * Model object for describing any client events at Twitter. |
| | | * @see https://confluence.twitter.biz/display/ANALYTICS/client_event+Namespacing |
| | | */ |
| | | @interface TWTRScribeClientEventNamespace : NSObject <TWTRScribeSerializable> |
| | | |
| | | /** |
| | | * The client application logging the event. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *client; |
| | | |
| | | /** |
| | | * The page or functional grouping where the event occurred |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *page; |
| | | |
| | | /** |
| | | * A stream or tab on a page. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *section; |
| | | |
| | | /** |
| | | * The actual page component, object, or objects where the event occurred. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *component; |
| | | |
| | | /** |
| | | * A UI element within the component that can be interacted with. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *element; |
| | | |
| | | /** |
| | | * The action the user or application took. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *action; |
| | | |
| | | - (instancetype)init __unavailable; |
| | | - (instancetype)initWithClient:(NSString *)client page:(NSString *)page section:(NSString *)section component:(NSString *)component element:(NSString *)element action:(NSString *)action __attribute__((nonnull)); |
| | | |
| | | #pragma mark - Errors |
| | | |
| | | /** |
| | | * Describes generic errors encounted inside Twitter Kits. |
| | | */ |
| | | + (instancetype)errorNamespace; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRScribeClientEventNamespace_Private.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Kang Chen on 11/18/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeClientEventNamespaceClientKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeClientEventNamespacePageKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeClientEventNamespaceSectionKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeClientEventNamespaceComponentKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeClientEventNamespaceElementKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeClientEventNamespaceActionKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeClientEventNamespaceTimelineValue; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeClientEventNamespaceInitialValue; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeClientEventNamespaceCredentialsPage; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeClientEventNamespaceImpressionAction; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeClientEventNamespaceShowAction; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeClientEventNamespaceNavigateAction; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeClientEventNamespaceDismissAction; |
New file |
| | |
| | | // |
| | | // TWTRScribeEvent.h |
| | | // |
| | | // Created by Mustafa Furniturewala on 7/21/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import "TFSScribe.h" |
| | | #import "TWTRScribeClientEventNamespace.h" |
| | | #import "TWTRScribeItem.h" |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventImpressionClient; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventImpressionPage; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventImpressionSectionTweet; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventImpressionSectionQuoteTweet; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventImpressionSectionVideo; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventImpressionSectionGallery; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventImpressionSectionAuth; |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventImpressionComponent; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEmptyKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventImpressionTypeLoad; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventImpressionTypeImpression; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventImpressionTypeShare; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventImpressionAction; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventActionClick; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventActionFilter; |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventUniquesClient; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventUniquesPageTweetViews; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventUniquesPageLogin; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeEventUniquesAction; |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeActionLike; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeActionUnlike; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeActionStart; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeActionSuccess; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeActionCancelled; |
| | | FOUNDATION_EXPORT NSString *const TWTRScribeActionFailure; |
| | | |
| | | /** |
| | | * Possible values for which category to scribe events to. |
| | | */ |
| | | typedef NS_ENUM(NSUInteger, TWTRScribeEventCategory) { |
| | | /** |
| | | * Used for logging impressions and feature usage for Tweet views. |
| | | */ |
| | | TWTRScribeEventCategoryImpressions = 1, |
| | | /** |
| | | * Used only for logging number of uniques using the Kit. There are no browsing history logged, |
| | | * so we can keep the events longer to calculate monthly actives. |
| | | */ |
| | | TWTRScribeEventCategoryUniques |
| | | }; |
| | | |
| | | @interface TWTRScribeEvent : NSObject <TFSScribeEventParameters> |
| | | |
| | | @property (nonatomic, copy, readonly, nullable) NSString *userID; |
| | | @property (nonatomic, copy, readonly, nullable) NSString *tweetID; |
| | | @property (nonatomic, copy, readonly) NSString *eventInfo; |
| | | @property (nonatomic, assign, readonly) TWTRScribeEventCategory category; |
| | | @property (nonatomic, copy, readonly) TWTRScribeClientEventNamespace *eventNamespace; |
| | | @property (nonatomic, copy, readonly) NSArray<TWTRScribeItem *> *items; |
| | | |
| | | - (instancetype)init __unavailable; |
| | | - (instancetype)initWithUserID:(nullable NSString *)userID tweetID:(nullable NSString *)tweetID category:(TWTRScribeEventCategory)category eventNamespace:(TWTRScribeClientEventNamespace *)eventNamespace items:(nullable NSArray<TWTRScribeItem *> *)items; |
| | | |
| | | - (instancetype)initWithUserID:(nullable NSString *)userID eventInfo:(nullable NSString *)eventInfo category:(TWTRScribeEventCategory)category eventNamespace:(TWTRScribeClientEventNamespace *)eventNamespace items:(nullable NSArray<TWTRScribeItem *> *)items; |
| | | |
| | | #pragma mark - TFSScribeEventParameters |
| | | |
| | | - (NSDictionary *)dictionaryRepresentation; |
| | | - (NSString *)userID; |
| | | - (NSData *)data; |
| | | |
| | | @end |
| | | |
| | | /** |
| | | * A Scribe event for logging errors to the Twitter backend |
| | | */ |
| | | @interface TWTRErrorScribeEvent : TWTRScribeEvent |
| | | |
| | | @property (nonatomic, readonly) NSError *error; |
| | | @property (nonatomic, copy, readonly) NSString *errorMessage; |
| | | |
| | | /** |
| | | * Initializer |
| | | * |
| | | * @param error (optional) An NSError object representing this error case. |
| | | * @param errorMessage (required) An error message describing the error situation. |
| | | * |
| | | * @return A fully initialized scribe object ready to enqueue or nil if any of |
| | | * the required parameters are missing. |
| | | */ |
| | | - (instancetype)initWithError:(nullable NSError *)error message:(NSString *)errorMessage; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRScribeFilterDetails.h |
| | | // TwitterCore |
| | | // |
| | | // Created by Jaihee Lee on 12/1/16. |
| | | // Copyright © 2016 Twitter Inc. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import "TWTRScribeSerializable.h" |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | typedef NS_ENUM(NSUInteger, TWTRScribeFilterDetailsType) { |
| | | |
| | | TWTRScribeFilterDetailsTypeDefault = 1, |
| | | TWTRScribeFilterDetailsTypeCompact = 2 |
| | | }; |
| | | |
| | | @interface TWTRScribeFilterDetails : NSObject <TWTRScribeSerializable> |
| | | |
| | | @property (nonatomic) NSUInteger totalFilteredTweets; |
| | | @property (nonatomic) NSUInteger requestedTweets; |
| | | @property (nonatomic) NSUInteger totalFilters; |
| | | @property (nonatomic, assign, readonly) TWTRScribeFilterDetailsType scribeType; |
| | | |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | - (instancetype)initWithFilters:(NSUInteger)totalFilters; |
| | | /** |
| | | * Initializes a new filter detail scribe item. |
| | | * |
| | | * @param totalFilters number of filters |
| | | * @param requestedTweets number of tweets requested to filter |
| | | * @param totalFilteredTweets number of tweets that got filtered |
| | | * |
| | | * @return A new filter detail scribe item. |
| | | */ |
| | | - (instancetype)initWithRequestedTweets:(NSUInteger)requestedTweets totalFilters:(NSUInteger)totalFilters totalFilteredTweets:(NSUInteger)totalFilteredTweets; |
| | | |
| | | - (NSString *)stringRepresentation; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRScribeItem.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Kang Chen on 11/18/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | @class TWTRScribeFilterDetails; |
| | | @class TWTRScribeMediaDetails; |
| | | @class TWTRScribeCardEvent; |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import "TWTRScribeSerializable.h" |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * The type of item (tweet, user, trend, list, etc). Certain values are deprecated so be sure to |
| | | * check `client_app.thrift` before adding more fields. The raw values here are exactly as they appear |
| | | * on the backend so do not change without double checking against the thrift IDL. |
| | | */ |
| | | typedef NS_ENUM(NSUInteger, TWTRScribeItemType) { TWTRScribeItemTypeTweet = 0, TWTRScribeItemTypeUser = 3, TWTRScribeItemTypeMessage = 6, TWTRScribeItemTypeCustomTimeline = 17 }; |
| | | |
| | | /** |
| | | * Model object describing Scribe event details. `Items` is a property of `EventDetails` containing |
| | | * details of what the specific item being scribed is e.g. type = Tweet and Tweet ID. This model only |
| | | * contains a subset of what's defined in `client_app.thrift`. |
| | | * @see https://cgit.twitter.biz/source/tree/science/src/thrift/com/twitter/clientapp/gen/client_app.thrift |
| | | */ |
| | | @interface TWTRScribeItem : NSObject <TWTRScribeSerializable> |
| | | |
| | | @property (nonatomic, assign, readonly) TWTRScribeItemType itemType; |
| | | /** |
| | | * Using String instead of 64-bit int on the backend for convenience. |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) NSString *itemID; |
| | | |
| | | @property (nonatomic, readonly, nullable) TWTRScribeCardEvent *cardEvent; |
| | | |
| | | @property (nonatomic, readonly, nullable) TWTRScribeMediaDetails *mediaDetails; |
| | | |
| | | @property (nonatomic, readonly, nullable) TWTRScribeFilterDetails *filterDetails; |
| | | |
| | | - (instancetype)init __attribute__((unavailable("Every attribute is optional on the backend but we want to be stricter on the client."))); |
| | | - (instancetype)initWithItemType:(TWTRScribeItemType)itemType itemID:(NSString *)itemID; |
| | | - (instancetype)initWithItemType:(TWTRScribeItemType)itemType itemID:(nullable NSString *)itemID cardEvent:(nullable TWTRScribeCardEvent *)cardEvent mediaDetails:(nullable TWTRScribeMediaDetails *)mediaDetails; |
| | | /** |
| | | * Initiatizes a generic Scribe Item typically displayed in streams or dashboard modules e.g. Timelines |
| | | * |
| | | * @param itemType the type of item displayed |
| | | * @param itemID corresponds to `Item.id` but `id` is keyword in ObjC. This is used to describe |
| | | * the `Item`'s identifier e.g. Tweet ID |
| | | * @param cardEvent Information pertaining to the Twitter Card displayed. |
| | | * @param mediaDetails Information pertaining to the media rendered in the item. |
| | | * @param filterDetails Information pertainng to the timeline filter. |
| | | * |
| | | */ |
| | | - (instancetype)initWithItemType:(TWTRScribeItemType)itemType itemID:(nullable NSString *)itemID cardEvent:(nullable TWTRScribeCardEvent *)cardEvent mediaDetails:(nullable TWTRScribeMediaDetails *)mediaDetails filterDetails:(nullable TWTRScribeFilterDetails *)filterDetails NS_DESIGNATED_INITIALIZER; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRScribeMediaDetails.h |
| | | // TwitterCore |
| | | // |
| | | // Created by Kang Chen on 11/18/15. |
| | | // Copyright © 2015 Twitter Inc. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import "TWTRScribeSerializable.h" |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * Mapping to `MediaType` in scribing. |
| | | */ |
| | | typedef NS_ENUM(NSUInteger, TWTRScribeMediaType) { |
| | | /** |
| | | * Consumer video uploaded to Twitter. |
| | | */ |
| | | TWTRScribeMediaTypeConsumerVideo = 1, |
| | | /** |
| | | * Amplify videos. |
| | | */ |
| | | TWTRScribeMediaTypeProfessionalVideo = 2, |
| | | /** |
| | | * Gif as a video. |
| | | */ |
| | | TWTRScribeMediaTypeGIF = 3, |
| | | /** |
| | | * Vine as a video. |
| | | */ |
| | | TWTRScribeMediaTypeVine = 4 |
| | | }; |
| | | |
| | | @interface TWTRScribeMediaDetails : NSObject <TWTRScribeSerializable> |
| | | |
| | | @property (nonatomic, readonly, copy) NSString *publisherID; |
| | | @property (nonatomic, readonly, copy) NSString *contentID; |
| | | @property (nonatomic, readonly) TWTRScribeMediaType mediaType; |
| | | |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | /** |
| | | * Initializes a new media detail scribe item. |
| | | * |
| | | * @param publisherID Owner (publisher) of the content. This is often the Twitter user. |
| | | * @param contentID UUID to the content. This is often the entity ID. |
| | | * @param mediaType Type of media included. |
| | | * |
| | | * @return A new media detail scribe item. |
| | | */ |
| | | - (instancetype)initWithPublisherID:(NSString *)publisherID contentID:(NSString *)contentID mediaType:(TWTRScribeMediaType)mediaType; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRScribeSerializable.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Kang Chen on 11/18/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | /** |
| | | * Protocol for Scribe event objects. Objects that conform to this protocol should easily serialize |
| | | * itself into an intermediate dictionary that can be further serialized into scribe event JSON. |
| | | */ |
| | | @protocol TWTRScribeSerializable <NSObject> |
| | | |
| | | /** |
| | | * Canonical key used to serialize object to Scribe event JSON. |
| | | */ |
| | | + (NSString *)scribeKey; |
| | | /** |
| | | * Dictionary used to serialize object to Scribe event JSON. |
| | | */ |
| | | - (NSDictionary *)dictionaryRepresentation; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRScribeService.h |
| | | // |
| | | // Created by Mustafa Furniturewala on 7/21/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | @class TFSScribe; |
| | | @class TWTRScribeEvent; |
| | | @class TWTRAPIClient; |
| | | @class TWTRAuthConfig; |
| | | @class TWTRGuestSession; |
| | | @class TWTRNetworkingPipeline; |
| | | @class TWTRSessionStore; |
| | | @class TwitterNetworking; |
| | | @protocol TWTRAuthSession; |
| | | @protocol TWTRAPIServiceConfig; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | @interface TWTRScribeService : NSObject |
| | | |
| | | - (instancetype)initWithScribe:(TFSScribe *)scribe scribeAPIServiceConfig:(id<TWTRAPIServiceConfig>)APIserviceConfig; |
| | | |
| | | - (instancetype)init __unavailable; |
| | | |
| | | /** |
| | | This method must be called before the scribe attempts to enqueue any network requests. |
| | | */ |
| | | - (void)setSessionStore:(TWTRSessionStore *)sessionStore networkingPipeline:(TWTRNetworkingPipeline *)pipeline; |
| | | |
| | | - (void)enqueueEvent:(nullable TWTRScribeEvent *)event; |
| | | - (void)enqueueEvents:(nullable NSArray *)events; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRSessionMigrating.h |
| | | // TwitterCore |
| | | // |
| | | // Copyright (c) 2015 Twitter Inc. All rights reserved. |
| | | // |
| | | |
| | | #import <TwitterCore/TWTRSessionStore.h> |
| | | |
| | | @protocol TWTRSessionMigrating <NSObject> |
| | | |
| | | /** |
| | | * Specifies that the migrator should migrate any existing sessions into the given store. |
| | | * |
| | | * @param store the store to migrate sessions to |
| | | * @param removeOnSuccess if the migrator should remove the sessions on successful migration. |
| | | */ |
| | | - (void)runMigrationWithDestination:(id<TWTRSessionStore>)store removeOnSuccess:(BOOL)removeOnSuccess; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRSessionRefreshStrategy.h |
| | | // TwitterCore |
| | | // |
| | | // Created by Kang Chen on 6/24/15. |
| | | // Copyright (c) 2015 Twitter Inc. All rights reserved. |
| | | // |
| | | |
| | | @class TWTRAuthConfig; |
| | | @protocol TWTRAPIServiceConfig; |
| | | @protocol TWTRBaseSession; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * Completion block to call when done refreshing the session or it fails. |
| | | * |
| | | * @param refreshedSession The refreshed session |
| | | * @param error Non nil error if the refresh fails. |
| | | */ |
| | | typedef void (^TWTRSessionRefreshCompletion)(id _Nullable refreshedSession, NSError *_Nullable error); |
| | | |
| | | /** |
| | | * Protocol for session refresh strategies. |
| | | */ |
| | | @protocol TWTRSessionRefreshStrategy <NSObject> |
| | | |
| | | /** |
| | | * Determines whether the strategy supports the given session class. |
| | | * |
| | | * @param sessionClass The class of session to check. |
| | | * |
| | | * @return YES if this strategy can be used to refresh the given session class. |
| | | */ |
| | | + (BOOL)canSupportSessionClass:(Class)sessionClass; |
| | | |
| | | /** |
| | | * Determines whether the session has expired based on the API response of a previous API request made with the session. |
| | | * |
| | | * @param response HTTP response of a previous API request |
| | | * |
| | | * @return YES if the HTTP response is contains information to indicate the session is invalid or has expired. |
| | | */ |
| | | + (BOOL)isSessionExpiredBasedOnRequestResponse:(NSHTTPURLResponse *)response; |
| | | |
| | | /** |
| | | * Determines whether the session has expired based on the API response error of a previous API request made with the session. |
| | | * |
| | | * @param response error a previous API request |
| | | * |
| | | * @return YES if the error contains information to indicate the session is invalid or has expired. |
| | | */ |
| | | + (BOOL)isSessionExpiredBasedOnRequestError:(NSError *)responseError; |
| | | |
| | | /** |
| | | * Request to fetch a new session. |
| | | * |
| | | * @param session Expired session to request new one for |
| | | * @param URLSession URL session to make the authentication request with |
| | | * @param completion Completion block to call when done refreshing the session or it fails. |
| | | */ |
| | | - (void)refreshSession:(id<TWTRBaseSession>)session URLSession:(NSURLSession *)URLSession completion:(TWTRSessionRefreshCompletion)completion; |
| | | |
| | | @end |
| | | |
| | | /** |
| | | Concrete implementation of a strategy for handling expiration and refresh of guest sessions. |
| | | */ |
| | | @interface TWTRGuestSessionRefreshStrategy : NSObject <TWTRSessionRefreshStrategy> |
| | | |
| | | /** |
| | | * Initializes a new guest refresh strategy. |
| | | * |
| | | * @param authConfig The `authConfig` associated with the app to refresh guest sessions for |
| | | * @param APIServiceConfig The API service config to configure endpoints |
| | | * |
| | | * @return Initialized strategy that can refresh guest sessions of the given application |
| | | */ |
| | | - (instancetype)initWithAuthConfig:(TWTRAuthConfig *)authConfig APIServiceConfig:(id<TWTRAPIServiceConfig>)APIServiceConfig; |
| | | - (instancetype)init __unavailable; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRSessionStore_Private.h |
| | | // TwitterCore |
| | | // |
| | | // Created by Kang Chen on 7/22/15. |
| | | // Copyright (c) 2015 Twitter Inc. All rights reserved. |
| | | // |
| | | |
| | | // TODO: this is temporary. clean up after refactoring scribe layer |
| | | #import <TwitterCore/TWTRSessionStore.h> |
| | | #import "TWTRScribeService.h" |
| | | |
| | | @class TWTRAuthConfig; |
| | | @protocol TWTRAPIServiceConfig; |
| | | @protocol TWTRRefreshStrategies; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | typedef void (^TWTRSessionStoreLogoutHook)(NSString *userID); |
| | | |
| | | /** |
| | | * Completion block called when login succeeds or fails. |
| | | * |
| | | * @param session Contains the OAuth tokens and minimal information associated with the logged in user or nil. |
| | | * @param error Error that will be non nil if the authentication request fails. |
| | | */ |
| | | typedef void (^TWTRSessionLogInCompletion)(id<TWTRAuthSession> _Nullable session, NSError *_Nullable error); |
| | | |
| | | typedef void (^TWTRSessionStoreUserSessionSavedCompletion)(id<TWTRAuthSession> session); |
| | | |
| | | @protocol TWTRUserSessionStore_Private <TWTRSessionStore> |
| | | |
| | | /** |
| | | * Saves the existing session to the store after validations. |
| | | * |
| | | * @param session The user session to save |
| | | * @param withVerification Whether to verify against the backend before saving this session |
| | | * @param completion Completion block to call when the save request succeeds or fails |
| | | */ |
| | | - (void)saveSession:(id<TWTRAuthSession>)session withVerification:(BOOL)withVerification completion:(TWTRSessionStoreSaveCompletion)completion; |
| | | |
| | | /** |
| | | * Triggers user authentication with Twitter. |
| | | * |
| | | * @param completion Completion block to call when authentication succeeds or fails. |
| | | */ |
| | | - (void)logInWithSystemAccountsCompletion:(TWTRSessionLogInCompletion)completion __TVOS_UNAVAILABLE; |
| | | |
| | | @end |
| | | |
| | | @protocol TWTRSessionStore_Private <TWTRUserSessionStore_Private> |
| | | |
| | | /** |
| | | * The current guest session. |
| | | * |
| | | * @note This might not always reflect the latest state of the guest session. Use `fetchGuestSessionWithCompletion:` to get the latest guest session. |
| | | */ |
| | | @property (nonatomic, readwrite, nullable) TWTRGuestSession *guestSession; |
| | | |
| | | @end |
| | | |
| | | @interface TWTRSessionStore () <TWTRSessionStore_Private> |
| | | |
| | | /** |
| | | * Logger for logging important session lifecycle events. |
| | | * Scribe service used to log events. |
| | | */ |
| | | @property (nonatomic, readonly) id<TWTRErrorLogger> errorLogger; |
| | | |
| | | /** |
| | | * Service config for configuring endpoints to make auth requests against. |
| | | */ |
| | | @property (nonatomic, readonly) id<TWTRAPIServiceConfig> APIServiceConfig; |
| | | |
| | | /* |
| | | * Called when the logoutUserID: method is called. |
| | | */ |
| | | @property (nonatomic, copy, nullable) TWTRSessionStoreLogoutHook userLogoutHook; |
| | | |
| | | /** |
| | | * Completion block invoked whenever a user session is saved to the store. |
| | | */ |
| | | @property (nonatomic, copy, nullable) TWTRSessionStoreUserSessionSavedCompletion userSessionSavedCompletion; |
| | | |
| | | /** |
| | | * Designated initializer for creating a new session store. |
| | | * |
| | | * @param authConfig (required) Auth config containing the app `consumerKey` and `consumerSecret` |
| | | * @param APIServiceConfig (required) API service config for specifying server endpoints |
| | | * @param refreshStrategies (required) Strategies to use to refresh sessions |
| | | * @param URLSession (required) URL session used to make authentication requests |
| | | * @param eventLogger (required) Logger for logging important session lifecycle events. **This should be removed before we hit production** |
| | | * @param accessGroup (optional) An optional access group to use for persistence to the store. |
| | | * |
| | | * @return A fully initialized session store. |
| | | */ |
| | | - (instancetype)initWithAuthConfig:(TWTRAuthConfig *)authConfig APIServiceConfig:(id<TWTRAPIServiceConfig>)APIServiceConfig refreshStrategies:(NSArray *)refreshStrategies URLSession:(NSURLSession *)URLSession errorLogger:(id<TWTRErrorLogger>)errorLogger; |
| | | - (instancetype)initWithAuthConfig:(TWTRAuthConfig *)authConfig APIServiceConfig:(id<TWTRAPIServiceConfig>)APIServiceConfig refreshStrategies:(NSArray *)refreshStrategies URLSession:(NSURLSession *)URLSession errorLogger:(id<TWTRErrorLogger>)errorLogger accessGroup:(nullable NSString *)accessGroup NS_DESIGNATED_INITIALIZER; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRSession_Private.h |
| | | // TwitterCore |
| | | // |
| | | // Created by Kang Chen on 9/6/15. |
| | | // Copyright (c) 2015 Twitter Inc. All rights reserved. |
| | | // |
| | | |
| | | #import <TwitterCore/TWTRSession.h> |
| | | |
| | | @interface TWTRSession () |
| | | |
| | | /** |
| | | * Returns YES if the dictionary represents a valid dictionary that can |
| | | * safely be used to instantiate the TWTRSession object. |
| | | */ |
| | | + (BOOL)isValidSessionDictionary:(NSDictionary *)dictionary; |
| | | |
| | | /** |
| | | * Returns a new dictionary of the stored tokens and user context. |
| | | */ |
| | | - (NSDictionary *)dictionaryRepresentation; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRTokenOnlyAuthSession.h |
| | | // TwitterCore |
| | | // |
| | | // Created by Chase Latta on 6/12/15. |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import "TWTRAuthSession.h" |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | @interface TWTRTokenOnlyAuthSession : NSObject <TWTRAuthSession> |
| | | |
| | | @property (nonatomic, copy, readonly) NSString *authToken; |
| | | |
| | | @property (nonatomic, copy, readonly) NSString *authTokenSecret; |
| | | |
| | | /** |
| | | * This value is here to satisfy TWTRAuthSession protocol but |
| | | * it defaults to an empty string and cannot be updated. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *userID; |
| | | |
| | | - (instancetype)initWithToken:(NSString *)authToken secret:(NSString *)authTokenSecret; |
| | | + (instancetype)authSessionWithToken:(NSString *)authToken secret:(NSString *)authTokenSecret; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRUserAuthRequestSigner.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Kang Chen on 7/1/15. |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | @class TWTRAuthConfig; |
| | | @protocol TWTRAuthSession; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * Signer abstracting logic and type of user auth to sign a user authenticated network request. |
| | | */ |
| | | @interface TWTRUserAuthRequestSigner : NSObject |
| | | |
| | | /** |
| | | * Signs the given request with the appropriate user authentication headers. |
| | | * |
| | | * @param URLRequest URL request to sign |
| | | * @param authConfig The auth config containing the app's `consumerKey` and `consumerSecret` |
| | | * @param session The authenticated user session |
| | | * |
| | | * @return The signed URL request |
| | | */ |
| | | + (NSURLRequest *)signedURLRequest:(NSURLRequest *)URLRequest authConfig:(TWTRAuthConfig *)authConfig session:(id<TWTRAuthSession>)session; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRUserSessionVerifier.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Kang Chen on 1/23/15. |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | @class TWTRUserSessionVerifier; |
| | | |
| | | @protocol TWTRUserSessionVerifierDelegate <NSObject> |
| | | |
| | | - (void)userSessionVerifierNeedsSessionVerification:(TWTRUserSessionVerifier *)userSessionVerifier; |
| | | |
| | | @end |
| | | |
| | | FOUNDATION_EXPORT NSTimeInterval const TWTRUserSessionVerifierIntervalDaily; |
| | | FOUNDATION_EXPORT NSTimeInterval const TWTRUserSessionVerifierDefaultDelay; |
| | | |
| | | /** |
| | | * Manages verifying stored user sessions on a daily basis. This class depends on the Kit lifecycle |
| | | * and `UIApplicationWillEnterForegroundNotification` event and checks whether the last verified |
| | | * time has exceeded a day based on UTC date boundaries. Note that this does not mean we will aggressively |
| | | * verify the second day of someone that started using the app at 11:59P and continues past 12:00A |
| | | * due to 1) avoiding load spike to backend and 2) there is no good reliable way to randomize the |
| | | * scheduling of the second verification due to constraints of iOS. Last verified time is only stored in memory |
| | | * to minimize overhead on the host application. Verification is done on a best effort basis and we |
| | | * will not retry if the network call fails for whatever reason. |
| | | */ |
| | | @interface TWTRUserSessionVerifier : NSObject |
| | | |
| | | - (instancetype)init __unavailable; |
| | | |
| | | /** |
| | | * Initializes a verifier for the current consumer application. |
| | | * |
| | | * @param delegate An object that will handle the verification of the session when necessary |
| | | * @param maxDesiredInterval maximum desireable interval for how frequently a verify call should be made while |
| | | * the host app is active. Calls might be made more frequently if the app is used |
| | | * during the previous and current interval boundaries or we cannot not tell when |
| | | * the last call was made. The latter will be de-dup on the backend. |
| | | */ |
| | | - (instancetype)initWithDelegate:(id<TWTRUserSessionVerifierDelegate>)delegate maxDesiredInterval:(NSTimeInterval)maxDesiredInterval __attribute__((nonnull(1)))NS_DESIGNATED_INITIALIZER; |
| | | |
| | | /** |
| | | * Makes a verify call immediately (delayed slightly to minimize app startup impact) and then |
| | | * subscribes to `UIApplicationWillEnterForegroundNotification` to check for the next time we should |
| | | * be making a verify call. |
| | | * |
| | | * @param delay The minimum time before which the message is sent. Specifying a delay of 0 does not |
| | | * necessarily cause the selector to be performed immediately. The first verification is |
| | | * still queued on the thread’s run loop and performed as soon as possible. |
| | | */ |
| | | - (void)startVerificationAfterDelay:(NSTimeInterval)delay; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRUtils.h |
| | | // TWTRAuthentication |
| | | // |
| | | // Created by Mustafa Furniturewala on 2/6/14. |
| | | // Copyright (c) 2014 Mustafa Furniturewala. All rights reserved. |
| | | // |
| | | |
| | | #if IS_UIKIT_AVAILABLE |
| | | #import <UIKit/UIKit.h> |
| | | #else |
| | | #import <Cocoa/Cocoa.h> |
| | | #endif |
| | | |
| | | @interface TWTRUtils : NSObject |
| | | |
| | | + (NSDictionary *)dictionaryWithQueryString:(NSString *)queryString; |
| | | + (NSString *)queryStringFromDictionary:(NSDictionary *)dictionary; |
| | | + (NSString *)urlEncodedStringForString:(NSString *)inputString; |
| | | + (NSString *)urlDecodedStringForString:(NSString *)inputString; |
| | | + (NSString *)base64EncodedStringWithData:(NSData *)data; |
| | | #if IS_UIKIT_AVAILABLE |
| | | + (UIViewController *)topViewController; |
| | | #endif |
| | | + (NSString *)localizedLongAppName; |
| | | + (NSString *)localizedShortAppName; |
| | | |
| | | /** |
| | | * Returns YES if both objects are nil or if obj. |
| | | */ |
| | | + (BOOL)isEqualOrBothNil:(NSObject *)obj other:(NSObject *)otherObj; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TwitterAppAPIClient.h |
| | | // |
| | | // Created by Alden Keefe Sampson on 5/7/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import "TwitterNetworking.h" |
| | | |
| | | @class TWTRAuthConfig; |
| | | |
| | | /** |
| | | An Twitter Social HTTP API client for use with an Application only access token. |
| | | Application only auth allows for an app to access some Twitter content without a logged in user. |
| | | To obtain an app only access token use TWTRAuthClient. |
| | | For more about application only auth see https://dev.twitter.com/docs/auth/application-only-auth . |
| | | |
| | | If you have a logged in user, use TwitterUserAPIClient. |
| | | */ |
| | | @interface TwitterAppAPIClient : TwitterNetworking |
| | | |
| | | // The application only access token |
| | | @property (nonatomic, readonly) NSString *accessToken; |
| | | |
| | | /** |
| | | Designated initializer. Returns nil if access token is missing. |
| | | @param accessToken An application only access token. |
| | | */ |
| | | - (instancetype)initWithAuthConfig:(TWTRAuthConfig *)authConfig accessToken:(NSString *)accessToken; |
| | | - (instancetype)initWithAuthConfig:(TWTRAuthConfig *)authConfig __unavailable; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRNetworking.h |
| | | // TWTRNetworking |
| | | // |
| | | // Created by Mustafa Furniturewala on 4/7/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | @class TWTRAuthConfig; |
| | | /** |
| | | * Completion block called when the network request succeeds or fails. |
| | | * |
| | | * @param response Metadata associated with the response to a URL load request. |
| | | * @param data Content data of the response. |
| | | * @param connectionError Error object describing the network error that occurred. |
| | | */ |
| | | typedef void (^TWTRTwitterNetworkCompletion)(NSURLResponse *response, NSData *data, NSError *connectionError); |
| | | |
| | | @interface TwitterNetworking : NSObject |
| | | |
| | | @property (nonatomic, readonly) TWTRAuthConfig *authConfig; |
| | | |
| | | - (instancetype)init __unavailable; |
| | | - (instancetype)initWithAuthConfig:(TWTRAuthConfig *)authConfig; |
| | | |
| | | - (NSURLRequest *)GET:(NSString *)URLString parameters:(NSDictionary *)parameters; |
| | | - (NSURLRequest *)POST:(NSString *)URLString parameters:(NSDictionary *)parameters; |
| | | - (NSURLRequest *)DELETE:(NSString *)URLString parameters:(NSDictionary *)parameters; |
| | | |
| | | - (NSURLRequest *)URLRequestWithMethod:(NSString *)method URL:(NSString *)URLString parameters:(NSDictionary *)parameters; |
| | | |
| | | - (void)sendAsynchronousRequest:(NSURLRequest *)request completion:(TWTRTwitterNetworkCompletion)completion; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TwitterUserAPIClient.h |
| | | // TwitterUserAPIClient |
| | | // |
| | | // Created by Mustafa Furniturewala on 4/7/14. |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import "TwitterNetworking.h" |
| | | |
| | | @interface TwitterUserAPIClient : TwitterNetworking |
| | | |
| | | - (instancetype)initWithAuthConfig:(TWTRAuthConfig *)authConfig __unavailable; |
| | | - (instancetype)initWithAuthConfig:(TWTRAuthConfig *)authConfig authToken:(NSString *)authToken authTokenSecret:(NSString *)authTokenSecret; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRAPIClient.h |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | @class TWTRUser; |
| | | @class TWTRTweet; |
| | | @class TWTRAuthConfig; |
| | | @class TWTRGuestSession; |
| | | @protocol TWTRAuthSession; |
| | | @protocol TWTRSessionStore; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRTweetsNotLoadedKey; |
| | | |
| | | /** |
| | | * @name Completion Block Types |
| | | */ |
| | | |
| | | /** |
| | | * Completion block called when the load user request succeeds or fails. |
| | | * |
| | | * @param user The Twitter User. |
| | | * @param error Error that will be set if the API request failed. |
| | | */ |
| | | typedef void (^TWTRLoadUserCompletion)(TWTRUser *_Nullable user, NSError *_Nullable error); |
| | | |
| | | /** |
| | | * Completion block called when the load Tweet request succeeds or fails. |
| | | * |
| | | * @param tweet The Twitter Tweet. |
| | | * @param error Error that will be set if the API request failed. |
| | | */ |
| | | typedef void (^TWTRLoadTweetCompletion)(TWTRTweet *_Nullable tweet, NSError *_Nullable error); |
| | | |
| | | /** |
| | | * Completion block called when the load Tweets request succeeds or fails. |
| | | * |
| | | * @param tweets Tweets that were successfully retrieved. |
| | | * @param error Error that will be set if the API request failed. |
| | | */ |
| | | typedef void (^TWTRLoadTweetsCompletion)(NSArray<TWTRTweet *> *_Nullable tweets, NSError *_Nullable error); |
| | | |
| | | /** |
| | | * Completion block called when the network request succeeds or fails. |
| | | * |
| | | * @param response Metadata associated with the response to a URL load request. |
| | | * @param data Content data of the response. |
| | | * @param connectionError Error object describing the network error that occurred. |
| | | */ |
| | | typedef void (^TWTRNetworkCompletion)(NSURLResponse *_Nullable response, NSData *_Nullable data, NSError *_Nullable connectionError); |
| | | |
| | | /** |
| | | * Completion block called when a JSON request to the Twitter API succeeds or fails. |
| | | * |
| | | * @param response Metadata associated with the response to a URL load request. |
| | | * @param responseObject Content data of the response. |
| | | * @param error Error object describing the network error that occurred. |
| | | */ |
| | | typedef void (^TWTRJSONRequestCompletion)(NSURLResponse *_Nullable response, id _Nullable responseObject, NSError *_Nullable error); |
| | | |
| | | /** |
| | | * Completion block called when a Tweet action (favorite/retweet) is performed. |
| | | * |
| | | * @param tweet The Tweet object representing the new state of this Tweet from |
| | | * the perspective of the currently-logged in user. |
| | | * @param error Error object describing the error that occurred. This will be either a |
| | | * network error or an NSError with an errorCode corresponding to |
| | | * TWTRAPIErrorCodeAlreadyFavorited or TWTRAPIErrorCodeAlreadyRetweeted |
| | | * for an attempted action that has already been taken from the servers |
| | | * point of view for this logged-in user. |
| | | */ |
| | | typedef void (^TWTRTweetActionCompletion)(TWTRTweet *_Nullable tweet, NSError *_Nullable error); |
| | | |
| | | /** |
| | | * Completion block called when a media upload request to the Twitter API succeeds or fails. |
| | | * |
| | | * @param mediaID The media ID of the object that was uploaded which can be used when tweeting. |
| | | * @param error Error object describing the network error that occurred. |
| | | */ |
| | | typedef void (^TWTRMediaUploadResponseCompletion)(NSString *_Nullable mediaID, NSError *_Nullable error); |
| | | |
| | | /** |
| | | * Completion block called when the send Tweet request succeeds or fails. |
| | | * |
| | | * @param tweet The Twitter Tweet created. |
| | | * @param error Error that will be set if the API request failed. |
| | | */ |
| | | typedef void (^TWTRSendTweetCompletion)(TWTRTweet *_Nullable tweet, NSError *_Nullable error); |
| | | |
| | | /** |
| | | * Completion block called when a request for the user's email succeeds or fails. |
| | | * |
| | | * @param email The email of the user |
| | | * @param error Error object describing the error that occurred. |
| | | */ |
| | | typedef void (^TWTRRequestEmailCompletion)(NSString *_Nullable email, NSError *_Nullable error); |
| | | |
| | | /** |
| | | * Client for consuming the Twitter REST API. Provides methods for common API requests, as well as the ability to create and send custom requests. |
| | | */ |
| | | @interface TWTRAPIClient : NSObject |
| | | |
| | | /** |
| | | * The Twitter user ID this client is making API requests on behalf of or |
| | | * nil if it is a guest user. |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) NSString *userID; |
| | | |
| | | /** |
| | | * Constructs a `TWTRAPIClient` object to perform authenticated API requests with user authentication. |
| | | * |
| | | * @param userID (optional) ID of the user to make requests on behalf of. If the ID is nil requests will be made using guest authentication. |
| | | * |
| | | * @return Fully initialized API client to make authenticated requests against the Twitter REST API. |
| | | */ |
| | | - (instancetype)initWithUserID:(nullable NSString *)userID; |
| | | |
| | | /** |
| | | * Constructs a `TWTRAPIClient` with the last logged-in user. If no user has been |
| | | * logged in yet this falls back to Guest authentication. |
| | | * |
| | | * @return Fully initialized API client to make Guest or User authenticated requests to the Twitter REST API. |
| | | */ |
| | | + (instancetype)clientWithCurrentUser; |
| | | |
| | | /** |
| | | * @name Making Requests |
| | | */ |
| | | |
| | | /** |
| | | * Returns a signed URL request. |
| | | * |
| | | * @param method Request method, GET, POST, PUT, DELETE, etc. |
| | | * @param URLString Request URL. This is the full Twitter API URL. E.g. https://api.twitter.com/1.1/statuses/user_timeline.json |
| | | * @param parameters Request parameters. |
| | | * @param error Error that will be set if there was an error signing the request. |
| | | * |
| | | * @note If the request is not sent with the -[TWTRAPIClient sendTwitterRequest:completion:] method it is the developers responsibility to ensure that there is a valid guest session before this method is called. |
| | | */ |
| | | - (NSURLRequest *)URLRequestWithMethod:(NSString *)method URL:(NSString *)URLString parameters:(nullable NSDictionary *)parameters error:(NSError **)error; |
| | | |
| | | /** |
| | | * Sends a Twitter request. |
| | | * |
| | | * @param request The request that will be sent asynchronously. |
| | | * @param completion Completion block to be called on response. Called on main queue. |
| | | * @return an NSProgress object which can be used to cancel the request. |
| | | */ |
| | | - (NSProgress *)sendTwitterRequest:(NSURLRequest *)request completion:(TWTRNetworkCompletion)completion; |
| | | |
| | | /** |
| | | * @name Common API Actions |
| | | */ |
| | | |
| | | /** |
| | | * Loads a Twitter User. |
| | | * |
| | | * @param userID (required) The Twitter user ID of the desired user. |
| | | * @param completion Completion block to be called on response. Called on main queue. |
| | | */ |
| | | - (void)loadUserWithID:(NSString *)userID completion:(TWTRLoadUserCompletion)completion; |
| | | |
| | | /** |
| | | * Loads a single Tweet from the network or cache. |
| | | * |
| | | * @param tweetID (required) The ID of the desired Tweet. |
| | | * @param completion Completion bock to be called on response. Called on main queue. |
| | | */ |
| | | - (void)loadTweetWithID:(NSString *)tweetID completion:(TWTRLoadTweetCompletion)completion; |
| | | |
| | | /** |
| | | * Loads a series of Tweets in a batch. The completion block will be passed an array of zero or more |
| | | * Tweets that loaded successfully. If some Tweets fail to load the array will contain less Tweets than |
| | | * number of requested IDs. If any Tweets fail to load, the IDs of the Tweets that did not load will |
| | | * be provided in the userInfo dictionary property of the error parameter under `TWTRTweetsNotLoadedKey`. |
| | | * |
| | | * @param tweetIDStrings (required) An array of Tweet IDs. |
| | | * @param completion Completion block to be called on response. Called on main queue. |
| | | */ |
| | | - (void)loadTweetsWithIDs:(NSArray *)tweetIDStrings completion:(TWTRLoadTweetsCompletion)completion; |
| | | |
| | | /** |
| | | * Uploads media to the media server. Returns a media ID to be used when tweeting. |
| | | * |
| | | * @param media The media to upload |
| | | * @param contentType The HTTP content type of the media that you are uploading. |
| | | * @param completion The completion handler to invoke. |
| | | */ |
| | | - (void)uploadMedia:(NSData *)media contentType:(NSString *)contentType completion:(TWTRMediaUploadResponseCompletion)completion; |
| | | |
| | | /** |
| | | * Create and send a Tweet. |
| | | * |
| | | * @param tweetText (required) The text for a Tweet |
| | | * @param completion Completion block to be called on response. Called on main queue. |
| | | */ |
| | | - (void)sendTweetWithText:(NSString *)tweetText completion:(TWTRSendTweetCompletion)completion; |
| | | |
| | | /** |
| | | * Upload media and create a Tweet. Returns TWTRTweet to be used when debugging. |
| | | * |
| | | * @param tweetText The text for a Tweet |
| | | * @param image UIImage to upload |
| | | * @param completion The completion handler to invoke. |
| | | */ |
| | | - (void)sendTweetWithText:(NSString *)tweetText image:(UIImage *)image completion:(TWTRSendTweetCompletion)completion; |
| | | |
| | | /** |
| | | * Create a Tweet with a video. Returns TWTRTweet to be used when debugging. |
| | | * |
| | | * Note: there are several requirements of the video being uploaded: |
| | | * - Duration should be between 0.5 seconds and 30 seconds |
| | | * - File size should not exceed 15 mb |
| | | * - Dimensions should be between 32x32 and 1280x1024 |
| | | * - Aspect ratio should be between 1:3 and 3:1 |
| | | * - Frame rate should be 40fps or less |
| | | * |
| | | * @param tweetText The text for a Tweet |
| | | * @param videoData The video to be uploaded. Please follow guideline https://dev.twitter.com/rest/media/uploading-media |
| | | * @param completion The completion handler to invoke. |
| | | */ |
| | | - (void)sendTweetWithText:(NSString *)tweetText videoData:(NSData *)videoData completion:(TWTRSendTweetCompletion)completion; |
| | | |
| | | /** |
| | | * Requests the email for the user id which the API client was instantiated with. |
| | | * This method requires that you are using an API Client which was instantiated with |
| | | * a logged in user otherwise you will receive a "Request failed: forbidden (403)" error. |
| | | * |
| | | * @param completion A completion block to invoke when the request completes. The email address may |
| | | * be a nil if the user does not have an email address, the email address |
| | | * is unverified or you do not have the correct permissions to request the email address. |
| | | * |
| | | * @note Requesting a user’s email address requires your application to be whitelisted by Twitter. |
| | | * To request access, please visit https://support.twitter.com/forms/platform |
| | | */ |
| | | - (void)requestEmailForCurrentUser:(TWTRRequestEmailCompletion)completion; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRCollectionTimelineDataSource.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Steven Hepting on 2/10/15. |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import "TWTRTimelineDataSource.h" |
| | | |
| | | @class TWTRAPIClient; |
| | | @class TWTRTimelineFilter; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | @interface TWTRCollectionTimelineDataSource : NSObject <TWTRTimelineDataSource> |
| | | |
| | | /** |
| | | * The number of Tweets to request in each query to the Twitter Timeline API when fetching the next batch of Tweets. |
| | | */ |
| | | @property (nonatomic, readonly) NSInteger maxTweetsPerRequest; |
| | | |
| | | /** |
| | | * ID of the collection. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *collectionID; |
| | | |
| | | /* |
| | | * A filtering object that hides certain tweets. |
| | | */ |
| | | @property (nonatomic, copy, nullable) TWTRTimelineFilter *timelineFilter; |
| | | |
| | | /** |
| | | * Convenience initializer. |
| | | * |
| | | * @param collectionID (required) The ID of this collection. For example, the ID of this collection: https://twitter.com/TwitterMusic/timelines/393773266801659904 is @"393773266801659904" |
| | | * |
| | | * @return An instance of TWTRCollectionTimelineDataSource or nil if any of the required parameters is missing. |
| | | */ |
| | | - (instancetype)initWithCollectionID:(NSString *)collectionID APIClient:(TWTRAPIClient *)client; |
| | | |
| | | /** |
| | | * Designated initializer setting all supported values for Collection Timeline Data Source. |
| | | * |
| | | * @param collectionID (required) The Collection ID value. e.g. @"393773266801659904" |
| | | * @param client (required) The API client to use for all network requests. |
| | | * @param maxTweetsPerRequest (optional) Number of Tweets to request per batch. A value of 0 uses the server default. |
| | | * |
| | | * @return An instance of TWTRCollectionTimelineDataSource or nil if any of the required parameters are missing. |
| | | */ |
| | | - (instancetype)initWithCollectionID:(NSString *)collectionID APIClient:(TWTRAPIClient *)client maxTweetsPerRequest:(NSUInteger)maxTweetsPerRequest NS_DESIGNATED_INITIALIZER; |
| | | |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRComposer.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <UIKit/UIKit.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * Possible values for the <i>result</i> parameter of the completionHandler property. |
| | | */ |
| | | typedef NS_ENUM(NSInteger, TWTRComposerResult) { |
| | | /** |
| | | * The composer is dismissed without sending the Tweet (i.e. the user selects Cancel, or the account is unavailable). |
| | | */ |
| | | TWTRComposerResultCancelled, |
| | | |
| | | /** |
| | | * The composer is dismissed and the message is being sent in the background, after the user selects Done. |
| | | */ |
| | | TWTRComposerResultDone |
| | | }; |
| | | |
| | | /** |
| | | * Completion block called when the user finishes composing a Tweet. |
| | | */ |
| | | typedef void (^TWTRComposerCompletion)(TWTRComposerResult result); |
| | | |
| | | /** |
| | | * The TWTRComposer class presents a view to the user to compose a Tweet. |
| | | */ |
| | | @interface TWTRComposer : NSObject |
| | | |
| | | /** |
| | | * Sets the initial text for the Tweet composition prior to showing it. |
| | | * |
| | | * @param text The text to tweet. |
| | | * |
| | | * @return This will return NO if the receiver has already been presented (and therefore cannot be changed). |
| | | */ |
| | | - (BOOL)setText:(nullable NSString *)text; |
| | | |
| | | /** |
| | | * Sets an image attachment. |
| | | * |
| | | * @param image The image to attach. |
| | | * |
| | | * @return This will return NO if the receiver has already been presented (and therefore cannot be changed). |
| | | */ |
| | | - (BOOL)setImage:(nullable UIImage *)image; |
| | | |
| | | /** |
| | | * Adds a URL to the contents of the Tweet message. |
| | | * |
| | | * @param url The URL. |
| | | * |
| | | * @return This will return NO if the receiver has already been presented (and therefore cannot be changed). |
| | | */ |
| | | - (BOOL)setURL:(nullable NSURL *)url; |
| | | |
| | | /** |
| | | * Presents the composer, with an optional completion handler from the specified view controller. |
| | | * @param fromController The controller in which to present the composer from. |
| | | * @param completion completion The completion handler, which has a single parameter indicating whether the user finished or cancelled the Tweet composition. |
| | | */ |
| | | - (void)showFromViewController:(UIViewController *)fromController completion:(TWTRComposerCompletion)completion; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRComposerViewController.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <UIKit/UIKit.h> |
| | | @class TWTRTweet; |
| | | @protocol TWTRComposerViewControllerDelegate; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * Composer interface to allow users to compose & send Tweets from |
| | | * inside an app. |
| | | * |
| | | * It is the developers' responsibility to ensure that there exists a |
| | | * logged in Twitter user before creating a `TWTRComposerViewController`. |
| | | * |
| | | * See: https://dev.twitter.com/twitterkit/ios/compose-tweets#presenting-a-basic-composer |
| | | * |
| | | * Initial Text |
| | | * If you wish to add default mentions to the Tweet, add them to the |
| | | * beginning of `initialText`. |
| | | * |
| | | * If you wish to add default hashtags or links to the Tweet, |
| | | * add them at the end of `initialText`. |
| | | */ |
| | | @interface TWTRComposerViewController : UIViewController |
| | | |
| | | /** |
| | | * The delegate for this composer view controller. |
| | | */ |
| | | @property (nonatomic, weak) id<TWTRComposerViewControllerDelegate> delegate; |
| | | |
| | | /** |
| | | * Create an empty composer view controller. The developer must handle ensuring |
| | | * that a logged in Twitter user exists before creating this controller. |
| | | */ |
| | | + (instancetype)emptyComposer; |
| | | |
| | | /** |
| | | * Initialize a composer with pre-filled text and an image or video attachment. |
| | | * Requires a logged in Twitter user. |
| | | * |
| | | * @param initialText (optional) Text with which to pre-fill the composer text. |
| | | * @param image (optional) Image to add as an attachment. |
| | | * @param videoURL (optional) Video URL to add as an attachment. Of the form of `assets-library`. |
| | | * |
| | | * Note: Only one type of attachment (image or video) may be added. |
| | | */ |
| | | - (instancetype)initWithInitialText:(nullable NSString *)initialText image:(nullable UIImage *)image videoURL:(nullable NSURL *)videoURL; |
| | | |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | @end |
| | | |
| | | @protocol TWTRComposerViewControllerDelegate <NSObject> |
| | | |
| | | @optional |
| | | /** |
| | | * Called when the user taps the cancel button. This method will be called after the view controller is dismissed. |
| | | */ |
| | | - (void)composerDidCancel:(TWTRComposerViewController *)controller; |
| | | |
| | | /** |
| | | * Called when the user successfully sends a Tweet. The resulting Tweet object is returned. |
| | | * This method is called after the view controller is dimsissed and the API response is |
| | | * received. |
| | | */ |
| | | - (void)composerDidSucceed:(TWTRComposerViewController *)controller withTweet:(TWTRTweet *)tweet; |
| | | |
| | | /** |
| | | * This method is called if the composer is not able to send the Tweet. |
| | | * The view controller will not be dismissed automatically if this method is called. |
| | | */ |
| | | - (void)composerDidFail:(TWTRComposerViewController *)controller withError:(NSError *)error; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRJSONConvertible.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright © 2016 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | @protocol TWTRJSONConvertible <NSObject> |
| | | |
| | | /** |
| | | * Initialize the receiver with its JSON object representation. |
| | | * |
| | | * @param dictionary the JSON object representing this object. |
| | | * @return the fully formed object or nil if the JSON is not valid. |
| | | */ |
| | | - (nullable instancetype)initWithJSONDictionary:(NSDictionary *)dictionary; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRListTimelineDataSource.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import <TwitterKit/TWTRTimelineDataSource.h> |
| | | |
| | | @class TWTRAPIClient; |
| | | @class TWTRTimelineFilter; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * Data source representing a list of Tweets. These Tweets are ordered chronologically with the most recent first. |
| | | * |
| | | * @see https://dev.twitter.com/rest/reference/get/lists/statuses |
| | | */ |
| | | @interface TWTRListTimelineDataSource : NSObject <TWTRTimelineDataSource> |
| | | |
| | | /** |
| | | * The ID of the list to show Tweets for. Either the `listID` or the `listSlug` and `listOwnerScreenName` are required. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *listID; |
| | | |
| | | /** |
| | | * The slug of the list to show Tweets for. Either the `listID` or the `listSlug` and `listOwnerScreenName` are required. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *listSlug; |
| | | |
| | | /** |
| | | * Screen name of the owner of the list as specified by the `listSlug`. Either the `listID` or the `listSlug` and `listOwnerScreenName` are required. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *listOwnerScreenName; |
| | | |
| | | /** |
| | | * The number of Tweets to request in each query to the Twitter Timeline API when fetching the next batch of Tweets. Will request 30 Tweets by default. Setting this value to 0 will use the server default. |
| | | */ |
| | | @property (nonatomic, readonly) NSUInteger maxTweetsPerRequest; |
| | | |
| | | /** |
| | | * Whether to request retweets in the set of Tweets from the server. |
| | | * |
| | | * Defaults to YES. |
| | | */ |
| | | @property (nonatomic, readonly) BOOL includeRetweets; |
| | | |
| | | /* |
| | | * A filtering object that hides certain tweets. |
| | | */ |
| | | @property (nonatomic, copy, nullable) TWTRTimelineFilter *timelineFilter; |
| | | |
| | | /** |
| | | * Convenience initializer. Uses default values for `maxTweetsPerRequest` and `includeRetweets`. |
| | | * |
| | | * @param listID (required) The ID of the list. |
| | | * @param client (required) The API client to use for making network requests. |
| | | * |
| | | * @return A full initialized list timeline datasource. |
| | | */ |
| | | - (instancetype)initWithListID:(NSString *)listID APIClient:(TWTRAPIClient *)client; |
| | | |
| | | /** |
| | | * Convenience initializer. Uses default values for `maxTweetsPerRequest` and `includeRetweets`. |
| | | * |
| | | * @param listSlug (required) The slug of the list. |
| | | * @param listOwnerScreenName (required) The list owner's screen name. |
| | | * @param client (required) The API client to use for making network requests. |
| | | * |
| | | * @return A full initialized list timeline datasource. |
| | | */ |
| | | - (instancetype)initWithListSlug:(NSString *)listSlug listOwnerScreenName:(NSString *)listOwnerScreenName APIClient:(TWTRAPIClient *)client; |
| | | |
| | | /** |
| | | * Designated initializer for creating list timeline data sources taking all parameters. |
| | | * |
| | | * @param listID (optional) The ID of the list. Provide either the `listID` or `listSlug` and `listOwnerScreenName`. |
| | | * @param listSlug (optional) The slug of the list. Provide either the `listID` or `listSlug` and `listOwnerScreenName`. |
| | | * @param listOwnerScreenName (optional) The list owner's screen name. Provide either the `listID` or `listSlug` and `listOwnerScreenName`. |
| | | * @param client (required) The API client to use for making networking requests |
| | | * @param maxTweetsPerRequest (optional) The number of Tweets per batch to request. A value of 0 will use the server default. |
| | | * @param includeRetweets (optional) Whether retweets should be requested. |
| | | * |
| | | * @return A fully initialized list timeline datasource. |
| | | */ |
| | | - (instancetype)initWithListID:(nullable NSString *)listID listSlug:(nullable NSString *)listSlug listOwnerScreenName:(nullable NSString *)listOwnerScreenName APIClient:(TWTRAPIClient *)client maxTweetsPerRequest:(NSUInteger)maxTweetsPerRequest includeRetweets:(BOOL)includeRetweets NS_DESIGNATED_INITIALIZER; |
| | | |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRLogInButton.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <TwitterCore/TWTRSession.h> |
| | | #import <TwitterKit/Twitter.h> |
| | | #import <UIKit/UIKit.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * A Button which launches the sign in to Twitter flow when tapped. |
| | | */ |
| | | @interface TWTRLogInButton : UIButton |
| | | |
| | | /** |
| | | * The completion block to be called with a `TWTRSession` if successful, |
| | | * and a `NSError` if logging in failed or was canceled. |
| | | */ |
| | | @property (nonatomic, copy) TWTRLogInCompletion logInCompletion; |
| | | |
| | | /** |
| | | * Returns a new log in button which launches Twitter log in when tapped and |
| | | * calls `completion` when logging in succeeds or fails. |
| | | * |
| | | * Internally, this button simply calls `-[Twitter logInWithCompletion:]`. |
| | | * |
| | | * @param completion The completion to be called with a `TWTRSession` if successful, |
| | | * and a `NSError` if logging in failed or was canceled. |
| | | * @return An initialized `TWTRLogInButton`. |
| | | */ |
| | | + (instancetype)buttonWithLogInCompletion:(TWTRLogInCompletion)completion; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRMediaEntitySize.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright (c) 2016 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <UIKit/UIKit.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | typedef NS_ENUM(NSUInteger, TWTRMediaEntitySizeResizingMode) { |
| | | TWTRMediaEntitySizeResizingModeFit, |
| | | TWTRMediaEntitySizeResizingModeCrop, |
| | | }; |
| | | |
| | | FOUNDATION_EXPORT NSString *NSStringFromTWTRMediaEntitySizeResizingMode(TWTRMediaEntitySizeResizingMode resizingMode); |
| | | FOUNDATION_EXPORT TWTRMediaEntitySizeResizingMode TWTRMediaEntitySizeResizingModeFromString(NSString *resizingModeString); |
| | | |
| | | @interface TWTRMediaEntitySize : NSObject <NSCoding> |
| | | |
| | | /** |
| | | * The name of the size. 'large', 'medium', etc. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *name; |
| | | |
| | | /** |
| | | * Resize mode of the image size e.g. Fit, Crop. |
| | | */ |
| | | @property (nonatomic, readonly) TWTRMediaEntitySizeResizingMode resizingMode; |
| | | |
| | | /** |
| | | * The actual size. |
| | | */ |
| | | @property (nonatomic, readonly) CGSize size; |
| | | |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | /** |
| | | * Designated initializer. |
| | | * |
| | | * @param name The name of the size. If nil will default to the empty string. |
| | | * @param resizingMode The resizing mode of this entity size. |
| | | * @param size The size of the entity. |
| | | */ |
| | | - (instancetype)initWithName:(NSString *)name resizingMode:(TWTRMediaEntitySizeResizingMode)resizingMode size:(CGSize)size NS_DESIGNATED_INITIALIZER; |
| | | |
| | | - (BOOL)isEqualToMediaEntitySize:(TWTRMediaEntitySize *)otherSize; |
| | | |
| | | /** |
| | | * Returns a dictionary of valid `TWTRMediaEntitySize` instances from the Twitter API response for media sizes. |
| | | * |
| | | * @param dictionary A parsed dictionary of media sizes from the Twitter API response |
| | | * |
| | | * @return Dictionary of parsed `TWTRMediaEntitySize` instances keyed by size name. |
| | | */ |
| | | + (NSDictionary *)mediaEntitySizesWithJSONDictionary:(NSDictionary *)dictionary; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRMoPubAdConfiguration.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright © 2016 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRMoPubSampleAdUnitID; |
| | | |
| | | /** |
| | | * Bridging class for configuring how to load your MoPub ad unit. |
| | | */ |
| | | @interface TWTRMoPubAdConfiguration : NSObject |
| | | |
| | | /** |
| | | * Ad unit ID of the MoPub ad. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *adUnitID; |
| | | |
| | | /** |
| | | * Keywords specified in comma-separated key-value pairs to provide |
| | | * better targetting of the ads. e.g. "marital:single,age:24" |
| | | * @see https://github.com/mopub/mopub-ios-sdk/blob/master/MoPubSDK/Native%20Ads/MPNativeAdRequestTargeting.h |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) NSString *keywords; |
| | | |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | /** |
| | | * Initializes a new MoPub ad configuration. |
| | | * |
| | | * @param adUnitID The ad unit ID as configured in the MoPub dashboard |
| | | * @param keywords Keywords for better ad targeting |
| | | * |
| | | * @return Fully initialized ad configuration. |
| | | */ |
| | | - (instancetype)initWithAdUnitID:(NSString *)adUnitID keywords:(nullable NSString *)keywords; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRMoPubNativeAdContainerView.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright © 2016 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <UIKit/UIKit.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * A default combination of colors for the native ads. |
| | | */ |
| | | typedef NS_ENUM(NSUInteger, TWTRNativeAdTheme) { |
| | | /** |
| | | * Official light theme. |
| | | */ |
| | | TWTRNativeAdThemeLight, |
| | | /** |
| | | * Official dark theme. |
| | | */ |
| | | TWTRNativeAdThemeDark |
| | | }; |
| | | |
| | | /** |
| | | * The ad view rendered using MoPub. This class is not intended for public use other than to configure |
| | | * color options. Colors can be configured by setting the theme and further customized by tweaking |
| | | * the individual color options. |
| | | * |
| | | * ## UIAppearance |
| | | * |
| | | * You may use UIAppearance proxy objects to style certain aspects of the |
| | | * the ad view to match your application's design. |
| | | |
| | | * // Setting a theme |
| | | * [TWTRMoPubNativeAdContainerView appearance].theme = TWTRNativeAdThemeDark; |
| | | * |
| | | * // Overriding colors of certain properties |
| | | * [TWTRMoPubNativeAdContainerView appearance].primaryTextColor = [UIColor yellowColor]; |
| | | * |
| | | * @note You can't change the theme through an appearance proxy after the |
| | | * view has already been added to the view hierarchy. |
| | | */ |
| | | @interface TWTRMoPubNativeAdContainerView : UIView <UIAppearanceContainer> |
| | | |
| | | /** |
| | | * Setting the theme of ad views. This is the base template that can |
| | | * be overridden by setting your custom colors for the available view |
| | | * properties. Default is `TWTRNativeAdThemeLight`. |
| | | */ |
| | | @property (nonatomic) TWTRNativeAdTheme theme UI_APPEARANCE_SELECTOR; |
| | | |
| | | /** |
| | | * Background color of this ad container view. Defaults to #F5F8FA. |
| | | */ |
| | | @property (nonatomic) UIColor *backgroundColor UI_APPEARANCE_SELECTOR; |
| | | |
| | | /** |
| | | * Background color of the ad within the container. Defaults to #FFFFFF. |
| | | */ |
| | | @property (nonatomic) UIColor *adBackgroundColor UI_APPEARANCE_SELECTOR; |
| | | |
| | | /** |
| | | * Primary text color used within the ad cell including the underlying ad. Defaults to #292F33. |
| | | */ |
| | | @property (nonatomic) UIColor *primaryTextColor UI_APPEARANCE_SELECTOR; |
| | | |
| | | /** |
| | | * Background color of buttons. Defaults to #174791. |
| | | */ |
| | | @property (nonatomic) UIColor *buttonBackgroundColor UI_APPEARANCE_SELECTOR; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRNotificationConstants.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright © 2016 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * Constants for notifications that are posted from TwitterKit. These are posted on the default notification center. |
| | | */ |
| | | |
| | | #pragma mark - Tweet Action Notifications |
| | | |
| | | /** |
| | | * Notification indicating a Tweet was selected. |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRDidSelectTweetNotification; |
| | | |
| | | /** |
| | | * Notification indicating the Tweet detail view was shown for a given Tweet. |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRDidShowTweetDetailNotification; |
| | | |
| | | /** |
| | | * Notification indicating the user has selected to share Tweet. |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRWillShareTweetNotification; |
| | | |
| | | /** |
| | | * Notification indicating the Tweet was shared. |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRDidShareTweetNotification; |
| | | |
| | | /** |
| | | * Notification indicating the user has cancelled sharing of the Tweet. |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRCancelledShareTweetNotification; |
| | | |
| | | /** |
| | | * Notification indicating the user has liked a Tweet. |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRDidLikeTweetNotification; |
| | | |
| | | /** |
| | | * Notification indicating the user has unliked a Tweet. |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRDidUnlikeTweetNotification; |
| | | |
| | | #pragma mark - Media Notifications |
| | | |
| | | /** |
| | | * Notification indicating the the playback state of a video |
| | | * has changed. |
| | | * |
| | | * object: The UIView emitting these notifications |
| | | * userInfo: {TWTRVideoPlaybackStateKey: TWTRVideoStateValuePlaying} |
| | | * {TWTRVideoPlaybackStateKey: TWTRVideoStateValuePaused} |
| | | * {TWTRVideoPlaybackStateKey: TWTRVideoStateValueCompleted} |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRVideoPlaybackStateChangedNotification; |
| | | |
| | | /** |
| | | * User info key for the state of video playback. |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRVideoPlaybackStateKey; |
| | | |
| | | /** |
| | | * User info values for the state of video playback. |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRVideoStateValuePlaying; |
| | | FOUNDATION_EXPORT NSString *const TWTRVideoStateValuePaused; |
| | | FOUNDATION_EXPORT NSString *const TWTRVideoStateValueCompleted; |
| | | |
| | | #pragma mark - Presentation Notifications |
| | | |
| | | /** |
| | | * Notification indicating that the video view controller will |
| | | * be presented. |
| | | * |
| | | * object: The UIViewController hosting the video view |
| | | * userInfo: {TWTRVideoTypeKey: TWTRVideoTypeGIF} |
| | | * {TWTRVideoTypeKey: TWTRVideoTypeStandard} |
| | | * {TWTRVideoTypeKey: TWTRVideoTypeVine} |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRWillPresentVideoNotification; |
| | | |
| | | /** |
| | | * Notification indicating that the video view controller has |
| | | * been dismissed. |
| | | * |
| | | * object: The UIViewController hosting the video view |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRDidDismissVideoNotification; |
| | | |
| | | /** |
| | | * The key to fetch the type of video being displayed in a |
| | | * TWTRVideoViewController. |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRVideoTypeKey; |
| | | |
| | | /** |
| | | * User info values for the type of video being displayed |
| | | * in a TWTRVideoViewController. |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRVideoTypeGIF; |
| | | FOUNDATION_EXPORT NSString *const TWTRVideoTypeStandard; |
| | | FOUNDATION_EXPORT NSString *const TWTRVideoTypeVine; |
| | | |
| | | #pragma mark - Notification User Info |
| | | |
| | | /** |
| | | * User info key to fetch the associated Tweet in the notification. |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRNotificationInfoTweet; |
| | | |
| | | /** |
| | | * A notification which is posted when a user logs out of Twitter. |
| | | * The notification will contain a user dictionary which contains |
| | | * the user id which is being logged out. Note, this notification may |
| | | * be posted as a result of starting the Twitter object. |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRUserDidLogOutNotification; |
| | | FOUNDATION_EXPORT NSString *const TWTRLoggedOutUserIDKey; |
| | | |
| | | /** |
| | | * A notification which is posted when a user logs in to Twitter. |
| | | * The notification will contain a user dictionary which contains |
| | | * the user id which is being logged in. Note, this notification may |
| | | * be posted as a result of starting the Twitter object. |
| | | */ |
| | | FOUNDATION_EXPORT NSString *const TWTRUserDidLogInNotification; |
| | | FOUNDATION_EXPORT NSString *const TWTRLoggedInUserIDKey; |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTROAuthSigning.h |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <TwitterCore/TWTRCoreOAuthSigning.h> |
| | | |
| | | @class TWTRAuthConfig; |
| | | @class TWTRSession; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * This class provides tools to generate OAuth signatures. |
| | | */ |
| | | @interface TWTROAuthSigning : NSObject <TWTRCoreOAuthSigning> |
| | | |
| | | /** |
| | | * @name Initialization |
| | | */ |
| | | |
| | | /** |
| | | * Instantiate a `TWTROAuthSigning` object with the parameters it needs to generate the OAuth signatures. |
| | | * |
| | | * @param authConfig (required) Encapsulates credentials required to authenticate a Twitter application. |
| | | * @param authSession (required) Encapsulated credentials associated with a user session. |
| | | * |
| | | * @return An initialized `TWTROAuthSigning` object or nil if any of the parameters are missing. |
| | | * |
| | | * @note If you want to generate OAuth Echo headers to verify Digits' credentials, see `DGTOAuthSigning`. |
| | | * |
| | | * @see TWTRAuthConfig |
| | | * @see TWTRSession |
| | | */ |
| | | - (instancetype)initWithAuthConfig:(TWTRAuthConfig *)authConfig authSession:(TWTRSession *)authSession NS_DESIGNATED_INITIALIZER; |
| | | |
| | | /** |
| | | * Unavailable. Use `-initWithAuthConfig:authSession:` instead. |
| | | */ |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRSearchTimelineDataSource.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import <TwitterKit/TWTRTimelineDataSource.h> |
| | | |
| | | @class TWTRAPIClient; |
| | | @class TWTRTimelineFilter; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | Data source representing a Search Timeline. Provides TWTRTweet objects to a TWTRTimelineViewController in pages determined by the TWTRTimelineCursor object passed in to the `loadNext:` and `loadPrevious:` methods. |
| | | |
| | | ## Search Queries: |
| | | |
| | | * `watching now` containing both “watching” and “now”. Default. |
| | | * `“happy hour”` containing the exact phrase “happy hour”. |
| | | * `love OR hate` containing either “love” or “hate” (or both). |
| | | * `beer -root` containing “beer” but not “root”. |
| | | * `#haiku` containing the hashtag “haiku”. |
| | | * `from:alexiskold`sent from person “alexiskold”. |
| | | * `to:techcrunch` sent to person “techcrunch”. |
| | | * `@mashable` referencing person “mashable”. |
| | | * `flight :(` containing “flight” and with a negative attitude. |
| | | * `traffic ?` containing “traffic” and asking a question. |
| | | * `movie -scary :)`containing “movie”, but not “scary”, and with a positive attitude. |
| | | * `hilarious filter:links` containing “hilarious” and linking to URL. |
| | | * `news source:twitterfeed`containing “news” and entered via TwitterFeed |
| | | * `superhero since:2010-12-27` containing “superhero” and sent since date “2010-12-27” (year-month-day). |
| | | * `ftw until:2010-12-27` containing “ftw” and sent before the date “2010-12-27”. |
| | | |
| | | @see https://dev.twitter.com/rest/public/search |
| | | */ |
| | | @interface TWTRSearchTimelineDataSource : NSObject <TWTRTimelineDataSource> |
| | | |
| | | /** |
| | | * The search query. This matches what you would type into https://twitter.com/search |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *searchQuery; |
| | | |
| | | /** |
| | | * Restricts tweets returned to a given language, specified by its ISO 639-1 code (for example: en, es). Language detection is best-effort. The server defaults to returning Tweets in all languages. |
| | | * |
| | | * @see http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) NSString *languageCode; |
| | | |
| | | /** |
| | | * The number of Tweets to request in each network request for more Tweets. By default requests 30 tweets. If set to `0` the parameter will not be set on the request and the Twitter API will use the default size for the endpoint. |
| | | */ |
| | | @property (nonatomic, readonly) NSUInteger maxTweetsPerRequest; |
| | | |
| | | /** |
| | | * The geocode details to narrow search results. The format is "latitude,longitude,radius" e.g. "37.781157,-122.398720,1mi" |
| | | * |
| | | * @see https://dev.twitter.com/rest/public/search |
| | | */ |
| | | @property (nonatomic, copy, nullable) NSString *geocodeSpecifier; |
| | | |
| | | /** |
| | | * Filter out sensitive (containing nudity or violence) tweets. |
| | | * |
| | | * Defaults to YES. |
| | | */ |
| | | @property (nonatomic) BOOL filterSensitiveTweets; |
| | | |
| | | /* |
| | | * A filtering object that hides certain tweets. |
| | | */ |
| | | @property (nonatomic, copy, nullable) TWTRTimelineFilter *timelineFilter; |
| | | |
| | | /* |
| | | * Specifies search result type to be recent or popular Tweets, or a mix of both. |
| | | * |
| | | * @param resultType possible options are recent, popular, or mixed. |
| | | */ |
| | | @property (nonatomic, copy, nullable) NSString *resultType; |
| | | |
| | | /** |
| | | * Convenience initializer. Uses default values for `languageCode` and `maxTweetsPerRequest`. |
| | | * |
| | | * @param searchQuery (required) The query string that you would type into https://twitter.com/search |
| | | * @param client (required) An instance of `TWTRAPIClient` with which API calls will be made. |
| | | * |
| | | * @return A fully initialized search timeline datasource or `nil` if any of the required parameters are missing. |
| | | */ |
| | | - (instancetype)initWithSearchQuery:(NSString *)searchQuery APIClient:(TWTRAPIClient *)client; |
| | | |
| | | /** |
| | | * Create a new search timeline data source. |
| | | * |
| | | * @param searchQuery (required) The query string that you would type into https://twitter.com/search |
| | | * @param client (required) An instance of `TWTRAPIClient` with which API calls will be made. |
| | | * @param languageCode (optional) The ISO 639-1 language code to restrict Tweets to. A `nil` value will not add the parameter to the server request and so use the server default. |
| | | * @param maxTweetsPerRequest (optional) The number of tweets to request in each query to the Twitter API. A value of 0 will not add to the parameters and thus use the server default. |
| | | * @param resultType (optional) The result type for timeline. It is default to 'mixed' if not assigned. |
| | | * |
| | | * @return A fully initialized search timeline datasource or `nil` if any of the required parameters are missing. |
| | | */ |
| | | - (instancetype)initWithSearchQuery:(NSString *)searchQuery APIClient:(TWTRAPIClient *)client languageCode:(nullable NSString *)languageCode maxTweetsPerRequest:(NSUInteger)maxTweetsPerRequest resultType:(nullable NSString *)resultType NS_DESIGNATED_INITIALIZER; |
| | | |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRTimelineCursor.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Kang Chen on 2/12/15. |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | /** |
| | | This Model object is a generic type of `Cursor` to represent the range of Tweets |
| | | which have already been loaded from the Twitter API. A dataset that supports |
| | | "cursoring" splits of a set of results (or Tweets in our case) in pages. One |
| | | page is loaded at a time, and the cursor from the previous request is used to |
| | | calculated which set of Tweets should be requested. |
| | | |
| | | |
| | | ## Positions |
| | | For User, Search, and List Timelines generally corresponds to a real Tweet ID. |
| | | |
| | | newer Tweets |
| | | (not yet loaded) |
| | | |
| | | -- newest/highest Tweet -- maxPosition |
| | | |
| | | loaded Tweets |
| | | |
| | | -- oldest/lowest Tweet -- minPosition |
| | | minPosition - 1 |
| | | older Tweets |
| | | (not yet loaded) |
| | | |
| | | More: https://dev.twitter.com/overview/api/cursoring |
| | | |
| | | */ |
| | | @interface TWTRTimelineCursor : NSObject |
| | | |
| | | /** |
| | | * The ID of the Tweet highest up in a batch of Tweets received from a Timeline. |
| | | * Often this corresponds to the newest Tweet in terms of time. |
| | | * |
| | | * For User, Search, and List Timelines this corresponds to a real Tweet ID.. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *maxPosition; |
| | | |
| | | /** |
| | | * The ID of the Tweet lowest in a batch of Tweets received from a Timeline. This |
| | | * often corresponds to the oldest Tweet in terms of time. |
| | | * |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *minPosition; |
| | | |
| | | - (instancetype)init __unavailable; |
| | | |
| | | /** |
| | | * Initialize a new cursor. |
| | | * |
| | | * @param maxPosition The highest (newest) Tweet ID received in this batch of Tweets. |
| | | * @param minPosition The lowest (oldest) Tweet ID received in this batch of Tweets. |
| | | * |
| | | * @return The initialized cursor to be passed back from a request for a Timeline from |
| | | * the Twitter API. |
| | | */ |
| | | - (instancetype)initWithMaxPosition:(NSString *)maxPosition minPosition:(NSString *)minPosition; |
| | | |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRTimelineDataSource.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import "TWTRTimelineType.h" |
| | | |
| | | @class TWTRAPIClient; |
| | | @class TWTRTimelineCursor; |
| | | @class TWTRTimelineFilter; |
| | | @class TWTRTweet; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | typedef void (^TWTRLoadTimelineCompletion)(NSArray<TWTRTweet *> *_Nullable tweets, TWTRTimelineCursor *_Nullable cursor, NSError *_Nullable error); |
| | | |
| | | /** |
| | | * Responsible for building network parameters for requesting a timeline of Tweets. |
| | | * |
| | | * Implementations of this protocol don't need to be thread-safe. All the methods will be invoked on the main thread. |
| | | */ |
| | | @protocol TWTRTimelineDataSource <NSObject> |
| | | |
| | | /** |
| | | * Load Tweets before a given position. For time-based timelines this generally |
| | | * corresponds to Tweets older than a position. |
| | | * |
| | | * @param position (optional) The position or Tweet ID before the page |
| | | * of Tweets to be loaded. |
| | | * @param completion (required) Invoked with the Tweets and the cursor in case of success, or nil |
| | | * and an error in case of error. This must be called on the main thread. |
| | | */ |
| | | - (void)loadPreviousTweetsBeforePosition:(nullable NSString *)position completion:(TWTRLoadTimelineCompletion)completion; |
| | | |
| | | /* |
| | | * The type of the timeline that this data source represents. |
| | | */ |
| | | @property (nonatomic, readonly) TWTRTimelineType timelineType; |
| | | |
| | | /* |
| | | * An object with a set of filters to hide certain tweets. |
| | | */ |
| | | @property (nonatomic, copy, nullable) TWTRTimelineFilter *timelineFilter; |
| | | |
| | | /** |
| | | * The API client to use with this data source. |
| | | * You will, likely, not need to alter this value unless you are implementing your |
| | | * own timeline view controller. |
| | | */ |
| | | @property (nonatomic) TWTRAPIClient *APIClient; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRTimelineDelegate.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Steven Hepting on 7/25/16. |
| | | // Copyright © 2016 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <UIKit/UIKit.h> |
| | | |
| | | @class TWTRTweet; |
| | | @class TWTRTimelineViewController; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | @protocol TWTRTimelineDelegate <NSObject> |
| | | |
| | | @optional |
| | | |
| | | /** |
| | | * The Timeline started loading new Tweets. This would be an |
| | | * appropriate place to begin showing a loading indicator. |
| | | * |
| | | * @param timeline Timeline controller providing the updates |
| | | */ |
| | | - (void)timelineDidBeginLoading:(TWTRTimelineViewController *)timeline; |
| | | |
| | | /** |
| | | * The Timeline has finished loading more Tweets. |
| | | * |
| | | * If Tweets array is `nil`, you should check the error object |
| | | * for a description of the failure case. |
| | | * |
| | | * @param timeline Timeline displaying loaded Tweets |
| | | * @param tweets Tweet objects loaded from the network |
| | | * @param error Error object describing details of failure |
| | | */ |
| | | - (void)timeline:(TWTRTimelineViewController *)timeline didFinishLoadingTweets:(nullable NSArray *)tweets error:(nullable NSError *)error; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRTimelineFilter.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright © 2016 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | /** |
| | | * Assigning this object to any data source that implements `TWTRTimelineDataSource` |
| | | * will filter the tweets on that timeline using the provided filter configuration. |
| | | */ |
| | | @interface TWTRTimelineFilter : NSObject <NSCopying> |
| | | |
| | | @property (nonatomic, copy, nullable) NSSet *keywords; |
| | | |
| | | @property (nonatomic, copy, nullable) NSSet *hashtags; |
| | | |
| | | @property (nonatomic, copy, nullable) NSSet *handles; |
| | | |
| | | @property (nonatomic, copy, nullable) NSSet *urls; |
| | | |
| | | - (nullable instancetype)initWithJSONDictionary:(nonnull NSDictionary *)dictionary; |
| | | - (nonnull instancetype) new NS_UNAVAILABLE; |
| | | |
| | | /* |
| | | * Returns count of all filters |
| | | */ |
| | | - (NSUInteger)filterCount; |
| | | @end |
New file |
| | |
| | | // |
| | | // TWTRTimelineType.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | /* |
| | | * Type of timelines that may be loaded and shown to the user. |
| | | */ |
| | | typedef NS_ENUM(NSUInteger, TWTRTimelineType) { |
| | | |
| | | /* |
| | | * User Timeline |
| | | */ |
| | | TWTRTimelineTypeUser = 1, |
| | | |
| | | /* |
| | | * Search Timeline |
| | | */ |
| | | TWTRTimelineTypeSearch, |
| | | |
| | | /** |
| | | * Collection Timeline |
| | | */ |
| | | TWTRTimelineTypeCollection, |
| | | |
| | | /** |
| | | * List Timeline |
| | | */ |
| | | TWTRTimelineTypeList, |
| | | }; |
New file |
| | |
| | | // |
| | | // TWTRTimelineViewController.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <UIKit/UIKit.h> |
| | | @protocol TWTRTimelineDataSource; |
| | | @protocol TWTRTweetViewDelegate; |
| | | @protocol TWTRTimelineDelegate; |
| | | @class TWTRMoPubAdConfiguration; |
| | | @class TWTRTweet; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | This class is a `UITableViewController` subclass that displays `TWTRTweetTableViewCell` cells. It handles cell-reuse, cell-configuration, and loading more Tweets from the given timeline once the last cell is displayed. |
| | | |
| | | ## Usage |
| | | |
| | | Initialize this class with any object that conforms to the `TWTRTimelineDataSource` protocol. We provide two such classes, `TWTRUserTimelineDataSource` and `TWTRSearchTimelineDataSource`. These provide `TWTRTweet` objects to this table view which then configures the instances of `TWTRTweetTableViewCell`. |
| | | |
| | | // Create the data source |
| | | TWTRAPIClient *client = [[TWTRAPIClient alloc] init]; |
| | | TWTRUserTimelineDataSource *dataSource = [[TWTRUserTimelineDataSource alloc] initWithScreenName:@"jack" APIClient:client]; |
| | | |
| | | // Create the timeline view controller |
| | | TWTRTimelineViewController *timeline = [[TWTRTimelineViewController alloc] initWithDataSource:dataSource]; |
| | | |
| | | ## Loading More |
| | | |
| | | This class loads the first batch of `TWTRTweet` objects from the Twitter API when `viewWillAppear:` is received. It also handles loading more tweets automatically once the last cell has been shown. |
| | | |
| | | */ |
| | | @interface TWTRTimelineViewController : UITableViewController |
| | | |
| | | /** |
| | | The source of `TWTRTweet` objects for this `TWTRTimelineViewController`. |
| | | May be set to update the Tweets being shown by this table view. Must be set on the main thread. |
| | | */ |
| | | @property (nonatomic, copy) id<TWTRTimelineDataSource> dataSource; |
| | | |
| | | /** |
| | | * The configuration of MoPub ads to show in the timeline. You must |
| | | * link against the MoPub framework and provide this configuration in order |
| | | * for ads to be injected. |
| | | * @note Changing this will force a reload of the timeline. You can only set this once. Must be set on the main thread. |
| | | */ |
| | | @property (nonatomic, nullable) TWTRMoPubAdConfiguration *adConfiguration; |
| | | |
| | | /** |
| | | * Whether action buttons (Like, Share) should be shown on the `TWTRTweetTableViewCell`s inside the tableview. |
| | | */ |
| | | @property (nonatomic) BOOL showTweetActions; |
| | | |
| | | /** |
| | | * If set, this value will be passed to all TWTRTweetView instances in the timeline. |
| | | */ |
| | | @property (nonatomic, weak) id<TWTRTweetViewDelegate> tweetViewDelegate; |
| | | |
| | | /** |
| | | * The object that acts as the delegate for the timeline. |
| | | */ |
| | | @property (nonatomic, weak) id<TWTRTimelineDelegate> timelineDelegate; |
| | | |
| | | /** |
| | | Initializes a timeline view controller. Does not start loading tweets until |
| | | `viewWillAppear:` is called. |
| | | |
| | | This method must be used to initialize this class. The `init` method is unavailable. |
| | | |
| | | @param dataSource A timeline data source object that conforms to the `TWTRTimelineDataSource` protocol. |
| | | |
| | | @return A fully initialized `TWTRTimelineViewController` or nil if the data source is missing. |
| | | */ |
| | | - (instancetype)initWithDataSource:(nullable id<TWTRTimelineDataSource>)dataSource; |
| | | |
| | | /** |
| | | * Initializes a timeline view controller with an optional ad configuration. Does not start loading Tweets until `viewWillAppear:` is called. |
| | | * |
| | | * @param dataSource A timeline data source object that conforms to the `TWTRTimelineDataSource` protocol. |
| | | * @param adConfiguration Configuration for the type of MoPub ads to display. Ads will only load after |
| | | * the initial timeline is loaded. No ads will be displayed if nil. |
| | | * |
| | | * @return A fully initialized `TWTRTimelineViewController`. Tweets will not be loaded if the data source is nil. |
| | | */ |
| | | - (instancetype)initWithDataSource:(nullable id<TWTRTimelineDataSource>)dataSource adConfiguration:(nullable TWTRMoPubAdConfiguration *)adConfiguration; |
| | | |
| | | - (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE; |
| | | |
| | | /** |
| | | * Asynchronously refresh and replace all the data in the table view with the latest `TWTRTweet`s. |
| | | */ |
| | | - (void)refresh; |
| | | |
| | | /** |
| | | * Returns the number of Tweets that are currently displayed by the controller. |
| | | */ |
| | | - (NSUInteger)countOfTweets; |
| | | |
| | | /** |
| | | * Returns the Tweet at the given index. |
| | | * |
| | | * @warning This method will throw an exception if the index is out of range of the count of Tweets. |
| | | */ |
| | | - (TWTRTweet *)tweetAtIndex:(NSInteger)index; |
| | | |
| | | /** |
| | | * Returns a copy of the Tweets at the time of calling this method. |
| | | |
| | | * This method returns the copy of the current Tweets. The Tweets may change |
| | | * after this method is called. |
| | | */ |
| | | - (NSArray *)snapshotTweets; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRTweet.h |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import <TwitterKit/TWTRJSONConvertible.h> |
| | | |
| | | @class TWTRTweet; |
| | | @class TWTRUser; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * `TWTRTweet` is an immutable representation of a Tweet. |
| | | */ |
| | | @interface TWTRTweet : NSObject <NSCoding, TWTRJSONConvertible> |
| | | |
| | | #pragma mark - Properties |
| | | |
| | | /** |
| | | * The ID of the Twitter Tweet. |
| | | * @warning This represents the id_str field, which could differ from the value of the id field. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *tweetID; |
| | | |
| | | /** |
| | | * The date when this Tweet was created. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSDate *createdAt; |
| | | |
| | | /** |
| | | * The text of the Tweet. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *text; |
| | | |
| | | /** |
| | | * The Author of the Tweet. |
| | | */ |
| | | @property (nonatomic, readonly) TWTRUser *author; |
| | | |
| | | /** |
| | | * ID of the authenticated Twitter user this Tweet was loaded for. Some Tweet properties e.g. `isLiked` |
| | | * can vary depending on the authenticated user. Nil means the Tweet was loaded from the perspective |
| | | * of a logged-out user or the authenticated user could not be determined. |
| | | */ |
| | | @property (nonatomic, readonly, nullable) NSString *perspectivalUserID; |
| | | |
| | | /** |
| | | * The number of times this Tweet was liked. |
| | | */ |
| | | @property (nonatomic, readonly) long long likeCount; |
| | | |
| | | /** |
| | | * The number of times this Tweet was retweeted. |
| | | */ |
| | | @property (nonatomic, readonly) long long retweetCount; |
| | | |
| | | /** |
| | | * The language of the Tweet. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *languageCode; |
| | | |
| | | /** |
| | | * The Tweet this Tweet was a reply to. |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) NSString *inReplyToTweetID; |
| | | |
| | | /** |
| | | * The User ID this Tweet was a reply to. |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) NSString *inReplyToUserID; |
| | | |
| | | /** |
| | | * The screen name of the user this Tweet was a reply to. |
| | | * @note This doesn't contain the `@` sign before the screen name. |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) NSString *inReplyToScreenName; |
| | | |
| | | /** |
| | | * The permalink URL for this Tweet. |
| | | * |
| | | * Suitable for loading in a `UIWebView`, `WKWebView` or passing to Safari: |
| | | * |
| | | * `[[UIApplication sharedApplication] openURL:tweet.permalink];` |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSURL *permalink; |
| | | |
| | | /** |
| | | * Whether this Tweet was liked by the authenticated user. |
| | | * |
| | | * @warning The value of this property depends on the authenticated user. |
| | | */ |
| | | @property (nonatomic, readonly) BOOL isLiked; |
| | | |
| | | /** |
| | | * Whether this Tweet was retweeted by the authenticated user. |
| | | * |
| | | * @warning The value of this property depends on the authenticated user. |
| | | */ |
| | | @property (nonatomic, readonly) BOOL isRetweeted; |
| | | |
| | | /** |
| | | * The Tweet ID of the authenticated user's retweet of this Tweet. This will be `nil` if there is no |
| | | * authenticated user or the user has not retweeted this Tweet. |
| | | * |
| | | * @warning The value of this property depends on the authenticated user. |
| | | */ |
| | | @property (nonatomic, copy, readonly, nullable) NSString *retweetID; |
| | | |
| | | /** |
| | | * The original, fully-hydrated Tweet that was retweeted. This corresponds to the `retweeted_status` API field. |
| | | * This is `nil` unless `self.isRetweet == YES`. |
| | | */ |
| | | @property (nonatomic, readonly, nullable) TWTRTweet *retweetedTweet; |
| | | |
| | | /** |
| | | * Indicates whether this Tweet is a retweet of another Tweet. |
| | | */ |
| | | @property (nonatomic, readonly) BOOL isRetweet; |
| | | |
| | | /** |
| | | * Indicates whether this Tweet is a Quote Tweet. |
| | | */ |
| | | @property (nonatomic, readonly) BOOL isQuoteTweet; |
| | | |
| | | /** |
| | | * The original, fully-hydrated Tweet that was quoted. |
| | | * This is `nil` unless `self.isRetweet == YES`. |
| | | */ |
| | | @property (nonatomic, readonly, nullable) TWTRTweet *quotedTweet; |
| | | |
| | | /** |
| | | * Creates an array of TWTRTweet instances from the array of Twitter API JSON response. |
| | | * |
| | | * @param array A parsed array of Tweet API JSON responses. |
| | | * @return An array of TWTRTweet instances. |
| | | */ |
| | | + (NSArray *)tweetsWithJSONArray:(nullable NSArray *)array; |
| | | |
| | | /** |
| | | * Creates a new Tweet instance with a new value for the `isLiked` boolean |
| | | * value which is the opposite of the current value. |
| | | */ |
| | | - (TWTRTweet *)tweetWithLikeToggled; |
| | | |
| | | /** |
| | | * Tweet objects should be hyrdrated from a valid JSON object. See TWTRJSONConvertible for more information. |
| | | */ |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRTweetCashtagEntity.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright © 2016 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <TwitterKit/TWTRJSONConvertible.h> |
| | | #import "TWTRTweetEntity.h" |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * A Tweet entity which represents a Cashtag like '$twtr' |
| | | */ |
| | | @interface TWTRTweetCashtagEntity : TWTRTweetEntity <NSCoding, TWTRJSONConvertible> |
| | | |
| | | /** |
| | | * The text represented by this entity. |
| | | * @note This entity does not include the '$'. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *text; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRTweetEntity.h |
| | | // |
| | | // Copyright (c) 2016 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import <TwitterKit/TWTRJSONConvertible.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | @interface TWTRTweetEntity : NSObject <NSCoding, NSCopying, TWTRJSONConvertible> |
| | | |
| | | /** |
| | | * The start index of the entity in code points. |
| | | */ |
| | | @property (nonatomic, readonly) NSInteger startIndex; |
| | | |
| | | /** |
| | | * The end index of the entity in code points. |
| | | */ |
| | | @property (nonatomic, readonly) NSInteger endIndex; |
| | | |
| | | /** |
| | | * Initializes the receiver with the given start index and end index. |
| | | */ |
| | | - (instancetype)initWithStartIndex:(NSInteger)startIndex endIndex:(NSInteger)endIndex; |
| | | |
| | | /** |
| | | * Subclasses should override this method to provide an accessibility value |
| | | * which can be used inside of Tweets. |
| | | */ |
| | | - (NSString *)accessibilityValue; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRTweetHashtagEntity.h |
| | | // |
| | | // Copyright (c) 2016 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <TwitterKit/TWTRJSONConvertible.h> |
| | | #import "TWTRTweetEntity.h" |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * A Tweet entity which represents a Hashtag like '#twitterkit' |
| | | */ |
| | | @interface TWTRTweetHashtagEntity : TWTRTweetEntity <NSCoding, TWTRJSONConvertible> |
| | | |
| | | /** |
| | | * The text represented by this entity. |
| | | * @note This entity does not include the '#'. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *text; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRTweetTableViewCell.h |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <UIKit/UIKit.h> |
| | | #import "TWTRTweetView.h" |
| | | |
| | | @class TWTRTweet; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * A table view cell subclass which displays a Tweet. |
| | | */ |
| | | @interface TWTRTweetTableViewCell : UITableViewCell |
| | | |
| | | /** |
| | | * The Tweet view inside this cell. Holds all relevant text and images. |
| | | */ |
| | | @property (nonatomic, readonly) TWTRTweetView *tweetView; |
| | | |
| | | /** |
| | | * Configures the existing Tweet view with a Tweet. Updates labels, images, and thumbnails. |
| | | * |
| | | * @param tweet The `TWTRTweet` model object for the Tweet to display. |
| | | */ |
| | | - (void)configureWithTweet:(TWTRTweet *)tweet; |
| | | |
| | | /** |
| | | * Returns how tall the Tweet view should be. |
| | | * |
| | | * Uses the system to calculate the Auto Layout height. This is the same as |
| | | * calling sizeThatFits: on a cached TWTRTweetView instance to let the system |
| | | * calculate how tall the resulting view will be including the image, Retweet |
| | | * view, and optional action buttons. |
| | | * |
| | | * Note: The Auto Layout engine will throw an exception if this is called |
| | | * on a background thread. |
| | | * |
| | | * @param tweet the Tweet |
| | | * @param style the style of the Tweet view |
| | | * @param width the width of the Tweet |
| | | * @param showActions whether the Tweet view will be displaying actions |
| | | * |
| | | * @return the calculated height of the Tweet view |
| | | */ |
| | | + (CGFloat)heightForTweet:(TWTRTweet *)tweet style:(TWTRTweetViewStyle)style width:(CGFloat)width showingActions:(BOOL)showActions; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRTweetUrlEntity.h |
| | | // |
| | | // Copyright (c) 2016 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <TwitterKit/TWTRJSONConvertible.h> |
| | | #import "TWTRTweetEntity.h" |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * A Tweet entity which represents a URL |
| | | */ |
| | | @interface TWTRTweetUrlEntity : TWTRTweetEntity <NSCoding, TWTRJSONConvertible> |
| | | |
| | | /** |
| | | * The URL to display. This property may be truncated and may |
| | | * not be a valid URL. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *displayUrl; |
| | | |
| | | /** |
| | | * The expanded URL. This property will be a valid URL. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *expandedUrl; |
| | | |
| | | /** |
| | | * The t.co link which will redirect to the original URL. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *url; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRTweetUserMentionEntity.h |
| | | // |
| | | // Copyright (c) 2016 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <TwitterKit/TWTRJSONConvertible.h> |
| | | #import "TWTRTweetEntity.h" |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * A Tweet entity which represents a user mention. |
| | | */ |
| | | @interface TWTRTweetUserMentionEntity : TWTRTweetEntity <NSCoding, TWTRJSONConvertible> |
| | | |
| | | /** |
| | | * The userID of the user whom ha s been mentioned. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *userID; |
| | | |
| | | /** |
| | | * The name of the user whom has been mentioned. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *name; |
| | | |
| | | /** |
| | | * The screen name of the user whom has been mentioned. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *screenName; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRTweetView.h |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <UIKit/UIKit.h> |
| | | #import "TWTRTweetViewDelegate.h" |
| | | |
| | | @class TWTRTweet; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * The style for Tweet views. |
| | | */ |
| | | typedef NS_ENUM(NSUInteger, TWTRTweetViewStyle) { |
| | | |
| | | /** |
| | | * A full-size Tweet view. Displays images if present. |
| | | */ |
| | | TWTRTweetViewStyleRegular, |
| | | |
| | | /** |
| | | * A small Tweet view, primarily designed to be used in table views. |
| | | */ |
| | | TWTRTweetViewStyleCompact |
| | | }; |
| | | |
| | | /** |
| | | * A default combination of colors for Tweet views. |
| | | */ |
| | | typedef NS_ENUM(NSUInteger, TWTRTweetViewTheme) { |
| | | |
| | | /** |
| | | * Official light theme. |
| | | */ |
| | | TWTRTweetViewThemeLight, |
| | | |
| | | /** |
| | | * Official dark theme. |
| | | */ |
| | | TWTRTweetViewThemeDark, |
| | | }; |
| | | |
| | | /** |
| | | `TWTRTweetView` displays a single Tweet to the user. It handles background taps and other actions displayed to the user. |
| | | |
| | | TWTRAPIClient *APIClient = [[TWTRAPIClient alloc] init]; |
| | | [[APIClient loadTweetWithID:@"20" completion:^(TWTRTweet *tweet, NSError *error) { |
| | | if (tweet) { |
| | | TWTRTweetView *tweetView = [[TWTRTweetView alloc] initWithTweet:tweet]; |
| | | [self.view addSubview:tweetView]; |
| | | } else { |
| | | NSLog(@"Error loading Tweet: %@", [error localizedDescription]); |
| | | } |
| | | }]; |
| | | |
| | | ## Interaction |
| | | |
| | | The `TWTRTweetViewDelegate` is notified: |
| | | |
| | | - When the background is tapped. |
| | | - When a link is selected. |
| | | - When the share button is tapped. |
| | | - When the share action completes. |
| | | - When the favorite action completes. |
| | | |
| | | ## Usage in UITableView |
| | | |
| | | To allow for usage in a `UITableView`, the `configureWithTweet:` method allows configuration of an existing `TWTRTweetView` without having to create a new instance. |
| | | |
| | | ## Sizing |
| | | |
| | | When using Auto Layout, feel free to set a width or margin on the Tweet view. The height will be calculated automatically. For old-fashioned frame based layout you may use the standard `sizeThatFits:` method to calculate the appropriate height for a given width: |
| | | |
| | | // Find the height for a given width (20pts on either side) |
| | | CGFloat desiredHeight = [tweetView sizeThatFits:CGSizeMake(self.view.frame.size.width - 40, CGFLOAT_MAX)].height; |
| | | |
| | | ## UIAppearance |
| | | |
| | | You may use UIAppearance proxy objects to style certain aspects of Tweet views before those views are added to the view hierarchy. |
| | | |
| | | // Using UIAppearance Proxy |
| | | [TWTRTweetView appearance].theme = TWTRTweetViewThemeDark; |
| | | |
| | | // Setting colors directly |
| | | [TWTRTweetView appearance].primaryTextColor = [UIColor yellowColor]; |
| | | [TWTRTweetView appearance].backgroundColor = [UIColor blueColor]; |
| | | |
| | | // Setting action button visibility |
| | | [TWTRTweetView appearance].showActionButtons = NO; |
| | | |
| | | _Note:_ You can't change the theme through an appearance proxy after the view has already been added to the view hierarchy. Direct `theme` property access will work though. |
| | | */ |
| | | @interface TWTRTweetView : UIView <UIAppearanceContainer> |
| | | |
| | | /** |
| | | * The Tweet being displayed. |
| | | */ |
| | | @property (nonatomic, readonly) TWTRTweet *tweet; |
| | | |
| | | /** |
| | | * Background color of the Tweet view and all text labels (fullname, username, Tweet text, timestamp). |
| | | */ |
| | | @property (nonatomic) UIColor *backgroundColor UI_APPEARANCE_SELECTOR; |
| | | |
| | | /** |
| | | * Color of Tweet text and full name. |
| | | */ |
| | | @property (nonatomic) UIColor *primaryTextColor UI_APPEARANCE_SELECTOR; |
| | | |
| | | /** |
| | | * Color of links in Tweet text. |
| | | */ |
| | | @property (nonatomic) UIColor *linkTextColor UI_APPEARANCE_SELECTOR; |
| | | |
| | | /** |
| | | * Set whether the border should be shown. |
| | | * Defaults to YES. |
| | | */ |
| | | @property (nonatomic) BOOL showBorder UI_APPEARANCE_SELECTOR; |
| | | |
| | | /** |
| | | * Set whether the action buttons (Favorite, Share) should be shown. When toggled, |
| | | * both the visibility of the action buttons and the internal constraints are |
| | | * updated immediately. The layout will be updated the next layout pass that occurs. |
| | | * |
| | | * Defaults to NO. |
| | | */ |
| | | @property (nonatomic) BOOL showActionButtons; |
| | | |
| | | /** |
| | | * Setting the theme of the Tweet view will change the color properties accordingly. |
| | | * |
| | | * Set to `TWTRTweetViewThemeLight` by default. |
| | | */ |
| | | @property (nonatomic) TWTRTweetViewTheme theme; |
| | | |
| | | /** |
| | | * The style of the Tweet. i.e. `TWTRTweetViewStyleRegular` or `TWTRTweetViewStyleCompact`. |
| | | */ |
| | | @property (nonatomic, readonly) TWTRTweetViewStyle style; |
| | | |
| | | /** |
| | | * Optional delegate to receive notifications when certain actions happen |
| | | */ |
| | | @property (nonatomic, weak) IBOutlet id<TWTRTweetViewDelegate> delegate; |
| | | |
| | | /** |
| | | * Optional property to set a UIViewController from which to present various new UI |
| | | * e.g. when presenting a Share sheet, presenting a login view controller for actions, etc |
| | | */ |
| | | @property (nonatomic, weak) UIViewController *presenterViewController; |
| | | |
| | | /** |
| | | * Convenience initializer to configure a compact style Tweet view. |
| | | * |
| | | * @param tweet The Tweet to display. |
| | | * |
| | | * @return The fully-configured Tweet view. |
| | | */ |
| | | - (instancetype)initWithTweet:(nullable TWTRTweet *)tweet; |
| | | |
| | | /** |
| | | * Designated initializer. Initializes view with both Tweet and style. |
| | | * |
| | | * @param tweet The Tweet to display. |
| | | * @param style The style of the Tweet view (regular or compact). |
| | | * |
| | | * @return The fully configured Tweet view. |
| | | */ |
| | | - (instancetype)initWithTweet:(nullable TWTRTweet *)tweet style:(TWTRTweetViewStyle)style; |
| | | |
| | | /** |
| | | * Initialization with a frame parameter is not supported. |
| | | */ |
| | | - (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE; |
| | | |
| | | /** |
| | | Find the size that fits into a desired space. This is a system method on UIView but implemented on `TWTRTweetView` |
| | | |
| | | // Calculate the desired height at 280 points wide |
| | | CGSize desiredSize = [tweetView sizeThatFits:CGSizeMake(280, CGFLOAT_MAX)]; |
| | | |
| | | |
| | | @param size The space available. Should generally leave one orientation unconstrained, and the minimum width supported is 200pts. |
| | | |
| | | @return The size that will fit into the space available. |
| | | */ |
| | | - (CGSize)sizeThatFits:(CGSize)size; |
| | | |
| | | /** |
| | | * Update all images and label text to fully represent the given Tweet. |
| | | * |
| | | * @param tweet The Tweet to display. |
| | | */ |
| | | - (void)configureWithTweet:(nullable TWTRTweet *)tweet; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRTweetViewDelegate.h |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <UIKit/UIKit.h> |
| | | |
| | | @class TWTRSession; |
| | | @class TWTRTweet; |
| | | @class TWTRTweetView; |
| | | @class TWTRUser; |
| | | @protocol TWTRSessionStore; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | typedef void (^TWTRAuthenticationCompletionHandler)(id<TWTRSessionStore> sessionStore, NSString *userID); |
| | | |
| | | /** |
| | | Delegate for `TWTRTweetView` to receive updates on the user interacting with this particular Tweet view. |
| | | |
| | | // Create the tweet view |
| | | TWTRTweetView *tweetView = [[TWTRTweetView alloc] initWithTweet:tweet]; |
| | | // Set the delegate |
| | | tweetView.delegate = self; |
| | | */ |
| | | @protocol TWTRTweetViewDelegate <NSObject> |
| | | |
| | | @optional |
| | | |
| | | /** |
| | | * The tweet view image was tapped. |
| | | * |
| | | * @param tweetView The Tweet view that was tapped. |
| | | * @param image The exact UIImage data shown by the Tweet view. |
| | | * @param imageURL The full URL of the image being shown. |
| | | */ |
| | | - (void)tweetView:(TWTRTweetView *)tweetView didTapImage:(UIImage *)image withURL:(NSURL *)imageURL; |
| | | |
| | | /** |
| | | * The Tweet view video was tapped. |
| | | * If this method is not implemented a video player will be presented. |
| | | * |
| | | * @param tweetView The Tweet view that was tapped. |
| | | * @param videoURL The full URL of the video being shown. |
| | | */ |
| | | - (void)tweetView:(TWTRTweetView *)tweetView didTapVideoWithURL:(NSURL *)videoURL; |
| | | |
| | | /** |
| | | * A URL in the text of a tweet was tapped. Implement to show your own webview rather than opening Safari. |
| | | * |
| | | * @param tweetView The Tweet view that was tapped. |
| | | * @param url The URL that was tapped. |
| | | */ |
| | | - (void)tweetView:(TWTRTweetView *)tweetView didTapURL:(NSURL *)url; |
| | | |
| | | /** |
| | | * Called when the user's profile image is tapped. |
| | | * If this method is not implemented, the default behavior is to deep link into Twitter application or twitter.com in a webview. |
| | | * |
| | | * @param tweetView The Tweet view that was tapped. |
| | | * @param user The Twitter user. |
| | | */ |
| | | - (void)tweetView:(TWTRTweetView *)tweetView didTapProfileImageForUser:(TWTRUser *)user; |
| | | |
| | | /** |
| | | * Called when the Tweet is tapped. |
| | | * If this method is not implemented, the default behavior is to deep link into Twitter application or twitter.com in a webview. |
| | | * |
| | | * @param tweetView The Tweet view that was tapped. |
| | | * @param tweet The Tweet that user tapped. |
| | | */ |
| | | - (void)tweetView:(TWTRTweetView *)tweetView didTapTweet:(TWTRTweet *)tweet; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRUser.h |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import <TwitterKit/TWTRJSONConvertible.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * Represents a user on Twitter. |
| | | */ |
| | | @interface TWTRUser : NSObject <NSCoding, NSCopying, TWTRJSONConvertible> |
| | | |
| | | #pragma mark - Properties |
| | | |
| | | /** |
| | | * The ID of the Twitter User. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *userID; |
| | | |
| | | /** |
| | | * The user's name as it appears on their profile. |
| | | * |
| | | * @warning This can be modified by the user at any time. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *name; |
| | | |
| | | /** |
| | | * The user's username on Twitter. |
| | | * |
| | | * @warning This can be modified by the user at any time. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *screenName; |
| | | |
| | | /** |
| | | * Whether the user has been verified by Twitter. |
| | | */ |
| | | @property (nonatomic, readonly) BOOL isVerified; |
| | | |
| | | /** |
| | | * Whether the user is protected. |
| | | */ |
| | | @property (nonatomic, readonly) BOOL isProtected; |
| | | |
| | | /** |
| | | * The HTTPS URL of the user's profile image. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *profileImageURL; |
| | | |
| | | /** |
| | | * The URL of a smaller version of the user's profile image. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *profileImageMiniURL; |
| | | |
| | | /** |
| | | * The URL of a larger version of the user's profile image. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *profileImageLargeURL; |
| | | |
| | | /** |
| | | * The formatted version of the user's `screenName` with the `@` sign for display purposes. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *formattedScreenName; |
| | | |
| | | /** |
| | | * Returns the URL for deeplinking to the the user's profile. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSURL *profileURL; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRUserTimelineDataSource.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | #import <TwitterKit/TWTRTimelineDataSource.h> |
| | | |
| | | @class TWTRAPIClient; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * This Timeline Data Source provides a list of Tweets roughly consistent with the list on a Users profile page. The difference is that this data source will filter out Tweets that are direct replies to other users by default. |
| | | * |
| | | * These Tweets are ordered chronologically with the most recent first. |
| | | */ |
| | | @interface TWTRUserTimelineDataSource : NSObject <TWTRTimelineDataSource> |
| | | |
| | | /** |
| | | * The screen name of the User whose Tweets are being shown. Either the `screenName` or the `userID` are required. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *screenName; |
| | | |
| | | /** |
| | | * The userID of the User whose Tweets are being shown. Either the `screenName` or the `userID` are required. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *userID; |
| | | |
| | | /** |
| | | * The number of Tweets to request in each query to the Twitter Timeline API when fetching the next batch of Tweets. Will request 30 Tweets by default. Setting this value to 0 will use the server default. |
| | | */ |
| | | @property (nonatomic, readonly) NSUInteger maxTweetsPerRequest; |
| | | |
| | | /** |
| | | * Whether to request replies in the set of Tweets from the server. |
| | | * |
| | | * Defaults to NO. |
| | | */ |
| | | @property (nonatomic, readonly) BOOL includeReplies; |
| | | |
| | | /** |
| | | * Whether to request retweets in the set of Tweets from the server. |
| | | * |
| | | * Defaults to YES. |
| | | */ |
| | | @property (nonatomic, readonly) BOOL includeRetweets; |
| | | |
| | | /* |
| | | * A filtering object that hides certain tweets. |
| | | */ |
| | | @property (nonatomic, copy, nullable) TWTRTimelineFilter *timelineFilter; |
| | | |
| | | /** |
| | | * Convenience initializer. Uses default values for `maxTweetsPerRequest`, `includeReplies` and `includeRetweets`. |
| | | * |
| | | * @param screenName The screen name of a Twitter User |
| | | * @param client The API client to use for making network requests. |
| | | * |
| | | * @return A fully initialized user timeline datasource or nil. |
| | | */ |
| | | - (instancetype)initWithScreenName:(NSString *)screenName APIClient:(TWTRAPIClient *)client; |
| | | |
| | | /** |
| | | * The designated initialzer accepted values for properties. |
| | | * |
| | | * @param userID The user ID of the Twitter User |
| | | * @param screenName The screen name of the Twitter User |
| | | * @param client The API client to use for making network requests. |
| | | * @param maxTweetsPerRequest The number of Tweets per batch to request. A value of 0 will use the server default. |
| | | * @param includeReplies Whether replies should be requested |
| | | * @param includeRetweets Whether retweets should be requested |
| | | * |
| | | * @return A fully initialized user timeline datasource or nil. |
| | | */ |
| | | - (instancetype)initWithScreenName:(nullable NSString *)screenName userID:(nullable NSString *)userID APIClient:(TWTRAPIClient *)client maxTweetsPerRequest:(NSUInteger)maxTweetsPerRequest includeReplies:(BOOL)includeReplies includeRetweets:(BOOL)includeRetweets NS_DESIGNATED_INITIALIZER; |
| | | |
| | | - (instancetype)init NS_UNAVAILABLE; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // TWTRVideoMetaData.h |
| | | // TwitterKit |
| | | // |
| | | // Copyright © 2016 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <TwitterKit/TWTRJSONConvertible.h> |
| | | #import <UIKit/UIKit.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | FOUNDATION_EXTERN NSString *const TWTRMediaTypeMP4; |
| | | FOUNDATION_EXTERN NSString *const TWTRMediaTypeM3u8; |
| | | |
| | | @interface TWTRVideoMetaDataVariant : NSObject <NSCoding, NSCopying, TWTRJSONConvertible> |
| | | |
| | | /** |
| | | * The bitrate of the entitity |
| | | */ |
| | | @property (nonatomic, readonly) NSInteger bitrate; |
| | | |
| | | /** |
| | | * The content type of the video entity. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *contentType; |
| | | |
| | | /** |
| | | * The URL for the entity. |
| | | */ |
| | | @property (nonatomic, readonly) NSURL *URL; |
| | | |
| | | @end |
| | | |
| | | @interface TWTRVideoMetaData : NSObject <NSCoding, NSCopying, TWTRJSONConvertible> |
| | | |
| | | /** |
| | | * The URL of the video if the video is an mp4. This value is provided as a convenience |
| | | * method but user's should query the `variants` property to have finer grained control |
| | | * over which video they play. |
| | | */ |
| | | @property (nonatomic, readonly, nullable) NSURL *videoURL; |
| | | |
| | | /** |
| | | * Returns the array of variants. |
| | | */ |
| | | @property (nonatomic, readonly) NSArray *variants; |
| | | |
| | | /** |
| | | * The video's aspect ratio. |
| | | */ |
| | | @property (nonatomic, readonly) CGFloat aspectRatio; |
| | | |
| | | /** |
| | | * The video's duration in seconds. |
| | | */ |
| | | @property (nonatomic, readonly) NSTimeInterval duration; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // Twitter.h |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <TwitterCore/TWTRSession.h> |
| | | #import <TwitterCore/TWTRSessionStore.h> |
| | | #import <UIKit/UIKit.h> |
| | | #import "TWTRAPIClient.h" |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | * The central class of the Twitter Kit. |
| | | * @note This class can only be used from the main thread. |
| | | */ |
| | | @interface Twitter : NSObject |
| | | |
| | | /** |
| | | * Returns the Twitter singleton. |
| | | * |
| | | * @return The Twitter singleton. |
| | | */ |
| | | + (Twitter *)sharedInstance; |
| | | |
| | | /** |
| | | * Start Twitter with your consumer key and secret. These will override any credentials |
| | | * present in your applications Info.plist. |
| | | * |
| | | * You do not need to call this method unless you wish to provide credentials other than those |
| | | * in your Info.plist. |
| | | * |
| | | * @param consumerKey Your Twitter application's consumer key. |
| | | * @param consumerSecret Your Twitter application's consumer secret. |
| | | */ |
| | | - (void)startWithConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret; |
| | | |
| | | /** |
| | | * Start Twitter with a consumer key, secret, and keychain access group. See -[Twitter startWithConsumerKey:consumerSecret:] |
| | | * |
| | | * @param consumerKey Your Twitter application's consumer key. |
| | | * @param consumerSecret Your Twitter application's consumer secret. |
| | | * @param accessGroup An optional keychain access group to apply to session objects stored in the keychain. |
| | | * |
| | | * @note In the majority of situations applications will not need to specify an access group to use with Twitter sessions. |
| | | * This value is only needed if you plan to share credentials with another application that you control or if you are |
| | | * using TwitterKit with an app extension. |
| | | */ |
| | | - (void)startWithConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret accessGroup:(nullable NSString *)accessGroup; |
| | | |
| | | /** |
| | | * The current version of this kit. |
| | | */ |
| | | @property (nonatomic, copy, readonly) NSString *version; |
| | | |
| | | /** |
| | | * Authentication configuration details. Encapsulates the `consumerKey` and `consumerSecret` credentials required to authenticate a Twitter application. |
| | | */ |
| | | @property (nonatomic, readonly) TWTRAuthConfig *authConfig; |
| | | |
| | | /** |
| | | * Session store exposing methods to fetch and manage active sessions. Applications that need to manage |
| | | * multiple users should use the session store to authenticate and log out users. |
| | | */ |
| | | @property (nonatomic, readonly) TWTRSessionStore *sessionStore; |
| | | |
| | | /** |
| | | * Triggers user authentication with Twitter. |
| | | * |
| | | * This method will present UI to allow the user to log in if there are no saved Twitter login credentials. |
| | | * This method is equivalent to calling loginWithMethods:completion: with TWTRLoginMethodAll. |
| | | * |
| | | * @param completion The completion block will be called after authentication is successful or if there is an error. |
| | | * @warning This method requires that you have set up your `consumerKey` and `consumerSecret`. |
| | | */ |
| | | - (void)logInWithCompletion:(TWTRLogInCompletion)completion; |
| | | |
| | | /** |
| | | * Triggers user authentication with Twitter. Allows the developer to specify the presenting view controller. |
| | | * |
| | | * This method will present UI to allow the user to log in if there are no saved Twitter login credentials. |
| | | * |
| | | * @param viewController The view controller that will be used to present the authentication view. |
| | | * @param completion The completion block will be called after authentication is successful or if there is an error. |
| | | * @warning This method requires that you have set up your `consumerKey` and `consumerSecret`. |
| | | */ |
| | | - (void)logInWithViewController:(nullable UIViewController *)viewController completion:(TWTRLogInCompletion)completion; |
| | | |
| | | /** |
| | | * Finish the `SFSafariViewController` authentication loop. This method should |
| | | * be called from application:openURL:options inside the application delegate. |
| | | * |
| | | * This method will verify an authentication token sent by the Twitter API to |
| | | * finish the web-based authentication flow. |
| | | * |
| | | * @param application The `UIApplication` instance received as a parameter. |
| | | * @param url The `NSURL` instance received as a parameter. |
| | | * @param options The options dictionary received as a parameter. |
| | | * |
| | | * @return Boolean specifying whether this URL was handled |
| | | * by Twitter Kit or not. |
| | | */ |
| | | - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |
New file |
| | |
| | | // |
| | | // Prefix header |
| | | // |
| | | // The contents of this file are implicitly included at the beginning of every source file. |
| | | // |
| | | |
| | | #ifdef __OBJC__ |
| | | #import <Foundation/Foundation.h> |
| | | #import <TwitterCore/TWTRDefines.h> |
| | | #import <TwitterShareExtensionUI/TwitterShareExtensionUI.h> |
| | | #define IS_UIKIT_AVAILABLE (TARGET_OS_IOS || TARGET_OS_TV) |
| | | |
| | | #ifndef NS_DESIGNATED_INITIALIZER |
| | | #if __has_attribute(objc_designated_initializer) |
| | | #define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) |
| | | #else |
| | | #define NS_DESIGNATED_INITIALIZER |
| | | #endif |
| | | #endif |
| | | |
| | | #import "EXTKeyPathCoding.h" |
| | | #import "EXTScope.h" |
| | | #endif |
New file |
| | |
| | | // |
| | | // TwitterKit.h |
| | | // |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <AVFoundation/AVFoundation.h> |
| | | #import <Accounts/Accounts.h> |
| | | #import <CoreMedia/CoreMedia.h> |
| | | #import <Foundation/Foundation.h> |
| | | #import <TwitterCore/TwitterCore.h> |
| | | #import <UIKit/UIKit.h> |
| | | |
| | | #if __IPHONE_OS_VERSION_MIN_REQUIRED < 90000 |
| | | #error "TwitterKit doesn't support iOS 8.x and lower. Please, change your minimum deployment target to iOS 9.0" |
| | | #endif |
| | | |
| | | #import "TWTRAPIClient.h" |
| | | #import "TWTRCollectionTimelineDataSource.h" |
| | | #import "TWTRComposer.h" |
| | | #import "TWTRComposerViewController.h" |
| | | #import "TWTRJSONConvertible.h" |
| | | #import "TWTRListTimelineDataSource.h" |
| | | #import "TWTRLogInButton.h" |
| | | #import "TWTRMediaEntitySize.h" |
| | | #import "TWTRMoPubAdConfiguration.h" |
| | | #import "TWTRMoPubNativeAdContainerView.h" |
| | | #import "TWTRNotificationConstants.h" |
| | | #import "TWTROAuthSigning.h" |
| | | #import "TWTRSearchTimelineDataSource.h" |
| | | #import "TWTRTimelineCursor.h" |
| | | #import "TWTRTimelineDataSource.h" |
| | | #import "TWTRTimelineDelegate.h" |
| | | #import "TWTRTimelineFilter.h" |
| | | #import "TWTRTimelineType.h" |
| | | #import "TWTRTimelineViewController.h" |
| | | #import "TWTRTweet.h" |
| | | #import "TWTRTweetCashtagEntity.h" |
| | | #import "TWTRTweetEntity.h" |
| | | #import "TWTRTweetHashtagEntity.h" |
| | | #import "TWTRTweetTableViewCell.h" |
| | | #import "TWTRTweetUrlEntity.h" |
| | | #import "TWTRTweetUserMentionEntity.h" |
| | | #import "TWTRTweetView.h" |
| | | #import "TWTRTweetViewDelegate.h" |
| | | #import "TWTRUser.h" |
| | | #import "TWTRUserTimelineDataSource.h" |
| | | #import "TWTRVideoMetaData.h" |
| | | #import "Twitter.h" |
New file |
| | |
| | | framework module TwitterKit { |
| | | umbrella header "TwitterKit.h" |
| | | |
| | | export * |
| | | module * { export * } |
| | | |
| | | link framework "AVFoundation" |
| | | link framework "CoreMedia" |
| | | link framework "SafariServices" |
| | | } |
New file |
| | |
| | | // |
| | | // TWTRConstants_Private.h |
| | | // |
| | | // Copyright (c) 2014 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | #pragma mark - Twitter kit constants |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRVersion; |
| | | FOUNDATION_EXPORT NSString *const TWTRResourceBundleLocation; |
| | | FOUNDATION_EXPORT NSString *const TWTRBundleID; |
| | | |
| | | #pragma mark - User messages |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRMissingKitInfoMsg; |
| | | FOUNDATION_EXPORT NSString *const TWTRMissingConsumerKeyMsg; |
| | | FOUNDATION_EXPORT NSString *const TWTRMissingConsumerSecretMsg; |
| | | |
| | | #pragma mark - Twitter API |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRAPIRateLimitHeader; |
| | | FOUNDATION_EXPORT NSString *const TWTRAPIRateLimitRemainingHeader; |
| | | FOUNDATION_EXPORT NSString *const TWTRAPIRateLimitResetHeader; |
| | | |
| | | #pragma mark - Kit Info |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRKitInfoConsumerKeyKey; |
| | | FOUNDATION_EXPORT NSString *const TWTRKitInfoConsumerSecretKey; |
| | | |
| | | #pragma mark - URL Referrer |
| | | |
| | | FOUNDATION_EXPORT NSString *const TWTRURLReferrer; |
New file |
| | |
| | | // |
| | | // TWTRDateFormatter.h |
| | | // TwitterKit |
| | | // |
| | | // Created by Joey Carmello on 3/28/15. |
| | | // Copyright (c) 2015 Twitter. All rights reserved. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | @interface TWTRDateFormatter : NSObject |
| | | |
| | | /** |
| | | * Returns the formatted elapsed time string base on the given date. |
| | | * |
| | | * Logic: |
| | | * - Relative timestamp for anything less than 24 hours |
| | | * - Abbreviated month and day format (Aug 5), and no year for anything within the current year |
| | | * - MM/DD/YY (10/5/14) for anything beyond the current year |
| | | * |
| | | * @param date The date object to calculate elapsed time against. |
| | | * |
| | | * @return Formatted string of the elapsed time from the given date. |
| | | */ |
| | | + (NSString *)elapsedTimeStringSinceDate:(NSDate *)date; |
| | | |
| | | @end |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "لم يتم إرسال التغريدة"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "يرجى الانتقال إلى إعدادات iOS > الخصوصية > خدمات الموقع للسماح لتويتر بالوصول إلى موقعك."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "السماح لتويتر بالوصول إلى موقعك"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "تعذر العثور على موقعك. يرجى إعادة المحاولة لاحقًا."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "فشل الوصول إلى الموقع"; |
| | | |
| | | "OK_ACTION_LABEL" = "موافق"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "إعادة المحاولة"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "تغريد"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "الحساب"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "الموقع"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "بلا"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "لا توجد حسابات على تويتر تم تهيئتها. يمكنك إضافة حساب على تويتر أو إنشائه في \"الإعدادات\"."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "لا يوجد حساب على تويتر"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "فشل إرسال التغريدة."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "تويتر"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%d من الأيام"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%d يوم"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%d من الساعات"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%d ساعة"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%d من الدقائق"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%d دقيقة"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%d من الثواني"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%d ثانية"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "إلغاء"; |
| | | |
| | | "tw__card_compose_character_count" = "%td أحرف متبقيّة"; |
| | | |
| | | "tw__card_compose_close_hint" = "انقر مرتين لتجاهل المحرّر."; |
| | | |
| | | "tw__card_compose_install_preview" = "معاينة زر التنصيب لـ %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "الملف الشخصيّ لـ %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "انقر مرتين لمشاركة هذه التغريدة"; |
| | | |
| | | "tw__card_composer_app_store" = "متجر أبل"; |
| | | |
| | | "tw__card_composer_install_button" = "تنصيب"; |
| | | |
| | | "tw__card_composer_tweet" = "تغريد"; |
| | | |
| | | "tw__close_button" = "إغلاق"; |
| | | |
| | | "tw__composer_placeholder_text" = "ما الذي يحدث؟"; |
| | | |
| | | "tw__email_share_detail_message_format" = "احصل على تحديثات ومعلومات أخرى من %@ عندما تسمح لهم بالوصول إلى بريدك الإلكترونيّ على حسابك على تويتر @%@."; |
| | | |
| | | "tw__empty_timeline" = "الخط الزمني فارغ"; |
| | | |
| | | "tw__image_viewer_done_button" = "تمّ"; |
| | | |
| | | "tw__open_in_text" = "افتح في %@"; |
| | | |
| | | "tw__privacy_information_button" = "معلومات الخصوصيّة"; |
| | | |
| | | "tw__share_tweet" = "مشاركة التغريدة"; |
| | | |
| | | "tw__share_tweet_subject_format" = "تغريدة من %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "تسجيل الدخول في تويتر"; |
| | | |
| | | "tw__single_image" = "صورة مرفقة"; |
| | | |
| | | "tw__test_string" = "اختبار"; |
| | | |
| | | "tw__tweet_image_accessibility" = "المرفق"; |
| | | |
| | | "tw__tweet_like_button" = "إعجاب"; |
| | | |
| | | "tw__tweet_liked_state" = "تمّ الإعجاب بها"; |
| | | |
| | | "tw__tweet_not_liked_state" = "لم يتم الإعجاب بها"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "الملفّ الشخصيّ"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "مُعاد تغريدها بواسطة %@"; |
| | | |
| | | "tw__tweet_share_button" = "شارِك"; |
| | | |
| | | "tw__user_content_image" = "معاينة التطبيق"; |
| | | |
| | | "tw__video_thumbnail" = "فيديو مرفق"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "هذا إعلان مموَّل"; |
| | | |
New file |
| | |
| | | "tw__empty_timeline" = "Хрониката е празна"; |
| | | |
| | | "tw__image_viewer_done_button" = "Готово"; |
| | | |
| | | "tw__open_in_text" = "Отваряне в/ъв %@"; |
| | | |
| | | "tw__privacy_information_button" = "Поверителна информация"; |
| | | |
| | | "tw__tweet_share_button" = "Споделяне"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Това е платена реклама"; |
| | | |
New file |
| | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%d দিন"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%d দিন"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%d ঘণ্টা"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%d ঘণ্টা"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%d মিনিট"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%d মিনিট"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%d সেকেন্ড"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%d সেকেন্ড"; |
| | | |
| | | "tw__card_compose_character_count" = "%tdটি অক্ষর বাকি আছে"; |
| | | |
| | | "tw__card_compose_close_hint" = "রচয়িতা খারিজ করতে দুবার-আলতো চাপুন।"; |
| | | |
| | | "tw__card_compose_install_preview" = "%@ এর জন্য ইনস্টল বোতামের পূর্বরূপ"; |
| | | |
| | | "tw__card_compose_profile_image" = "%@এর প্রোফাইল"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "এই টুইটটি পোস্ট করতে দুবার-আলতো চাপুন"; |
| | | |
| | | "tw__card_composer_app_store" = "অ্যাপ স্টোর"; |
| | | |
| | | "tw__card_composer_install_button" = "ইনস্টল"; |
| | | |
| | | "tw__card_composer_tweet" = "টুইট"; |
| | | |
| | | "tw__composer_placeholder_text" = "কী হচ্ছে?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "আপনি আপনার @%@ টুইটার অ্যাকাউন্টে %@ কে আপনার ইমেইলে অ্যাক্সেস দিলে তাদের থেকে আপডেট এবং অন্যান্য তথ্য পান।"; |
| | | |
| | | "tw__empty_timeline" = "সময়রেখা খালি"; |
| | | |
| | | "tw__image_viewer_done_button" = "সম্পন্ন হয়েছে"; |
| | | |
| | | "tw__open_in_text" = "%@-এ খুলুন"; |
| | | |
| | | "tw__privacy_information_button" = "গোপনীয়তা তথ্য"; |
| | | |
| | | "tw__share_tweet" = "টুইট শেয়ার করুন"; |
| | | |
| | | "tw__share_tweet_subject_format" = "%1$@ (@%2$@) থেকে টুইট"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "টুইটার দিয়ে লগ ইন করুন"; |
| | | |
| | | "tw__single_image" = "চিত্র সংযুক্তি"; |
| | | |
| | | "tw__test_string" = "পরীক্ষা"; |
| | | |
| | | "tw__tweet_image_accessibility" = "সংযুক্তি"; |
| | | |
| | | "tw__tweet_like_button" = "পছন্দ করুন"; |
| | | |
| | | "tw__tweet_liked_state" = "পছন্দ করেছেন"; |
| | | |
| | | "tw__tweet_not_liked_state" = "পছন্দ না"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "প্রোফাইল"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "%@ পুনঃটুইট করেছেন"; |
| | | |
| | | "tw__tweet_share_button" = "শেয়ার করুন"; |
| | | |
| | | "tw__user_content_image" = "অ্যাপের পূর্বরূপ"; |
| | | |
| | | "tw__video_thumbnail" = "ভিডিও সংযুক্তি"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "এই একটি প্রযোজিত বিজ্ঞাপন"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "El tuit no s'ha enviat"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Vés a Configuració de l'iOS > Privacitat > Serveis d'ubicació per permetre que el Twitter accedeixi a la teva ubicació."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Permet que el Twitter accedeixi a la teva ubicació"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "No s'ha pogut trobar la ubicació. Torna-ho a provar més tard."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "No s'ha pogut accedir a la ubicació"; |
| | | |
| | | "OK_ACTION_LABEL" = "D'acord"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Torna-ho a provar"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tuit"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Compte"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Ubicació"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Cap"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "No hi ha cap compte de Twitter configurat. Pots afegir o crear un compte de Twitter a la configuració."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "No hi ha cap compte de Twitter"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "El tuit no s'ha pogut enviar."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%ds"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%ds"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Cancel·la"; |
| | | |
| | | "tw__card_compose_character_count" = "queden %td caràcters"; |
| | | |
| | | "tw__card_compose_close_hint" = "Toc doble per tancar l'editor."; |
| | | |
| | | "tw__card_compose_install_preview" = "Previsualització del botó d'instal·lació per a %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "perfil de %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Doble toc per publicar el tuit"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Instal·la"; |
| | | |
| | | "tw__card_composer_tweet" = "Tuit"; |
| | | |
| | | "tw__close_button" = "Tanca"; |
| | | |
| | | "tw__composer_placeholder_text" = "Què passa ara mateix?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Rep actualitzacions i altres dades de %@ quan els permetis accedir al correu electrònic al compte de Twitter @%@."; |
| | | |
| | | "tw__empty_timeline" = "La teva cronologia és buida"; |
| | | |
| | | "tw__image_viewer_done_button" = "Fet"; |
| | | |
| | | "tw__open_in_text" = "Obre'l a %@"; |
| | | |
| | | "tw__privacy_information_button" = "Informació de privacitat"; |
| | | |
| | | "tw__share_tweet" = "Comparteix el tuit"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tuit de %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Entra amb Twitter"; |
| | | |
| | | "tw__single_image" = "Imatge adjuntada"; |
| | | |
| | | "tw__test_string" = "Prova"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Fitxer adjunt"; |
| | | |
| | | "tw__tweet_like_button" = "T'agrada"; |
| | | |
| | | "tw__tweet_liked_state" = "T'ha agradat"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Sense agradament"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Perfil"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Retuitat per %@"; |
| | | |
| | | "tw__tweet_share_button" = "Comparteix"; |
| | | |
| | | "tw__user_content_image" = "Previsualització de l'aplicació"; |
| | | |
| | | "tw__video_thumbnail" = "Vídeo adjuntat"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Aquest anunci està patrocinat"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet nebyl odeslán."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Pro udělení přístupu k poloze pro Twitter přejděte do nastavení iOS > Soukromí > Služby polohy."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Povolit Twitteru přístup k vaší poloze"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Vaši polohu se nepodařilo zjistit. Zkuste to znovu později."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Polohu se nepodařilo získat."; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Opakovat"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Účet"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Poloha"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Žádný"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Na Twitteru nejsou nakonfigurovány žádné účty. Přidat nebo vytvořit účet na Twitteru můžete v nastavení."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Žádný účet na Twitteru"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Tweet se nepodařilo odeslat."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%d d."; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%d d."; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%d h"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%d h"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%d min"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%d min"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%d s"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%d s"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Zrušit"; |
| | | |
| | | "tw__card_compose_character_count" = "Zbývá znaků: %td"; |
| | | |
| | | "tw__card_compose_close_hint" = "Dvojitým klepnutím zavřete editor."; |
| | | |
| | | "tw__card_compose_install_preview" = "Náhled tlačítka Instalovat pro aplikaci %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Profil uživatele %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Dvojitým klepnutím Tweet odešlete."; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Instalovat"; |
| | | |
| | | "tw__card_composer_tweet" = "Tweetnout"; |
| | | |
| | | "tw__close_button" = "Zavřít"; |
| | | |
| | | "tw__composer_placeholder_text" = "Co se právě děje?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Když aplikaci %@ povolíte přístup k e-mailové adrese ve svém twitterovém účtu @%@, budete dostávat aktualizace a další informace."; |
| | | |
| | | "tw__empty_timeline" = "Časová osa je prázdná"; |
| | | |
| | | "tw__image_viewer_done_button" = "Hotovo"; |
| | | |
| | | "tw__open_in_text" = "Otevřít v aplikaci %@"; |
| | | |
| | | "tw__privacy_information_button" = "Informace o ochraně osobních údajů"; |
| | | |
| | | "tw__share_tweet" = "Sdílet tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet od uživatele %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Přihlásit se účtem od Twitteru"; |
| | | |
| | | "tw__single_image" = "Obrázek v příloze"; |
| | | |
| | | "tw__test_string" = "Test"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Příloha"; |
| | | |
| | | "tw__tweet_like_button" = "Lajknout"; |
| | | |
| | | "tw__tweet_liked_state" = "Lajknuto"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Nelajknuto"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profil"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Retweetnul uživatel %@"; |
| | | |
| | | "tw__tweet_share_button" = "Sdílet"; |
| | | |
| | | "tw__user_content_image" = "Náhled aplikace"; |
| | | |
| | | "tw__video_thumbnail" = "Video v příloze"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Toto je sponzorovaná reklama."; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet ikke sendt"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Gå til iOS-indstillingerne > Privatliv > Lokalitetstjenester for at give Twitter adgang til din lokalitet."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Giv Twitter adgang til din lokalitet"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Kunne ikke finde din lokalitet. Prøv igen senere."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Kunne ikke få adgang til lokalitet"; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Prøv igen"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Konto"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Lokalitet"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Ingen"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Der er ikke konfigureret nogen Twitter-konti. Du kan tilføje eller oprette en Twitter-konto i indstillingerne."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Ingen Twitter-konto"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Tweetet blev ikke sendt."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%d d"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%d t"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%d t"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%d m"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%d m"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%d s"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%d s"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Annuller"; |
| | | |
| | | "tw__card_compose_character_count" = "%td tegn tilbage"; |
| | | |
| | | "tw__card_compose_close_hint" = "Dobbelttryk for at fjerne sammensætteren."; |
| | | |
| | | "tw__card_compose_install_preview" = "Forhåndsvisning af installer-knappen for %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "%@s profil"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Dobbelttryk for at sende dette Tweet"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Installer"; |
| | | |
| | | "tw__card_composer_tweet" = "Tweet"; |
| | | |
| | | "tw__close_button" = "Luk"; |
| | | |
| | | "tw__composer_placeholder_text" = "Hvad sker der?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Hent opdateringer og andre oplysninger fra %@ når du lader dem få adgang til din e-mail på din Twitter-konto @%@."; |
| | | |
| | | "tw__empty_timeline" = "Tidslinje er tom"; |
| | | |
| | | "tw__image_viewer_done_button" = "Færdig"; |
| | | |
| | | "tw__open_in_text" = "Åbn i %@"; |
| | | |
| | | "tw__privacy_information_button" = "Privatlivsoplysninger"; |
| | | |
| | | "tw__share_tweet" = "Del tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet fra %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Log ind med Twitter"; |
| | | |
| | | "tw__single_image" = "Vedhæftet billede"; |
| | | |
| | | "tw__test_string" = "Test"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Vedhæftning"; |
| | | |
| | | "tw__tweet_like_button" = "Like"; |
| | | |
| | | "tw__tweet_liked_state" = "Liket"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Ikke liket"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profil"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Retweetet af %@"; |
| | | |
| | | "tw__tweet_share_button" = "Del"; |
| | | |
| | | "tw__user_content_image" = "Forhåndsvisning af app"; |
| | | |
| | | "tw__video_thumbnail" = "Vedhæftet video"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Dette er en sponsoreret annonce"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet nicht gesendet"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Öffne die iOS-Einstellungen > Datenschutz > Ortungsdienste, um Twitter Zugriff auf deinen Standort zu geben."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Twitter Zugriff auf deinen Standort erlauben"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Dein Standort konnte nicht gefunden werden. Versuche es später erneut."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Fehler beim Abrufen des Standorts"; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Wiederholen"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Account"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Standort"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Kein"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Es sind keine Twitter Accounts konfiguriert. In den Einstellungen kannst du einen Twitter Account hinzufügen oder anlegen."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Kein Twitter Account"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Fehler beim Senden des Tweets."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dT"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dT"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dS"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dS"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dM"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dM"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%ds"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%ds"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Abbrechen"; |
| | | |
| | | "tw__card_compose_character_count" = "%td Zeichen übrig"; |
| | | |
| | | "tw__card_compose_close_hint" = "Doppelt antippen, um den Composer abzubrechen."; |
| | | |
| | | "tw__card_compose_install_preview" = "Vorschau des Installationsknopfes für %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Profil von %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Doppeltippen, um diesen Tweet zu posten"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Installieren"; |
| | | |
| | | "tw__card_composer_tweet" = "Twittern"; |
| | | |
| | | "tw__close_button" = "Schließen"; |
| | | |
| | | "tw__composer_placeholder_text" = "Was passiert gerade?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Du erhältst Updates und andere Informationen von %@, wenn Du ihnen auf Deinem Twitter Account @%@ den Zugriff auf Deine E-Mail erlaubst."; |
| | | |
| | | "tw__empty_timeline" = "Die Timeline ist leer"; |
| | | |
| | | "tw__image_viewer_done_button" = "Fertig"; |
| | | |
| | | "tw__open_in_text" = "In %@ öffnen"; |
| | | |
| | | "tw__privacy_information_button" = "Datenschutzinformation"; |
| | | |
| | | "tw__share_tweet" = "Tweet teilen"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet von %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Mit Twitter anmelden"; |
| | | |
| | | "tw__single_image" = "Bild-Anhang"; |
| | | |
| | | "tw__test_string" = "Test"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Anhang"; |
| | | |
| | | "tw__tweet_like_button" = "Gefällt mir"; |
| | | |
| | | "tw__tweet_liked_state" = "Gefällt mir"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Gefällt mir nicht"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profil"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Retweetet von %@"; |
| | | |
| | | "tw__tweet_share_button" = "Teilen"; |
| | | |
| | | "tw__user_content_image" = "App Vorschau"; |
| | | |
| | | "tw__video_thumbnail" = "Video-Anhang"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Dies ist eine gesponserte Anzeige"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Το Tweet δεν εστάλη"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Μεταβείτε στις επιλογές Ρυθμίσεις iOS > Απόρρητο > Υπηρεσίες τοποθεσίας, για να επιτρέψετε στο Twitter την πρόσβαση στην τοποθεσία σας"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Να επιτρέπεται στο Twitter η πρόσβαση στην τοποθεσία σας"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Δεν ήταν δυνατή η εύρεση της τοποθεσίας σας. Δοκιμάστε ξανά αργότερα."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Δεν ήταν δυνατή η πρόσβαση στην τοποθεσία"; |
| | | |
| | | "OK_ACTION_LABEL" = "Εντάξει"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Δοκιμάστε ξανά"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Λογαριασμός"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Τοποθεσία"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Κανένα"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Δεν υπάρχουν διαμορφωμένοι λογαριασμοί Twitter. Μπορείτε να προσθέσετε ή να δημιουργήσετε έναν λογαριασμό Twitter στις Ρυθμίσεις."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Κανένας λογαριασμός Twitter"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Δεν ήταν δυνατή η αποστολή του Tweet."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dη"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dη"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dω"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dω"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dλ"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dλ"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%dδ"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%dδ"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Ακύρωση"; |
| | | |
| | | "tw__card_compose_character_count" = "απομένουν %td χαρακτήρες"; |
| | | |
| | | "tw__card_compose_close_hint" = "Πατήστε δύο φορές για να κλείσετε τη λειτουργία σύνταξης."; |
| | | |
| | | "tw__card_compose_install_preview" = "Προεπισκόπηση του κουμπιού εγκατάστασης για %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Προφίλ του χρήστη %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Πατήστε δύο φορές για να δημοσιεύσετε αυτό το Tweet"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Εγκατάσταση"; |
| | | |
| | | "tw__card_composer_tweet" = "Tweet"; |
| | | |
| | | "tw__close_button" = "Κλείσιμο"; |
| | | |
| | | "tw__composer_placeholder_text" = "Τι συμβαίνει;"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Λάβετε ενημερώσεις και άλλες πληροφορίες από %@, όταν επιτρέπετε την πρόσβαση στη διεύθυνση ηλεκτρονικού ταχυδρομείου σας στο λογαριασμό σας @%@ στο Twitter."; |
| | | |
| | | "tw__empty_timeline" = "Το χρονολόγιο είναι άδειο"; |
| | | |
| | | "tw__image_viewer_done_button" = "Τέλος"; |
| | | |
| | | "tw__open_in_text" = "Άνοιγμα στην εφαρμογή %@"; |
| | | |
| | | "tw__privacy_information_button" = "Πληροφορίες ιδιωτικότητας"; |
| | | |
| | | "tw__share_tweet" = "Κοινοποίηση Tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet από το χρήστη %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Είσοδος με το Twitter"; |
| | | |
| | | "tw__single_image" = "Επισύναψη εικόνας"; |
| | | |
| | | "tw__test_string" = "Δοκιμή"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Συνημμένο"; |
| | | |
| | | "tw__tweet_like_button" = "Μου αρέσει"; |
| | | |
| | | "tw__tweet_liked_state" = "Επιλέχθηκε \"Μου αρέσει\""; |
| | | |
| | | "tw__tweet_not_liked_state" = "Δεν έχει επισημανθεί με \"Μου αρέσει\""; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Προφίλ"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Έγινε Retweet από το χρήστη %@"; |
| | | |
| | | "tw__tweet_share_button" = "Κοινοποίηση"; |
| | | |
| | | "tw__user_content_image" = "Προεπισκόπηση εφαρμογής"; |
| | | |
| | | "tw__video_thumbnail" = "Επισύναψη βίντεο"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Αυτή είναι μια επιδοτούμενη διαφήμιση"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet not sent"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Please go to iOS Settings > Privacy > Location Services to allow Twitter to access your location."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Allow Twitter to access your location"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Couldn’t find your location. Please try again later."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Failed to access location"; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Retry"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Account"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Location"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "None"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "There are no Twitter accounts configured. You can add or create a Twitter account in Settings."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "No Twitter Account"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Tweet failed to send."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%ds"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%ds"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Cancel"; |
| | | |
| | | "tw__card_compose_character_count" = "%td characters remaining"; |
| | | |
| | | "tw__card_compose_close_hint" = "Double-tap to dismiss the composer."; |
| | | |
| | | "tw__card_compose_install_preview" = "Preview of install button for %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "%@'s profile"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Double-tap to post this Tweet"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Install"; |
| | | |
| | | "tw__card_composer_tweet" = "Tweet"; |
| | | |
| | | "tw__close_button" = "Close"; |
| | | |
| | | "tw__composer_placeholder_text" = "What's happening?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Get updates and other information from %@ when you allow them access to your email on your Twitter account @%@."; |
| | | |
| | | "tw__empty_timeline" = "Timeline is empty"; |
| | | |
| | | "tw__image_viewer_done_button" = "Done"; |
| | | |
| | | "tw__open_in_text" = "Open in %@"; |
| | | |
| | | "tw__privacy_information_button" = "Privacy information"; |
| | | |
| | | "tw__share_tweet" = "Share Tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet from %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Log in with Twitter"; |
| | | |
| | | "tw__single_image" = "Image Attachment"; |
| | | |
| | | "tw__test_string" = "Test"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Attachment"; |
| | | |
| | | "tw__tweet_like_button" = "Like"; |
| | | |
| | | "tw__tweet_liked_state" = "Liked"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Not liked"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profile"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Retweeted by %@"; |
| | | |
| | | "tw__tweet_share_button" = "Share"; |
| | | |
| | | "tw__user_content_image" = "App Preview"; |
| | | |
| | | "tw__video_thumbnail" = "Video Attachment"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "This is a sponsored ad"; |
| | | |
New file |
| | |
| | | /* Label for button to bring up share dialog to share this Tweet in a single Tweet view */ |
| | | "tw__share_tweet" = "Share Tweet"; |
| | | /* Subject format used to prefill certain sharing options such as Email includes full name (%1$@) and screenname (%2$@) */ |
| | | "tw__share_tweet_subject_format" = "Tweet from %1$@ (@%2$@)"; |
| | | /* Generic share text format used in all sharing options includes screenname (%1$@) and URL to the Tweet (%2$@) */ |
| | | "tw__share_tweet_generic_template_format" = "Check out @%1$@\'s Tweet: %2$@"; |
| | | /* Label for Sign in with Twitter button */ |
| | | "tw__sign_in_with_twitter_button" = "Log in with Twitter"; |
| | | /* Detail message that includes the app name and username on the share your email screen */ |
| | | "tw__email_share_detail_message_format" = "Get updates and other information from %@ when you allow them access to your email on your Twitter account @%@."; |
| | | /* Label for attributing this Tweet was retweeted by the user %@ */ |
| | | "tw__tweet_retweeted_by_user" = "Retweeted by %@"; |
| | | /* Label for the Install button within the app promo card preview of the Tweet composer */ |
| | | "tw__card_composer_install_button" = "Install"; |
| | | /* Label for the post tweet button in the compose view */ |
| | | "tw__card_composer_tweet" = "Tweet"; |
| | | /* Label for the App Store subtitle on the card install preview */ |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | /* Placeholder text for the composer */ |
| | | "tw__composer_placeholder_text" = "What's Happening?"; |
| | | /* Label to explain this view contains sponsored ads. This is also spoken out with VoiceOver when an ad is shown. */ |
| | | "tw__view_is_sponsored_ad" = "This is a sponsored ad"; |
| | | /* Label to show users when a button will open a link in another app */ |
| | | "tw__open_in_text" = "Open in %@"; |
| | | /* Label for explaining that there were no matching Tweets found for a given timeline (User/Collection/Search, etc). */ |
| | | "tw__empty_timeline" = "Timeline is empty"; |
| | | |
| | | /* Timestamps */ |
| | | |
| | | /* Really short abbreviation for days (plural). 5 days would be '5d' */ |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dd"; |
| | | /* Really short abbreviation for day (singular). 1 day would be '1d' */ |
| | | "TIME_SHORT_DAY_FORMAT" = "%dd"; |
| | | /* Really short abbreviation for hours (plural). 5 hours would be '5h' */ |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dh"; |
| | | /* Really short abbreviation for hour (singular). 1 hour would be '1h' */ |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dh"; |
| | | /* Really short abbreviation for minutes (plural). 5 minutes would be '5m' */ |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dm"; |
| | | /* Really short abbreviation for minute (singular). 1 minute would be '1m' */ |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dm"; |
| | | /* Really short abbreviation for seconds (plural). 5 seconds would be '5s' */ |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%ds"; |
| | | /* Really short abbreviation for second (singular). '1s' */ |
| | | "TIME_SHORT_SECOND_FORMAT" = "%ds"; |
| | | |
| | | /* Accessibility Labels */ |
| | | |
| | | /* Text spoken out with VoiceOver when a tweet has an image thumbnail showing */ |
| | | "tw__single_image" = "Image Attachment"; |
| | | /* Text spoken out with VoiceOver when a tweet has a video thumbnail showing */ |
| | | "tw__video_thumbnail" = "Video Attachment"; |
| | | /* Text spoken out with VoiceOver for selecting the profile image on a regular tweet view */ |
| | | "tw__tweet_profile_accessibility" = "Profile"; |
| | | /* Text spoken out with VoiceOver for selecting the attached image on a regular tweet view */ |
| | | "tw__tweet_image_accessibility" = "Attachment"; |
| | | /* Text spoken out with VoiceOver for the close button in the image viewer */ |
| | | "tw__close_button" = "Close"; |
| | | /* Text spoken out with VoiceOver for the content image of the card composer preview */ |
| | | "tw__user_content_image" = "App Preview"; |
| | | /* Text spoken out with VoiceOver for the Install button preview in card composer previews */ |
| | | "tw__card_compose_install_preview" = "Preview of install button for %@"; |
| | | /* Text spoken as VoiceOver hint for Tweet button in the card composer bottom bar */ |
| | | "tw__card_compose_tweet_hint" = "Double-tap to post this Tweet"; |
| | | /* Text spoken out with VoiceOver for the remaining character count in composer bottom bar */ |
| | | "tw__card_compose_character_count" = "%td characters remaining"; |
| | | /* Text spoken out with VoiceOver for the profile image in the composer top bar */ |
| | | "tw__card_compose_profile_image" = "%@'s profile"; |
| | | |
| | | /* Text spoken out as VoiceOver hint for the close button in the card composer top bar */ |
| | | "tw__card_compose_close_hint" = "Double-tap to dismiss the composer."; |
| | | /* VoiceOver label for Done button on image viewer */ |
| | | "tw__image_viewer_done_button" = "Done"; |
| | | /* VoiceOver label for Like button */ |
| | | "tw__tweet_like_button" = "Like"; |
| | | /* VoiceOver value for Like button on Tweet that has been liked */ |
| | | "tw__tweet_liked_state" = "Liked"; |
| | | /* VoiceOver value for Like button on Tweet that has not yet been liked */ |
| | | "tw__tweet_not_liked_state" = "Not Liked"; |
| | | /* VoiceOver label for Share button */ |
| | | "tw__tweet_share_button" = "Share"; |
| | | /* VoiceOver for privacy button to bring up the privacy page URL for ads */ |
| | | "tw__privacy_information_button" = "Privacy information"; |
| | | |
| | | |
| | | /* Shared composer */ |
| | | |
| | | /* "Cancel" */ |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Cancel"; |
| | | /* "Tweet not sent" */ |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet not sent"; |
| | | /* Please go to iOS Settings > Privacy > Location Services to allow Twitter to access your location. */ |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Please go to iOS Settings > Privacy > Location Services to allow Twitter to access your location."; |
| | | /* Allow Twitter to access your location */ |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Allow Twitter to access your location"; |
| | | /* Couldn’t find your location. Please try again later. */ |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Couldn’t find your location. Please try again later."; |
| | | /* "Failed to access location" */ |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Failed to access location"; |
| | | /* "OK" */ |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | /* "Retry" */ |
| | | "RETRY_ACTION_LABEL" = "Retry"; |
| | | /* "Tweet" */ |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | /* "Account" */ |
| | | "SHARE_EXT_ACCOUNT" = "Account"; |
| | | /* "Location" */ |
| | | "SHARE_EXT_LOCATION" = "Location"; |
| | | /* "There are no Twitter accounts configured. You can add or create a Twitter account in Settings." */ |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "There are no Twitter accounts configured. You can add or create a Twitter account in Settings."; |
| | | /* "No Twitter Account" */ |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "No Twitter Account"; |
| | | /* "None" */ |
| | | "SHARE_EXT_NONE_VALUE" = "None"; |
| | | /* "Tweet failed to send" */ |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Tweet failed to send."; |
| | | /* "Twitter" */ |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | |
| | | /* Test String (just for unit tests) */ |
| | | "tw__test_string" = "Test"; |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet no enviado"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Ve a la Configuración de iOS > Privacidad > Servicios de ubicación para permitir que Twitter acceda a tu ubicación."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Permite que Twitter acceda a tu ubicación"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "No se pudo encontrar tu ubicación. Inténtalo de nuevo más tarde."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "No se pudo acceder a la ubicación"; |
| | | |
| | | "OK_ACTION_LABEL" = "Aceptar"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Reintentar"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Cuenta"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Ubicación"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Ninguno"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "No hay cuentas de Twitter configuradas. Para agregar o crear una cuenta de Twitter, ve a la Configuración."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Sin cuenta de Twitter"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "No se pudo enviar el Tweet."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%ds"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%ds"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Cancelar"; |
| | | |
| | | "tw__card_compose_character_count" = "%td caracteres restantes"; |
| | | |
| | | "tw__card_compose_close_hint" = "Pulsa dos veces para descartar el redactor."; |
| | | |
| | | "tw__card_compose_install_preview" = "Vista previa del botón de descarga de %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Perfil de %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Pulsa dos veces para publicar este Tweet"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Instalar"; |
| | | |
| | | "tw__card_composer_tweet" = "Twittear"; |
| | | |
| | | "tw__close_button" = "Cerrar"; |
| | | |
| | | "tw__composer_placeholder_text" = "¿Qué está sucediendo?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Recibe actualizaciones y otra información de %@ cuando les permites acceso a tu correo electrónico en tu cuenta de Twitter @%@."; |
| | | |
| | | "tw__empty_timeline" = "La cronología está vacía"; |
| | | |
| | | "tw__image_viewer_done_button" = "Listo"; |
| | | |
| | | "tw__open_in_text" = "Abrir en %@"; |
| | | |
| | | "tw__privacy_information_button" = "Información de privacidad"; |
| | | |
| | | "tw__share_tweet" = "Compartir Tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet de %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Iniciar sesión con Twitter"; |
| | | |
| | | "tw__single_image" = "Imagen adjunta"; |
| | | |
| | | "tw__test_string" = "Prueba"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Adjunto"; |
| | | |
| | | "tw__tweet_like_button" = "Me gusta"; |
| | | |
| | | "tw__tweet_liked_state" = "Marcado como Me gusta"; |
| | | |
| | | "tw__tweet_not_liked_state" = "No marcado como Me gusta"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Perfil"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Retwitteado por %@"; |
| | | |
| | | "tw__tweet_share_button" = "Compartir"; |
| | | |
| | | "tw__user_content_image" = "Vista previa de la aplicación"; |
| | | |
| | | "tw__video_thumbnail" = "Video adjunto"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Este es un anuncio patrocinado"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet no enviado"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Ve a la Configuración de iOS > Privacidad > Servicios de ubicación para permitir que Twitter acceda a tu ubicación."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Permite que Twitter acceda a tu ubicación"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "No se pudo encontrar tu ubicación. Inténtalo de nuevo más tarde."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "No se pudo acceder a la ubicación"; |
| | | |
| | | "OK_ACTION_LABEL" = "Aceptar"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Reintentar"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Cuenta"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Ubicación"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Ninguno"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "No hay cuentas de Twitter configuradas. Para agregar o crear una cuenta de Twitter, ve a la Configuración."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Sin cuenta de Twitter"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "No se pudo enviar el Tweet."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%ds"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%ds"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Cancelar"; |
| | | |
| | | "tw__card_compose_character_count" = "%td caracteres restantes"; |
| | | |
| | | "tw__card_compose_close_hint" = "Pulsa dos veces para descartar el redactor."; |
| | | |
| | | "tw__card_compose_install_preview" = "Vista previa del botón de descarga de %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Perfil de %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Pulsa dos veces para publicar este Tweet"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Instalar"; |
| | | |
| | | "tw__card_composer_tweet" = "Twittear"; |
| | | |
| | | "tw__close_button" = "Cerrar"; |
| | | |
| | | "tw__composer_placeholder_text" = "¿Qué está sucediendo?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Recibe actualizaciones y otra información de %@ cuando les permites acceso a tu correo electrónico en tu cuenta de Twitter @%@."; |
| | | |
| | | "tw__empty_timeline" = "La cronología está vacía"; |
| | | |
| | | "tw__image_viewer_done_button" = "Listo"; |
| | | |
| | | "tw__open_in_text" = "Abrir en %@"; |
| | | |
| | | "tw__privacy_information_button" = "Información de privacidad"; |
| | | |
| | | "tw__share_tweet" = "Compartir Tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet de %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Iniciar sesión con Twitter"; |
| | | |
| | | "tw__single_image" = "Imagen adjunta"; |
| | | |
| | | "tw__test_string" = "Prueba"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Adjunto"; |
| | | |
| | | "tw__tweet_like_button" = "Me gusta"; |
| | | |
| | | "tw__tweet_liked_state" = "Marcado como Me gusta"; |
| | | |
| | | "tw__tweet_not_liked_state" = "No marcado como Me gusta"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Perfil"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Retwitteado por %@"; |
| | | |
| | | "tw__tweet_share_button" = "Compartir"; |
| | | |
| | | "tw__user_content_image" = "Vista previa de la aplicación"; |
| | | |
| | | "tw__video_thumbnail" = "Video adjunto"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Este es un anuncio patrocinado"; |
| | | |
New file |
| | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dروز"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dروز"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dساعت"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dساعت"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dدقیقه"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dدقیقه"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%dثانیه"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%dثانیه"; |
| | | |
| | | "tw__card_compose_character_count" = "%td نویسه باقی مانده"; |
| | | |
| | | "tw__card_compose_close_hint" = "برای نادیدهگرفتن سازنده دوبار ضربه بزنید"; |
| | | |
| | | "tw__card_compose_install_preview" = "پیشنمایش دکمه نصب برای %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "نمایه %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "برای پست کردن این توییت دوبار ضربه بزنید"; |
| | | |
| | | "tw__card_composer_app_store" = "اپ استور"; |
| | | |
| | | "tw__card_composer_install_button" = "نصب"; |
| | | |
| | | "tw__card_composer_tweet" = "توییت"; |
| | | |
| | | "tw__composer_placeholder_text" = "چه خبر؟"; |
| | | |
| | | "tw__email_share_detail_message_format" = "هنگامی که به دیگران اجازه می دهید در حساب @%@ توییترتان به ایمیلتان دسترسی داشته باشند، به روز رسانی ها و اطلاعات دیگر را از %@ دریافت کنید."; |
| | | |
| | | "tw__empty_timeline" = "خط زمان خالی است"; |
| | | |
| | | "tw__image_viewer_done_button" = "انجام شد"; |
| | | |
| | | "tw__open_in_text" = "در %@ باز میشود"; |
| | | |
| | | "tw__privacy_information_button" = "اطلاعات حریم شخصی"; |
| | | |
| | | "tw__share_tweet" = "اشتراک گذاری توییت"; |
| | | |
| | | "tw__share_tweet_subject_format" = "توییت از طرف %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "ورود با توییتر"; |
| | | |
| | | "tw__single_image" = "پیوست تصویری"; |
| | | |
| | | "tw__test_string" = "تست"; |
| | | |
| | | "tw__tweet_image_accessibility" = "پیوست"; |
| | | |
| | | "tw__tweet_like_button" = "پسندیدن"; |
| | | |
| | | "tw__tweet_liked_state" = "پسندیده شد"; |
| | | |
| | | "tw__tweet_not_liked_state" = "پسندیده نشده"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "نمایه"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "بازتوییت شده توسط %@"; |
| | | |
| | | "tw__tweet_share_button" = "اشتراکگذارى"; |
| | | |
| | | "tw__user_content_image" = "پیشنمایش برنامه"; |
| | | |
| | | "tw__video_thumbnail" = "پیوست ویدیویی"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "این آگهی دارای پشتیبانی مالی است"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Twiittiä ei lähetetty"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Siirry iOS-asetusten kohtaan Yksityisyys > Sijaintipalvelut ja anna Twitterille lupa käyttää sijaintiasi."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Salli Twitterille sijainnin käyttö"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Sijaintia ei löytynyt. Yritä myöhemmin uudelleen."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Sijaintia ei löytynyt"; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Yritä uudelleen"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Twiittaa"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Tili"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Sijainti"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Ei mitään"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Sinulle ei ole määritetty Twitter-tilejä. Voit lisätä tilin tai luoda uuden Twitter-tilin Asetuksissa."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Ei Twitter-tiliä"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Twiitin lähetys ei onnistunut."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%d d"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%d d"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%d h"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%d h"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%d m"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%d m"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%d s"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%d s"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Peruuta"; |
| | | |
| | | "tw__card_compose_character_count" = "%td merkkiä jäljellä"; |
| | | |
| | | "tw__card_compose_close_hint" = "Hylkää lähettäminen kaksoisnapauttamalla."; |
| | | |
| | | "tw__card_compose_install_preview" = "Asenna-painikkeen esikatselu kohteelle %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Käyttäjän %@ profiili"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Lähetä tämä twiitti kaksoisnapauttamalla"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Asenna"; |
| | | |
| | | "tw__card_composer_tweet" = "Twiittaa"; |
| | | |
| | | "tw__close_button" = "Sulje"; |
| | | |
| | | "tw__composer_placeholder_text" = "Mitä tapahtuu?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Saat käyttäjän %@ päivityksiä ja muuta tietoa sallimalla käyttäjälle Twitter-tilisi @%@ sähköpostiosoitteen käytön."; |
| | | |
| | | "tw__empty_timeline" = "Aikajana on tyhjä"; |
| | | |
| | | "tw__image_viewer_done_button" = "Valmis"; |
| | | |
| | | "tw__open_in_text" = "Avaa sovelluksessa %@"; |
| | | |
| | | "tw__privacy_information_button" = "Yksityisyystiedot"; |
| | | |
| | | "tw__share_tweet" = "Jaa twiitti"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Twiitti käyttäjältä %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Kirjaudu Twitter-tunnuksella"; |
| | | |
| | | "tw__single_image" = "Kuvaliite"; |
| | | |
| | | "tw__test_string" = "Testi"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Liite"; |
| | | |
| | | "tw__tweet_like_button" = "Tykkää"; |
| | | |
| | | "tw__tweet_liked_state" = "Tykätty"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Ei tykätty"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profiili"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Uudelleentwiitannut %@"; |
| | | |
| | | "tw__tweet_share_button" = "Jaa"; |
| | | |
| | | "tw__user_content_image" = "Sovelluksen esikatselu"; |
| | | |
| | | "tw__video_thumbnail" = "Videoliite"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Tämä on sponsoroitu mainos"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet non envoyé"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Veuillez aller dans les Réglages d'iOS > Confidentialité > Service de localisation pour autoriser Twitter à accéder à votre localisation."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Autorisez Twitter à accéder à votre localisation."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Nous n'avons pas pu trouver votre localisation. Veuillez réessayer plus tard."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Échec de l'accès à la localisation."; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Réessayer"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweeter"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Compte"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Localisation"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Aucun"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Aucun compte Twitter n'est configuré. Vous pouvez ajouter ou créer un compte Twitter dans les Réglages."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Pas de compte Twitter"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Échec de l'envoi du Tweet."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dj"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dj"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%ds"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%ds"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Annuler"; |
| | | |
| | | "tw__card_compose_character_count" = "%td caractères restants"; |
| | | |
| | | "tw__card_compose_close_hint" = "Tapez deux fois pour passer le composeur."; |
| | | |
| | | "tw__card_compose_install_preview" = "Aperçu du bouton d'installation pour %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Profil de %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Tapez deux fois pour publier ce Tweet"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Installer"; |
| | | |
| | | "tw__card_composer_tweet" = "Tweeter"; |
| | | |
| | | "tw__close_button" = "Fermer"; |
| | | |
| | | "tw__composer_placeholder_text" = "Que se passe-t-il ?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Recevez des mises à jour et autres informations de %@ quand vous lui donnez accès à votre email sur votre compte Twitter @%@."; |
| | | |
| | | "tw__empty_timeline" = "Le fil d'actualités est vide"; |
| | | |
| | | "tw__image_viewer_done_button" = "Terminé"; |
| | | |
| | | "tw__open_in_text" = "Ouvrir dans %@"; |
| | | |
| | | "tw__privacy_information_button" = "Informations sur la confidentialité"; |
| | | |
| | | "tw__share_tweet" = "Partager ce Tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet de %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Se connecter avec Twitter"; |
| | | |
| | | "tw__single_image" = "Image Jointe"; |
| | | |
| | | "tw__test_string" = "Test"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Pièce jointe"; |
| | | |
| | | "tw__tweet_like_button" = "J'aime"; |
| | | |
| | | "tw__tweet_liked_state" = "A été aimé"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Pas encore aimé"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profil"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Retweeté par %@"; |
| | | |
| | | "tw__tweet_share_button" = "Partager"; |
| | | |
| | | "tw__user_content_image" = "Aperçu de l'application"; |
| | | |
| | | "tw__video_thumbnail" = "Vidéo Jointe"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Ceci est une annonce sponsorisée"; |
| | | |
New file |
| | |
| | | "tw__empty_timeline" = "સમય અવધિ ખાલી છે"; |
| | | |
| | | "tw__image_viewer_done_button" = "પૂરું થયું"; |
| | | |
| | | "tw__open_in_text" = "%@ માં ખોલો"; |
| | | |
| | | "tw__privacy_information_button" = "ગોપનીયતા માહિતી"; |
| | | |
| | | "tw__tweet_share_button" = "શેર કરો"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "આ એક પ્રાયોજિત જાહેરાત છે"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "הציוץ לא נשלח"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "עבור אל הגדרות iOS > פרטיות > שירותי מיקום כדי לאפשר לטוויטר לגשת למיקום שלך."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "תן לטוויטר הרשאה לגשת למיקום שלך"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "אי אפשר למצוא את המיקום שלך. נסה שוב מאוחר יותר."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "ניסיון הגישה למיקום נכשל"; |
| | | |
| | | "OK_ACTION_LABEL" = "אישור"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "נסה שוב"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "ציוץ"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "חשבון"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "מיקום"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "ללא"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "לא הוגדרו חשבונות טוויטר. אפשר להוסיף או ליצור חשבון טוויטר דרך ההגדרות."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "אין חשבון טוויטר"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "שליחת הציוץ נכשלה."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "טוויטר"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%d ימים"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "יום %d"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%d שעות"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "שעה %d"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%d דק'"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "דקה %d"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%d שנ'"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "שניה %d"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "בטל"; |
| | | |
| | | "tw__card_compose_character_count" = "%td תווים נותרו"; |
| | | |
| | | "tw__card_compose_close_hint" = "נגיעה כפולה כדי לסגור את העורך"; |
| | | |
| | | "tw__card_compose_install_preview" = "תצוגה מקדימה של כפתור התקנה עבור %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "הפרופיל של %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "נגיעה כפולה כדי לשלוח את הציוץ הזה"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "התקנה"; |
| | | |
| | | "tw__card_composer_tweet" = "ציוץ"; |
| | | |
| | | "tw__close_button" = "סגור"; |
| | | |
| | | "tw__composer_placeholder_text" = "מה קורה?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "קבל עדכונים ומידע נוסף מ-%@ לאחר שתאשר ליישום לגשת לכתובת הדואר האלקטרוני המצוינת בחשבון הטוויטר שלך @%@."; |
| | | |
| | | "tw__empty_timeline" = "ציר הזמן ריק"; |
| | | |
| | | "tw__image_viewer_done_button" = "סיום"; |
| | | |
| | | "tw__open_in_text" = "פתח ב-%@"; |
| | | |
| | | "tw__privacy_information_button" = "מידע על פרטיות"; |
| | | |
| | | "tw__share_tweet" = "שתף ציוץ"; |
| | | |
| | | "tw__share_tweet_subject_format" = "ציוץ מאת %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "כניסה באמצעות טוויטר"; |
| | | |
| | | "tw__single_image" = "קובץ תמונה מצורף"; |
| | | |
| | | "tw__test_string" = "בדיקה"; |
| | | |
| | | "tw__tweet_image_accessibility" = "קובץ מצורף"; |
| | | |
| | | "tw__tweet_like_button" = "אהבתי"; |
| | | |
| | | "tw__tweet_liked_state" = "סומן כאהוב"; |
| | | |
| | | "tw__tweet_not_liked_state" = "לא סומן כאהוב"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "פרופיל"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "צויץ מחדש על-ידי %@"; |
| | | |
| | | "tw__tweet_share_button" = "שתף"; |
| | | |
| | | "tw__user_content_image" = "תצוגה מקדימה של יישום"; |
| | | |
| | | "tw__video_thumbnail" = "קובץ וידאו מצורף"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "זוהי הודעת חסות"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "ट्वीट भेजा नहीं गया"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Twitter को आपके स्थान तक पहुँचने देने के लिए कृपया iOS सेटिंग्ज > गोपनीयता > स्थान सेवाएँ पर जाएं।"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Twitter को आपके स्थान तक पहुँचने दें"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "आपका स्थान ढूंढ़ नहीं सके। कृपया बाद में पुन: प्रयास करें।"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "स्थान तक पहुँचा नहीं जा सका"; |
| | | |
| | | "OK_ACTION_LABEL" = "ठीक है"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "फिर से कोशिश करें"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "ट्वीट"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "खाता"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "स्थान"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "कुछ नहीं"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "कोई भी Twitter खाता कॉन्फ़िगर किया हुआ नहीं है। आप सेंटिग्ज में Twitter खाता जोड़ या बना सकते हैं।"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "कोई Twitter खाता नहीं"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "ट्वीट भेजा नहीं जा सका।"; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%d दिन"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%d दिन"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%d घंटे"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%d घंटा"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%d क्षण"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%d क्षण"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%d पल"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%d पल"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "रद्द करें"; |
| | | |
| | | "tw__card_compose_character_count" = "%td अक्षर बाकी हैं"; |
| | | |
| | | "tw__card_compose_close_hint" = "कंपोज़र को हटाने के लिए दो बार टैप करें."; |
| | | |
| | | "tw__card_compose_install_preview" = "%@के इंस्टॉल बटन का पूर्वावलोकन"; |
| | | |
| | | "tw__card_compose_profile_image" = "%@का प्रोफ़ाइल"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "इस ट्वीट को पोस्ट करने के लिए दो बार टैप करें"; |
| | | |
| | | "tw__card_composer_app_store" = "ऐप स्टोर"; |
| | | |
| | | "tw__card_composer_install_button" = "इंस्टॉल करें"; |
| | | |
| | | "tw__card_composer_tweet" = "ट्वीट"; |
| | | |
| | | "tw__close_button" = "बंद करें"; |
| | | |
| | | "tw__composer_placeholder_text" = "क्या हो रहा है?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "%@ से अपडेट और अन्य जानकारी प्राप्त करें जब आप अपने @%@ ट्विटर खाते पर उन्हें आपके ईमेल तक पहुंच ने की अनुमति दें"; |
| | | |
| | | "tw__empty_timeline" = "टाइमलाइन रिक्त है"; |
| | | |
| | | "tw__image_viewer_done_button" = "पूर्ण"; |
| | | |
| | | "tw__open_in_text" = "%@ में खोलें"; |
| | | |
| | | "tw__privacy_information_button" = "गोपनीयता जानकारी"; |
| | | |
| | | "tw__share_tweet" = "ट्वीट साझा करें"; |
| | | |
| | | "tw__share_tweet_subject_format" = "%1$@ (@%2$@) से ट्वीट"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "ट्विटर के साथ लॉगइन करें"; |
| | | |
| | | "tw__single_image" = "छवि अटैचमेंट"; |
| | | |
| | | "tw__test_string" = "जाँचें"; |
| | | |
| | | "tw__tweet_image_accessibility" = "संलग्न"; |
| | | |
| | | "tw__tweet_like_button" = "पसंद करें"; |
| | | |
| | | "tw__tweet_liked_state" = "पसंद किया गया"; |
| | | |
| | | "tw__tweet_not_liked_state" = "पसंद नही किया"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "प्रोफ़ाइल"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "%@ द्वारा रीट्विट"; |
| | | |
| | | "tw__tweet_share_button" = "शेयर करें"; |
| | | |
| | | "tw__user_content_image" = "ऐप पूर्वावलोकन"; |
| | | |
| | | "tw__video_thumbnail" = "वीडियो अटैचमेंट"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "यह एक प्रायोजित विज्ञापन है"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet nije poslan"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "U sustavu iOS otvorite odjeljak Postavke > Privatnost > Lokacijske usluge te dopustite Twitteru pristup svojoj lokaciji."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Dopustite Twitteru pristup svojoj lokaciji"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Nismo uspjeli pronaći vašu lokaciju. Pokušajte ponovno kasnije."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Pristup lokaciji nije uspio"; |
| | | |
| | | "OK_ACTION_LABEL" = "U redu"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Pokušaj ponovno"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Račun"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Lokacija"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Nema"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Nema konfiguriranih računa za Twitter. Račun za Twitter možete dodati ili stvoriti u odjeljku Postavke."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Nema računa za Twitter"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Slanje tweeta nije uspjelo."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%d d"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%d d"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%d h"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%d h"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%d min"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%d min"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%d s"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%d s"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Odustani"; |
| | | |
| | | "tw__card_compose_character_count" = "Broj preostalih znakova: %td"; |
| | | |
| | | "tw__card_compose_close_hint" = "Dodirnite dvaput da biste uklonili sastavljač teksta."; |
| | | |
| | | "tw__card_compose_install_preview" = "Pretpregled gumba za instaliranje za %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Profil korisnika/ce %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Dodirnite dvaput da biste objavili ovaj Tweet"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Instaliraj"; |
| | | |
| | | "tw__card_composer_tweet" = "Objavi Tweet"; |
| | | |
| | | "tw__close_button" = "Zatvori"; |
| | | |
| | | "tw__composer_placeholder_text" = "Što se događa?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Primajte novosti i druge informacije o aplikaciji %@ kada im omogućite da pristupe vašoj adresi e-pošte na računu za Twitter @%@."; |
| | | |
| | | "tw__empty_timeline" = "Vremenska je crta prazna"; |
| | | |
| | | "tw__image_viewer_done_button" = "Gotovo"; |
| | | |
| | | "tw__open_in_text" = "Otvori u aplikaciji %@"; |
| | | |
| | | "tw__privacy_information_button" = "Informacije o zaštiti privatnosti"; |
| | | |
| | | "tw__share_tweet" = "Podijeli Tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet korisnika/ce %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Prijavi se putem Twittera"; |
| | | |
| | | "tw__single_image" = "Privitak sa slikom"; |
| | | |
| | | "tw__test_string" = "Test"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Privitak"; |
| | | |
| | | "tw__tweet_like_button" = "Sviđa mi se"; |
| | | |
| | | "tw__tweet_liked_state" = "Označeno oznakom \"sviđa mi se\""; |
| | | |
| | | "tw__tweet_not_liked_state" = "Nije označeno oznakom \"sviđa mi se\""; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profil"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "%@ je proslijedio/la ovaj Tweet"; |
| | | |
| | | "tw__tweet_share_button" = "Podijeli"; |
| | | |
| | | "tw__user_content_image" = "Pretpregled aplikacije"; |
| | | |
| | | "tw__video_thumbnail" = "Privitak s videozapisom"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Ovo je plaćeni oglas"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "A Tweet nincs elküldve"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Nyisd meg az iOS-beállítások> Adatvédelem> Helyszolgáltatások menüpontot, és engedélyezd a Twitternek, hogy hozzáférhessen a tartózkodási helyedhez."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Engedélyezd a Twitternek, hogy hozzáférhessen a tartózkodási helyedhez"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Nem található a tartózkodási helyed. Próbálkozz újra később!"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "A hely hozzáférése sikertelen"; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Újrapóbálkozás"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Felhasználói fiók"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Hely"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Nincs"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Nincsenek Twitter-fiókok konfigurálva. A Beállítások részen hozzáadhatsz vagy létrehozhatsz egy Twitter-fiókot."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Nincs Twitter-fiók"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "A Tweet elküldése sikertelen"; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dnap"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dnap"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dó"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dó"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dp"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dp"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%dmp"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%dmp"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Mégse"; |
| | | |
| | | "tw__card_compose_character_count" = "Még %td karakter maradt"; |
| | | |
| | | "tw__card_compose_close_hint" = "Koppints kétszer a szerkesztés elvetéséhez"; |
| | | |
| | | "tw__card_compose_install_preview" = "A(z) %@ telepítés gomb előnézete"; |
| | | |
| | | "tw__card_compose_profile_image" = "%@ profilja"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Koppints kétszer a Tweet elküldéséhez"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Telepítés"; |
| | | |
| | | "tw__card_composer_tweet" = "Tweet"; |
| | | |
| | | "tw__close_button" = "Bezárás"; |
| | | |
| | | "tw__composer_placeholder_text" = "Mi történik most?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Ha engedélyezed, hogy megtaláljanak @%@ Twitter-fiókodhoz kapcsolt e-mail címed alapján, megkapod %@ felhasználó frissítéseit és egyéb adatait."; |
| | | |
| | | "tw__empty_timeline" = "Az idővonal üres"; |
| | | |
| | | "tw__image_viewer_done_button" = "Kész"; |
| | | |
| | | "tw__open_in_text" = "Megnyitás itt: %@"; |
| | | |
| | | "tw__privacy_information_button" = "Adatvédelmi információk"; |
| | | |
| | | "tw__share_tweet" = "Tweet megosztása"; |
| | | |
| | | "tw__share_tweet_subject_format" = "%1$@ (@%2$@) Tweetje"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Bejelentkezés Twitterrel"; |
| | | |
| | | "tw__single_image" = "Képfájl-csatolmány"; |
| | | |
| | | "tw__test_string" = "Tesztek"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Csatolmány"; |
| | | |
| | | "tw__tweet_like_button" = "Kedvelés"; |
| | | |
| | | "tw__tweet_liked_state" = "Kedvelt"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Nem kedvelt"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profil"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "%@ retweetelte"; |
| | | |
| | | "tw__tweet_share_button" = "Megosztás"; |
| | | |
| | | "tw__user_content_image" = "Alkalmazás előnézete"; |
| | | |
| | | "tw__video_thumbnail" = "Videófájl-csatolmány"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Ez egy szponzorált hirdetés"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet tidak terkirim"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Buka Pengaturan iOS > Privasi > Layanan Lokasi untuk memungkinkan Twitter mengakses lokasi Anda."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Izinkan Twitter mengakses lokasi Anda"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Tidak dapat menemukan lokasi Anda. Silakan coba lagi nanti."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Gagal mengakses lokasi"; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Ulangi"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Akun"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Lokasi"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Tidak ada"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Tidak ada akun Twitter yang dikonfigurasi. Anda dapat menambahkan atau membuat akun Twitter di Pengaturan."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Tidak Ada Akun Twitter"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Tweet gagal dikirim."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dj"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dj"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%dd"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Batal"; |
| | | |
| | | "tw__card_compose_character_count" = "%td karakter tersisa"; |
| | | |
| | | "tw__card_compose_close_hint" = "Sentuh dua kali untuk menyingkirkan penulis."; |
| | | |
| | | "tw__card_compose_install_preview" = "Pratinjau tombol pasang untuk %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Profil %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Sentuh dua kali untuk mengirim Tweet ini"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Pasang"; |
| | | |
| | | "tw__card_composer_tweet" = "Tweet"; |
| | | |
| | | "tw__close_button" = "Tutup"; |
| | | |
| | | "tw__composer_placeholder_text" = "Apa yang Sedang Terjadi?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Dapatkan pembaruan dan informasi lainnya dari %@ bila Anda mengizinkan mereka untuk mengakses email Anda di akun Twitter @%@."; |
| | | |
| | | "tw__empty_timeline" = "Timeline kosong"; |
| | | |
| | | "tw__image_viewer_done_button" = "Selesai"; |
| | | |
| | | "tw__open_in_text" = "Buka di %@"; |
| | | |
| | | "tw__privacy_information_button" = "Informasi privasi"; |
| | | |
| | | "tw__share_tweet" = "Sebarkan Tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet dari %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Masuk dengan Twitter"; |
| | | |
| | | "tw__single_image" = "Lampiran Gambar"; |
| | | |
| | | "tw__test_string" = "Tes"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Lampiran"; |
| | | |
| | | "tw__tweet_like_button" = "Suka"; |
| | | |
| | | "tw__tweet_liked_state" = "Disukai"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Belum Disukai"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profil"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Di-retweet oleh %@"; |
| | | |
| | | "tw__tweet_share_button" = "Sebarkan"; |
| | | |
| | | "tw__user_content_image" = "Pratinjau Aplikasi"; |
| | | |
| | | "tw__video_thumbnail" = "Lampiran Video"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Ini adalah iklan yang disponsori"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet non inviato"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Visita Impostazioni > Privacy > Localizzazione su iOS per permettere a Twitter di accedere alla tua posizione."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Permetti a Twitter di accedere alla tua posizione"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Non abbiamo trovato la tua posizione. Per favore, riprova."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Impossibile accedere alla posizione"; |
| | | |
| | | "OK_ACTION_LABEL" = "Ok"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Riprova"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Account"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Posizione"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Niente"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Non ci sono account Twitter configurati. Puoi crearne o aggiungerne uno dalle Impostazioni."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Nessun account Twitter"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Invio del Tweet non riuscito."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dg"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dg"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%ds"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%ds"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Annulla"; |
| | | |
| | | "tw__card_compose_character_count" = "%td caratteri rimanenti"; |
| | | |
| | | "tw__card_compose_close_hint" = "Tocca due volte per chiudere l'interfaccia."; |
| | | |
| | | "tw__card_compose_install_preview" = "Anteprima del pulsante di installazione per %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Profilo di %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Tocca due volte per pubblicare questo Tweet"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Installa"; |
| | | |
| | | "tw__card_composer_tweet" = "Tweet"; |
| | | |
| | | "tw__close_button" = "Chiudi"; |
| | | |
| | | "tw__composer_placeholder_text" = "Che c'è di nuovo?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Ricevi aggiornamenti e altre informazioni da %@ nel momento in cui gli permetti di ottenere la tua email tramite il tuo account Twitter @%@."; |
| | | |
| | | "tw__empty_timeline" = "La cronologia è vuota"; |
| | | |
| | | "tw__image_viewer_done_button" = "Fatto"; |
| | | |
| | | "tw__open_in_text" = "Apri con %@"; |
| | | |
| | | "tw__privacy_information_button" = "Informazioni sulla privacy"; |
| | | |
| | | "tw__share_tweet" = "Condividi Tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet di %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Accedi tramite Twitter"; |
| | | |
| | | "tw__single_image" = "Immagine allegata"; |
| | | |
| | | "tw__test_string" = "Test"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Allegato"; |
| | | |
| | | "tw__tweet_like_button" = "Mi piace"; |
| | | |
| | | "tw__tweet_liked_state" = "Ti piace"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Di' che ti piace questo Tweet"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profilo"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Ritwittato da %@"; |
| | | |
| | | "tw__tweet_share_button" = "Condividi"; |
| | | |
| | | "tw__user_content_image" = "Anteprima app"; |
| | | |
| | | "tw__video_thumbnail" = "Video allegato"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Questo è un annuncio sponsorizzato"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "ツイートが送信されていません"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "iOSの [設定] > [プライバシー] > [位置情報サービス] からTwitterによる位置情報の利用を許可してください。"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Twitterが位置情報を利用することを許可する"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "位置情報を取得できませんでした。やりなおしてください。"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "位置情報を利用できません"; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "やりなおす"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "ツイート"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "アカウント"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "場所"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "なし"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Twitterアカウントが設定されていません。設定からTwitterアカウントを追加するか、新規登録してください。"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Twitterアカウントがありません"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "ツイートを送信できません。"; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%d日"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%d日"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%d時間"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%d時間"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%d分"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%d分"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%d秒"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%d秒"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "キャンセル"; |
| | | |
| | | "tw__card_compose_character_count" = "残り%td文字"; |
| | | |
| | | "tw__card_compose_close_hint" = "ダブルタップして編集画面を閉じる。"; |
| | | |
| | | "tw__card_compose_install_preview" = "%@のインストールボタンのプレビュー"; |
| | | |
| | | "tw__card_compose_profile_image" = "%@さんのプロフィール"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "ダブルタップしてこのツイートを投稿"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "インストール"; |
| | | |
| | | "tw__card_composer_tweet" = "ツイート"; |
| | | |
| | | "tw__close_button" = "閉じる"; |
| | | |
| | | "tw__composer_placeholder_text" = "いまどうしてる?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "%@にあなたがご利用中のTwitterアカウント(@%@)に登録したメールアドレスを提供し、最新情報をメールで受け取れるようにします。"; |
| | | |
| | | "tw__empty_timeline" = "タイムラインに表示するツイートはありません"; |
| | | |
| | | "tw__image_viewer_done_button" = "完了"; |
| | | |
| | | "tw__open_in_text" = "%@で開く"; |
| | | |
| | | "tw__privacy_information_button" = "プライバシー情報"; |
| | | |
| | | "tw__share_tweet" = "ツイートを共有"; |
| | | |
| | | "tw__share_tweet_subject_format" = "%1$@ (@%2$@)さんからのツイート"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Twitterにログイン"; |
| | | |
| | | "tw__single_image" = "添付画像"; |
| | | |
| | | "tw__test_string" = "テスト"; |
| | | |
| | | "tw__tweet_image_accessibility" = "添付"; |
| | | |
| | | "tw__tweet_like_button" = "いいねする"; |
| | | |
| | | "tw__tweet_liked_state" = "いいねしました"; |
| | | |
| | | "tw__tweet_not_liked_state" = "いいねしていません"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "プロフィール"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "%@さんがリツイート"; |
| | | |
| | | "tw__tweet_share_button" = "共有"; |
| | | |
| | | "tw__user_content_image" = "アプリのプレビュー"; |
| | | |
| | | "tw__video_thumbnail" = "添付動画"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "スポンサー広告"; |
| | | |
New file |
| | |
| | | "tw__empty_timeline" = "ಕಾಲರೇಖೆ ಖಾಲಿ ಆಗಿದೆ"; |
| | | |
| | | "tw__image_viewer_done_button" = "ಆಗಿದೆ"; |
| | | |
| | | "tw__open_in_text" = "%@ ನಲ್ಲಿ ತೆರೆಯಿರಿ"; |
| | | |
| | | "tw__privacy_information_button" = "ಗೌಪ್ಯತೆ ಮಾಹಿತಿ"; |
| | | |
| | | "tw__tweet_share_button" = "ಹಂಚಿ"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "ಇದು ಒಂದು ಪ್ರಾಯೋಜಿತ ಜಾಹೀರಾತು"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "트윗이 전송되지 않았습니다"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "iOS 설정 > 개인정보 > 위치 서비스로 이동하여 트위터가 내 위치정보에 접근할 수 있도록 허용하세요."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "트위터가 내 위치정보에 접근할 수 있도록 허용"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "위치를 찾을 수 없습니다. 잠시 후에 다시 시도해보세요."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "위치정보 접근 실패"; |
| | | |
| | | "OK_ACTION_LABEL" = "확인"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "다시 시도"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "트윗"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "계정"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "위치"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "없음"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "설정된 트위터 계정이 없습니다. 설정에서 트위터 계정을 추가하거나 생성할 수 있습니다."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "트위터 계정 없음"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "트윗 전송에 실패했습니다."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "트위터"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%d일"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%d일"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%d시간"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%d시간"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%d분"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%d분"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%d초"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%d초"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "취소"; |
| | | |
| | | "tw__card_compose_character_count" = "%td자 남음"; |
| | | |
| | | "tw__card_compose_close_hint" = "작성창을 닫으려면 두 번 탭하세요."; |
| | | |
| | | "tw__card_compose_install_preview" = "%@ 설치 버튼 미리보기"; |
| | | |
| | | "tw__card_compose_profile_image" = "%@ 님의 프로필"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "이 트윗을 게시하려면 두 번 탭하세요."; |
| | | |
| | | "tw__card_composer_app_store" = "앱 스토어"; |
| | | |
| | | "tw__card_composer_install_button" = "설치"; |
| | | |
| | | "tw__card_composer_tweet" = "트윗"; |
| | | |
| | | "tw__close_button" = "닫기"; |
| | | |
| | | "tw__composer_placeholder_text" = "무슨 일이 일어나고 있나요?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "다른 사람이 내 트위터 계정(@%@)을 사용하도록 허락할 경우 %@의 최신 소식과 정보를 받습니다."; |
| | | |
| | | "tw__empty_timeline" = "타임라인이 비어 있습니다"; |
| | | |
| | | "tw__image_viewer_done_button" = "완료"; |
| | | |
| | | "tw__open_in_text" = "%@에서 열기"; |
| | | |
| | | "tw__privacy_information_button" = "개인정보 관련 정보"; |
| | | |
| | | "tw__share_tweet" = "트윗 공유하기"; |
| | | |
| | | "tw__share_tweet_subject_format" = "%1$@ (@%2$@) 님이 보낸 트윗"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "트위터 계정으로 로그인"; |
| | | |
| | | "tw__single_image" = "첨부된 이미지"; |
| | | |
| | | "tw__test_string" = "테스트"; |
| | | |
| | | "tw__tweet_image_accessibility" = "첨부 파일"; |
| | | |
| | | "tw__tweet_like_button" = "마음에 들어요"; |
| | | |
| | | "tw__tweet_liked_state" = "마음에 들어요 있음"; |
| | | |
| | | "tw__tweet_not_liked_state" = "마음에 들어요 없음"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "프로필"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "%@ 님이 리트윗함"; |
| | | |
| | | "tw__tweet_share_button" = "공유하기"; |
| | | |
| | | "tw__user_content_image" = "앱 미리보기"; |
| | | |
| | | "tw__video_thumbnail" = "첨부된 동영상"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "스폰서 광고입니다"; |
| | | |
New file |
| | |
| | | "tw__empty_timeline" = "टाइमलाइन रिक्त आहे"; |
| | | |
| | | "tw__image_viewer_done_button" = "पूर्ण"; |
| | | |
| | | "tw__open_in_text" = "%@ मध्ये उघडा"; |
| | | |
| | | "tw__privacy_information_button" = "गोपनीयता माहिती"; |
| | | |
| | | "tw__tweet_share_button" = "शेअर करा"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "ही एक प्रायोजित जाहिरात आहे"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet tidak dihantar"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Sila pergi ke Tetapan iOS > Privasi > Perkhidmatan Lokasi untuk membenarkan Twitter mengakses lokasi anda."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Benarkan Twitter mengakses lokasi anda"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Tidak dapat menemui lokasi anda. Sila cuba lagi kemudian."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Gagal untuk mengakses lokasi"; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Cuba semula"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Akaun"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Lokasi"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Tiada"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Tiada akaun Twitter yang dikonfigurasikan. Anda boleh menambah atau mencipta akaun Twitter dalam Tetapan."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Tiada Akaun Twitter"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Tweet gagal dihantar."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dj"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dj"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%ds"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%ds"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Batal"; |
| | | |
| | | "tw__card_compose_character_count" = "%td aksara yang tinggal"; |
| | | |
| | | "tw__card_compose_close_hint" = "Ketik dua kali untuk menolak penggubah."; |
| | | |
| | | "tw__card_compose_install_preview" = "Pratonton butang pasang untuk %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "%@'s profil"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Ketik dua kali untuk hantar Tweet ini"; |
| | | |
| | | "tw__card_composer_app_store" = "Stor Aplikasi"; |
| | | |
| | | "tw__card_composer_install_button" = "Pasang"; |
| | | |
| | | "tw__card_composer_tweet" = "Tweet"; |
| | | |
| | | "tw__close_button" = "Tutup"; |
| | | |
| | | "tw__composer_placeholder_text" = "Apa yang berlaku?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Dapatkan kemas kini dan maklumat lain daripada %@ apabila anda memberikan mereka akses kepada e-mel anda pada akaun Twitter anda @%@."; |
| | | |
| | | "tw__empty_timeline" = "Garis masa kosong"; |
| | | |
| | | "tw__image_viewer_done_button" = "Selesai"; |
| | | |
| | | "tw__open_in_text" = "Dibuka pada %@"; |
| | | |
| | | "tw__privacy_information_button" = "Maklumat privasi"; |
| | | |
| | | "tw__share_tweet" = "Kongsi Tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet daripada %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Log masuk dengan Twitter"; |
| | | |
| | | "tw__single_image" = "Lampiran Imej"; |
| | | |
| | | "tw__test_string" = "Ujian"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Lampiran"; |
| | | |
| | | "tw__tweet_like_button" = "Suka"; |
| | | |
| | | "tw__tweet_liked_state" = "Disukai"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Tidak Disukai"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profil"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Ditweet semula oleh %@"; |
| | | |
| | | "tw__tweet_share_button" = "Kongsi"; |
| | | |
| | | "tw__user_content_image" = "Pratonton Aplikasi"; |
| | | |
| | | "tw__video_thumbnail" = "Lampiran Video"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Ini ialah iklan yang ditaja"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweeten ble ikke sendt"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Gå til iOS-innstillinger > Personvern > Posisjonstjenester for å gi Twitter tillatelse til å hente posisjonen din."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Gi Twitter tilgang til posisjonen din"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Fant ikke posisjonen din. Prøv på nytt senere."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Kunne ikke hente posisjonen din"; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Prøv på nytt"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Konto"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Posisjon"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Ingen"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Ingen Twitter-konto er konfigurert. Du kan legge til eller opprette en Twitter-konto i ved å gå til innstillingene."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Ingen Twitter-konto"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Tweeten ble ikke sendt."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%d d"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%d d"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%d t"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%d t"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%d m"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%d m"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%d s"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%d s"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Avbryt"; |
| | | |
| | | "tw__card_compose_character_count" = "%td tegn gjenstår"; |
| | | |
| | | "tw__card_compose_close_hint" = "Dobbelttrykk for å lukke redigereren."; |
| | | |
| | | "tw__card_compose_install_preview" = "Forhåndsvisning av installeringsknappen for %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Profilen til %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Dobbelttrykk for å sende tweeten"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Installer"; |
| | | |
| | | "tw__card_composer_tweet" = "Tweet"; |
| | | |
| | | "tw__close_button" = "Lukk"; |
| | | |
| | | "tw__composer_placeholder_text" = "Hva skjer?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Få oppdateringer og annen informasjon fra %@ når du gir dem tilgang til e-postadressen din på Twitter-kontoen din @%@."; |
| | | |
| | | "tw__empty_timeline" = "Tidslinjen er tom"; |
| | | |
| | | "tw__image_viewer_done_button" = "Ferdig"; |
| | | |
| | | "tw__open_in_text" = "Åpne i %@"; |
| | | |
| | | "tw__privacy_information_button" = "Personverninfo"; |
| | | |
| | | "tw__share_tweet" = "Del tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet fra %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Logg inn med Twitter"; |
| | | |
| | | "tw__single_image" = "Bildevedlegg"; |
| | | |
| | | "tw__test_string" = "Test"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Vedlegg"; |
| | | |
| | | "tw__tweet_like_button" = "Liker"; |
| | | |
| | | "tw__tweet_liked_state" = "Likt"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Ikke likt"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profil"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Retweetet av %@"; |
| | | |
| | | "tw__tweet_share_button" = "Del"; |
| | | |
| | | "tw__user_content_image" = "App-forhåndsvisning"; |
| | | |
| | | "tw__video_thumbnail" = "Videovedlegg"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Dette er en sponset annonse"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet niet verstuurd"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Ga naar iOS-instellingen > Privacy > Locatievoorzieningen om Twitter toegang tot je locatie te geven."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Geef Twitter toegang tot je locatie"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Je locatie werd niet gevonden. Probeer het later opnieuw."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Locatie niet gevonden"; |
| | | |
| | | "OK_ACTION_LABEL" = "Oké"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Probeer opnieuw"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Account"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Locatie"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Geen"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Er zijn geen Twitter-accounts ingesteld. Je kunt een Twitter-account aanmaken of toevoegen bij Instellingen."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Geen Twitter-account"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Tweet niet verstuurd."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%du"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%du"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%ds"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%ds"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Annuleren"; |
| | | |
| | | "tw__card_compose_character_count" = "%td tekens resterend"; |
| | | |
| | | "tw__card_compose_close_hint" = "Tik dubbel om de opsteller te sluiten."; |
| | | |
| | | "tw__card_compose_install_preview" = "Voorbeeld van installeerknop voor %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Profiel van %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Tik dubbel om deze Tweet te plaatsen"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Installeer"; |
| | | |
| | | "tw__card_composer_tweet" = "Tweet"; |
| | | |
| | | "tw__close_button" = "Sluiten"; |
| | | |
| | | "tw__composer_placeholder_text" = "Wat houdt je bezig?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Ontvang updates en andere informatie van %@ door toegang te geven tot het e-mailadres van je Twitter-account @%@."; |
| | | |
| | | "tw__empty_timeline" = "Tijdlijn is leeg"; |
| | | |
| | | "tw__image_viewer_done_button" = "Gereed"; |
| | | |
| | | "tw__open_in_text" = "Open in %@"; |
| | | |
| | | "tw__privacy_information_button" = "Privacyinformatie"; |
| | | |
| | | "tw__share_tweet" = "Deel Tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet van %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Log in met Twitter"; |
| | | |
| | | "tw__single_image" = "Afbeeldingsbijlage"; |
| | | |
| | | "tw__test_string" = "Test"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Bijlage"; |
| | | |
| | | "tw__tweet_like_button" = "Leuk"; |
| | | |
| | | "tw__tweet_liked_state" = "Leuk gevonden"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Niet leuk gevonden"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profiel"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Geretweet door %@"; |
| | | |
| | | "tw__tweet_share_button" = "Deel"; |
| | | |
| | | "tw__user_content_image" = "Voorbeeld van app"; |
| | | |
| | | "tw__video_thumbnail" = "Videobijlage"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Dit is een gesponsorde advertentie"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Nie udało się wysłać Tweeta"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Aby zezwolić Twitterowi na sprawdzenie Twojej lokalizacji, przejdź do: Ustawienia iOS > Prywatność > Usługi lokalizacji."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Pozwól Twitterowi sprawdzać Twoją lokalizację"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Nie udało się odnaleźć Twojej lokalizacji. Spróbuj ponownie później."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Nie udało się uzyskać lokalizacji"; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Spróbuj ponownie"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Konto"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Lokalizacja"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Brak"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Nie ma skonfigurowanego konta na Twitterze. Możesz dodawać lub usuwać konta na Twitterze w Ustawieniach."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Brak konta na Twitterze"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Nie udało się wysłać Tweeta."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%d dn."; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%d dn."; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%d godz."; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%d godz."; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%d min"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%d min"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%d s"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%d s"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Anuluj"; |
| | | |
| | | "tw__card_compose_character_count" = "Pozostało tyle znaków: %td"; |
| | | |
| | | "tw__card_compose_close_hint" = "Stuknij dwa razy, aby zamknąć okno tworzenia."; |
| | | |
| | | "tw__card_compose_install_preview" = "Podgląd przycisku instalacji dla %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Profil %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Stuknij dwukrotnie, aby wysłać tego Tweeta"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Zainstaluj"; |
| | | |
| | | "tw__card_composer_tweet" = "Tweetnij"; |
| | | |
| | | "tw__close_button" = "Zamknij"; |
| | | |
| | | "tw__composer_placeholder_text" = "Co się dzieje?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Jeśli zgodzisz się na udostępnienie swojego adresu e-mail podanego na Twitterze na koncie @%@, będziesz otrzymywać aktualizacje i informacje z %@."; |
| | | |
| | | "tw__empty_timeline" = "Oś czasu jest pusta"; |
| | | |
| | | "tw__image_viewer_done_button" = "Gotowe"; |
| | | |
| | | "tw__open_in_text" = "Otwórz w %@"; |
| | | |
| | | "tw__privacy_information_button" = "Imformacje o ochronie prywatności"; |
| | | |
| | | "tw__share_tweet" = "Udostępnij tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet od %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Zaloguj się przez Twittera"; |
| | | |
| | | "tw__single_image" = "Załączony obraz"; |
| | | |
| | | "tw__test_string" = "Test"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Załącznik"; |
| | | |
| | | "tw__tweet_like_button" = "Lubię"; |
| | | |
| | | "tw__tweet_liked_state" = "Polubiony"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Niepolubiony"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profilowe"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Podane dalej przez %@"; |
| | | |
| | | "tw__tweet_share_button" = "Udostępnij"; |
| | | |
| | | "tw__user_content_image" = "Podgląd aplikacji"; |
| | | |
| | | "tw__video_thumbnail" = "Załączony film"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "To jest reklama sponsorowana"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet não enviado"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "No iOS, acesse Ajustes > Privacidade > Serviços de Localização para permitir que o Twitter acesse sua localização."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Permitir que o Twitter acesse sua localização"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Não foi possível encontrar sua localização. Tente novamente mais tarde."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Falha ao acessar localização"; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Tentar novamente"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Conta"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Localização"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Nenhum"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Não há nenhuma conta do Twitter configurada. Você pode adicionar ou criar uma conta do Twitter em Configurações."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Nenhuma Conta do Twitter"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Falha no envio do Tweet."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%ds"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%ds"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Cancelar"; |
| | | |
| | | "tw__card_compose_character_count" = "%td caracteres restantes"; |
| | | |
| | | "tw__card_compose_close_hint" = "Toque duas vezes para rejeitar o editor."; |
| | | |
| | | "tw__card_compose_install_preview" = "Visualização do botão Instalar de %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Perfil de %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Toque duas vezes para publicar este Tweet"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Instalar"; |
| | | |
| | | "tw__card_composer_tweet" = "Tweet"; |
| | | |
| | | "tw__close_button" = "Fechar"; |
| | | |
| | | "tw__composer_placeholder_text" = "O que está acontecendo?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Receba atualizações e outras informações de %@ ao permitir que esse usuário acesse seu e-mail em sua conta do Twitter @%@."; |
| | | |
| | | "tw__empty_timeline" = "A timeline está vazia"; |
| | | |
| | | "tw__image_viewer_done_button" = "Concluído"; |
| | | |
| | | "tw__open_in_text" = "Abrir no %@"; |
| | | |
| | | "tw__privacy_information_button" = "Informações de privacidade"; |
| | | |
| | | "tw__share_tweet" = "Compartilhar Tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet de %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Entrar com o Twitter"; |
| | | |
| | | "tw__single_image" = "Anexo de imagem"; |
| | | |
| | | "tw__test_string" = "Testar"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Anexo"; |
| | | |
| | | "tw__tweet_like_button" = "Curtir"; |
| | | |
| | | "tw__tweet_liked_state" = "Curtiu"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Ainda não curtiu"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Perfil"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Retweetado por %@"; |
| | | |
| | | "tw__tweet_share_button" = "Compartilhar"; |
| | | |
| | | "tw__user_content_image" = "Visualização do alicativo"; |
| | | |
| | | "tw__video_thumbnail" = "Anexo de vídeo"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Este anúncio é patrocinado"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet netrimis"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Accesează Configurări iOS > Intimitate > Servicii de localizare pentru a permite Twitter să-ți acceseze locația."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Permite Twitter să-ți acceseze locația"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Nu ți-am putut găsi locația. Încearcă din nou mai târziu."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Nu s-a putut accesa locația"; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Reîncearcă"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Cont"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Locație"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Fără"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Nu există conturi Twitter configurate. Poți să adaugi sau să creezi un cont Twitter în Setări."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Niciun cont Twitter"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Tweetul nu s-a trimis."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%d z"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%d zi"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%d h"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%d h"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%d m"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%d m"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%d s"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%d s"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Anulează"; |
| | | |
| | | "tw__card_compose_character_count" = "%td caractere rămase"; |
| | | |
| | | "tw__card_compose_close_hint" = "Atinge de două ori pentru a îndepărta autorul."; |
| | | |
| | | "tw__card_compose_install_preview" = "Previzualizarea butonului de instalare pentru %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Profilul lui %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Atinge de două ori pentru a posta acest Tweet"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Instalează"; |
| | | |
| | | "tw__card_composer_tweet" = "Creează un Tweet"; |
| | | |
| | | "tw__close_button" = "Închide"; |
| | | |
| | | "tw__composer_placeholder_text" = "Ce se întâmplă?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Primește noutăți și alte informații de la %@ când le permiți să îți acceseze e-mailul pe contul tău Twitter @%@."; |
| | | |
| | | "tw__empty_timeline" = "Cronologia este goală"; |
| | | |
| | | "tw__image_viewer_done_button" = "Gata"; |
| | | |
| | | "tw__open_in_text" = "Deschide în %@"; |
| | | |
| | | "tw__privacy_information_button" = "Informații despre confidențialitate"; |
| | | |
| | | "tw__share_tweet" = "Partajează Tweetul"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet de la %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Conectează-te cu Twitter"; |
| | | |
| | | "tw__single_image" = "Atașare imagine"; |
| | | |
| | | "tw__test_string" = "Test"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Atașare"; |
| | | |
| | | "tw__tweet_like_button" = "Apreciază"; |
| | | |
| | | "tw__tweet_liked_state" = "Apreciat"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Neapreciat"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profil"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Redistribuit de %@"; |
| | | |
| | | "tw__tweet_share_button" = "Distribuie"; |
| | | |
| | | "tw__user_content_image" = "Previzualizare aplicație"; |
| | | |
| | | "tw__video_thumbnail" = "Atașare video"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Aceasta este o reclamă sponsorizată"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Твит не отправлен"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Перейдите в раздел «Настройки iOS» > «Приватность» > «Службы местоположения», чтобы разрешить Твиттеру доступ к данным о местоположении."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Разрешить Твиттеру доступ к данным о вашем местоположении"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Не удалось найти ваше местоположение. Повторите попытку позже."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Нет доступа к данным о местоположении"; |
| | | |
| | | "OK_ACTION_LABEL" = "ОК"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Повторить"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Твит"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Учетная запись"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Местоположение"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Нет"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Нет настроенных учетных записей Твиттера. Учетную запись Твиттера можно добавить или создать в настройках."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Нет учетной записи Твиттера"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Не удалось отправить твит."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Твиттер"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dдн."; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dдн."; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dч"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dч"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dмин"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dмин"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%dс"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%dс"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Отмена"; |
| | | |
| | | "tw__card_compose_character_count" = "Осталось символов: %td"; |
| | | |
| | | "tw__card_compose_close_hint" = "Нажмите дважды, чтобы закрыть редактор."; |
| | | |
| | | "tw__card_compose_install_preview" = "Предварительный просмотр кнопки «Установить» для %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Профиль %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Нажмите дважды, чтобы опубликовать этот твит"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Установить"; |
| | | |
| | | "tw__card_composer_tweet" = "Твитнуть"; |
| | | |
| | | "tw__close_button" = "Закрыть"; |
| | | |
| | | "tw__composer_placeholder_text" = "Что происходит?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Вы будете получать обновления и другую информацию от %@, когда вы предоставляете этим приложениям доступ к электронной почте, связанной с вашей учётной записью в Твиттере @%@."; |
| | | |
| | | "tw__empty_timeline" = "Лента пуста"; |
| | | |
| | | "tw__image_viewer_done_button" = "Готово"; |
| | | |
| | | "tw__open_in_text" = "Открыть в %@"; |
| | | |
| | | "tw__privacy_information_button" = "Информация о конфиденциальности"; |
| | | |
| | | "tw__share_tweet" = "Поделиться твитом"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Твит от %1$@ (@%2$@) "; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Войти с учётной записью Твиттера"; |
| | | |
| | | "tw__single_image" = "Прикрепленное изображение"; |
| | | |
| | | "tw__test_string" = "Тест"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Вложение"; |
| | | |
| | | "tw__tweet_like_button" = "Нравится"; |
| | | |
| | | "tw__tweet_liked_state" = "Понравилось"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Не понравилось"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Профиль"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Ретвитнуто пользователем %@"; |
| | | |
| | | "tw__tweet_share_button" = "Поделиться"; |
| | | |
| | | "tw__user_content_image" = "Предварительный просмотр приложения"; |
| | | |
| | | "tw__video_thumbnail" = "Прикрепленное видео"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Это спонсорская реклама"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet sa neodoslal"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "V systéme iOS prejdite na položky Nastavenia > Súkromie > Lokalizačné služby a povoľte Twitteru prístup k vašej polohe."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Povoľte Twitteru prístup k vašej polohe"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Nepodarilo sa nájsť vašu polohu. Skúste to neskôr znova."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Nepodarilo sa získať prístup k polohe"; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Skúsiť znova"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweetnuť"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Účet"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Poloha"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Žiadne"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Nie sú nakonfigurované žiadne účty na Twitteri. Účet na Twitteri môžete pridať alebo vytvoriť v nastaveniach."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Žiaden účet na Twitteri"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Tweet sa nepodarilo odoslať."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%d d"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%d d"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%d h"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%d h"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%d min"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%d min"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%d s"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%d s"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Zrušiť"; |
| | | |
| | | "tw__card_compose_character_count" = "Zostávajúci počet znakov: %td"; |
| | | |
| | | "tw__card_compose_close_hint" = "Dvojitým ťuknutím na skladateľa ho zamietnete."; |
| | | |
| | | "tw__card_compose_install_preview" = "Ukážka tlačidla na inštaláciu aplikácie %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Profil používateľa %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Tento Tweet odošlete dvojitým ťuknutím."; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Inštalovať"; |
| | | |
| | | "tw__card_composer_tweet" = "Tweetnuť"; |
| | | |
| | | "tw__close_button" = "Zavrieť"; |
| | | |
| | | "tw__composer_placeholder_text" = "Čo sa deje?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Keď aplikácii %@ umožníte prístup k vášmu e-mailu vo vašom účte na Twitteri \@%@, môžete získavať aktualizácie a iné informácie."; |
| | | |
| | | "tw__empty_timeline" = "Časová os je prázdna"; |
| | | |
| | | "tw__image_viewer_done_button" = "Hotovo"; |
| | | |
| | | "tw__open_in_text" = "Otvoriť v %@"; |
| | | |
| | | "tw__privacy_information_button" = "Informácie o súkromí"; |
| | | |
| | | "tw__share_tweet" = "Zdielať Tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet od používateľa %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Prihlásiť sa na Twitter"; |
| | | |
| | | "tw__single_image" = "Obrazová príloha"; |
| | | |
| | | "tw__test_string" = "Test"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Príloha"; |
| | | |
| | | "tw__tweet_like_button" = "Páči sa mi"; |
| | | |
| | | "tw__tweet_liked_state" = "Označené ako Páči sa mi to"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Zatiaľ bez označenia Páči sa mi to"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profil"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Retweetnuté používateľom %@"; |
| | | |
| | | "tw__tweet_share_button" = "Zdieľať"; |
| | | |
| | | "tw__user_content_image" = "Ukážka apky"; |
| | | |
| | | "tw__video_thumbnail" = "Videopríloha"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Toto je sponzorovaná reklama"; |
| | | |
New file |
| | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dд"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dд"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dс"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dс"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dм"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dм"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%dс"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%dс"; |
| | | |
| | | "tw__card_compose_character_count" = "%td карактера преостало"; |
| | | |
| | | "tw__card_compose_close_hint" = "Додирни двапут да одбациш композитора."; |
| | | |
| | | "tw__card_compose_install_preview" = "Преглед инсталационог дугмета за %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Профил %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Додирни двапут да објавиш твит"; |
| | | |
| | | "tw__card_composer_app_store" = "Продавница апликација"; |
| | | |
| | | "tw__card_composer_install_button" = "Инсталирај"; |
| | | |
| | | "tw__card_composer_tweet" = "Твитуј"; |
| | | |
| | | "tw__composer_placeholder_text" = "Шта се дешава?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Добијај ажурирања и друге информације од %@ када дозволиш приступ својој е-пошти на свом Твитер налогу @%@."; |
| | | |
| | | "tw__empty_timeline" = "Временска трака је празна"; |
| | | |
| | | "tw__image_viewer_done_button" = "Готово"; |
| | | |
| | | "tw__open_in_text" = "Отвори у %@"; |
| | | |
| | | "tw__privacy_information_button" = "Приватне информације"; |
| | | |
| | | "tw__share_tweet" = "Подели твит"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Твит од %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Пријави се са Твитера"; |
| | | |
| | | "tw__single_image" = "Слика је приложена"; |
| | | |
| | | "tw__test_string" = "Тест"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Прилог"; |
| | | |
| | | "tw__tweet_like_button" = "Свиђа ми се"; |
| | | |
| | | "tw__tweet_liked_state" = "Свиђање"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Нема свиђања"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Профил"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Ретвитовано од стране %@"; |
| | | |
| | | "tw__tweet_share_button" = "Подели"; |
| | | |
| | | "tw__user_content_image" = "Преглед апликација"; |
| | | |
| | | "tw__video_thumbnail" = "Видео је приложен"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Ово је плаћени оглас"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweeten skickades inte"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Öppna iOS-inställningar > Integritet > Platstjänster om du vill tillåta Twitter att komma åt din plats."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Tillåt Twitter att komma åt din plats"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Det gick inte att hitta platsen. Försök igen senare."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Det gick inte att komma åt platsen"; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Försök igen"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Konto"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Plats"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Inget"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Inga Twitter-konton är konfigurerade. Du kan lägga till eller skapa ett Twitter-konto i Inställningar."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Inget Twitter-konto"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Tweeten gick inte att skicka."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%ds"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%ds"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Avbryt"; |
| | | |
| | | "tw__card_compose_character_count" = "%td tecken kvar"; |
| | | |
| | | "tw__card_compose_close_hint" = "Dubbeltryck för att avfärda redigeraren."; |
| | | |
| | | "tw__card_compose_install_preview" = "Förhandsgranskning av installationsknapp för %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "%@s profil"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Dubbeltryck för att posta denna Tweet"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Installera"; |
| | | |
| | | "tw__card_composer_tweet" = "Tweeta"; |
| | | |
| | | "tw__close_button" = "Stäng"; |
| | | |
| | | "tw__composer_placeholder_text" = "Vad händer?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Du får uppdateringar och annan information från %@ om du tillåter denna person att komma åt din e-postadress i ditt Twitter-konto @%@."; |
| | | |
| | | "tw__empty_timeline" = "Tidslinjen är tom"; |
| | | |
| | | "tw__image_viewer_done_button" = "Klart"; |
| | | |
| | | "tw__open_in_text" = "Öppnas i %@"; |
| | | |
| | | "tw__privacy_information_button" = "Integritetsinformation"; |
| | | |
| | | "tw__share_tweet" = "Dela tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet från %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Logga in med Twitter"; |
| | | |
| | | "tw__single_image" = "Bildbilaga"; |
| | | |
| | | "tw__test_string" = "Test"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Bilaga"; |
| | | |
| | | "tw__tweet_like_button" = "Gilla"; |
| | | |
| | | "tw__tweet_liked_state" = "Gillat"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Inte gillat"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profil"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Retweetad av %@"; |
| | | |
| | | "tw__tweet_share_button" = "Dela"; |
| | | |
| | | "tw__user_content_image" = "Förhandsgranskning av app"; |
| | | |
| | | "tw__video_thumbnail" = "Videobilaga"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Detta är en sponsrad annons"; |
| | | |
New file |
| | |
| | | "tw__empty_timeline" = "காலவரிசை வெறுமையாக உள்ளது"; |
| | | |
| | | "tw__image_viewer_done_button" = "முடிந்தது"; |
| | | |
| | | "tw__open_in_text" = "%@ -இல் திற"; |
| | | |
| | | "tw__privacy_information_button" = "தனியுரிமைத் தகவல்"; |
| | | |
| | | "tw__tweet_share_button" = "பகிர்"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "இது ஒரு ஸ்பான்சர் விளம்பரம்"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "ยังไม่ได้ส่งทวีต"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "โปรดไปที่ การตั้งค่า iOS > ความเป็นส่วนตัว > บริการตำแหน่งที่ตั้ง เพื่อให้ทวิตเตอร์สามารถเข้าถึงตำแหน่งที่ตั้งของคุณได้"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "อนุญาตให้ทวิตเตอร์เข้าถึงตำแหน่งที่ตั้งของคุณได้"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "หาตำแหน่งที่ตั้งไม่พบ โปรดลองอีกครั้งในภายหลัง"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "ไม่สามารถเข้าถึงตำแหน่งที่ตั้งได้"; |
| | | |
| | | "OK_ACTION_LABEL" = "ตกลง"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "ลองใหม่"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "ทวีต"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "บัญชี"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "ตำแหน่งที่ตั้ง"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "ไม่มี"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "ไม่มีบัญชีทวิตเตอร์ที่กำหนดค่า คุณสามารถเพิ่มหรือสร้างบัญชีทวิตเตอร์ได้ในการตั้งค่า"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "ไม่มีบัญชีทวิตเตอร์"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "ไม่สามารถส่งทวีตได้"; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "ทวิตเตอร์"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dว."; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dว."; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dชม."; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dชม."; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dน."; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dน."; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%dวิ."; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%dวิ."; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "ยกเลิก"; |
| | | |
| | | "tw__card_compose_character_count" = "เหลืออีก %td ตัวอักขระ"; |
| | | |
| | | "tw__card_compose_close_hint" = "แตะสองครั้งเพื่อยกเลิก"; |
| | | |
| | | "tw__card_compose_install_preview" = "การแสดงตัวอย่างของปุ่มติดตั้งสำหรับ %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "โปรไฟล์ของ %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "แตะสองครั้งเพื่อโพสต์ทวีตนี้"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "ติดตั้ง"; |
| | | |
| | | "tw__card_composer_tweet" = "ทวีต"; |
| | | |
| | | "tw__close_button" = "ปิด"; |
| | | |
| | | "tw__composer_placeholder_text" = "กำลังเกิดอะไรขึ้น"; |
| | | |
| | | "tw__email_share_detail_message_format" = "รับการอัพเดทและข้อมูลอื่นๆ ได้จาก %@ เมื่อคุณให้สิทธิ์ในการเข้าถึงอีเมลของคุณในบัญชีทวิตเตอร์ @%@"; |
| | | |
| | | "tw__empty_timeline" = "ลำดับเหตุการณ์ว่างเปล่า"; |
| | | |
| | | "tw__image_viewer_done_button" = "เสร็จสิ้น"; |
| | | |
| | | "tw__open_in_text" = "เปิดใน %@"; |
| | | |
| | | "tw__privacy_information_button" = "ข้อมูลความเป็นส่วนตัว"; |
| | | |
| | | "tw__share_tweet" = "แบ่งปันทวีต"; |
| | | |
| | | "tw__share_tweet_subject_format" = "ทวีตจาก %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "เข้าสู่ระบบด้วยทวิตเตอร์"; |
| | | |
| | | "tw__single_image" = "ไฟล์แนบรูปภาพ"; |
| | | |
| | | "tw__test_string" = "ทดสอบ"; |
| | | |
| | | "tw__tweet_image_accessibility" = "ไฟล์แนบ"; |
| | | |
| | | "tw__tweet_like_button" = "ชื่นชอบ"; |
| | | |
| | | "tw__tweet_liked_state" = "ชื่นชอบแล้ว"; |
| | | |
| | | "tw__tweet_not_liked_state" = "ยังไม่ได้ชื่นชอบ"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "โปรไฟล์"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "รีทวีตโดย %@"; |
| | | |
| | | "tw__tweet_share_button" = "แบ่งปัน"; |
| | | |
| | | "tw__user_content_image" = "การแสดงตัวอย่างแอพ"; |
| | | |
| | | "tw__video_thumbnail" = "ไฟล์แนบวิดีโอ"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "ส่วนนี้คือโฆษณาที่ได้รับการสนับสนุน"; |
| | | |
New file |
| | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dh"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dm"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%ds"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%ds"; |
| | | |
| | | "tw__card_compose_character_count" = "%td karakter ang natitira"; |
| | | |
| | | "tw__card_compose_close_hint" = "I-tap ng doble para maalis ang composer."; |
| | | |
| | | "tw__card_compose_install_preview" = "Preview ng install button para sa %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Profile ni %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "I-tap ng doble para i-post itong Tweet"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "I-install"; |
| | | |
| | | "tw__card_composer_tweet" = "Mag-tweet"; |
| | | |
| | | "tw__composer_placeholder_text" = "Ano'ng Nangyayari?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Magkaroon ng mga update at iba pang impormasyon mula sa %@ kapag pinayagan ninyo silang mag-access sa inyong email sa inyiong Twitter account @%@."; |
| | | |
| | | "tw__empty_timeline" = "Walang laman ang timeline"; |
| | | |
| | | "tw__image_viewer_done_button" = "Tapos na"; |
| | | |
| | | "tw__open_in_text" = "Buksan sa %@"; |
| | | |
| | | "tw__privacy_information_button" = "Impormasyon sa pagkapribado"; |
| | | |
| | | "tw__share_tweet" = "Ibahagi ang Tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet mula kay %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Mag-log in sa Twitter"; |
| | | |
| | | "tw__single_image" = "May kakabit na imahe"; |
| | | |
| | | "tw__test_string" = "Test"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Attachment"; |
| | | |
| | | "tw__tweet_like_button" = "Gawing gusto"; |
| | | |
| | | "tw__tweet_liked_state" = "Nagustuhan"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Di nagustuhan"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profile"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Ni-retweet ni %@"; |
| | | |
| | | "tw__tweet_share_button" = "Ibahagi"; |
| | | |
| | | "tw__user_content_image" = "Preview ng App"; |
| | | |
| | | "tw__video_thumbnail" = "May kakabit na video"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Ito ay isang sponsored ad"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet gönderilmedi"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Twitter'a konumuna erişme izni vermek için lütfen iOS'ta Ayarlar > Gizlilik > Konum Servisleri bölümüne git."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Twitter'a konumuna erişmesi için izin ver"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Konumunu bulamadık. Lütfen daha sonra yeniden dene."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Konuma erişilemedi"; |
| | | |
| | | "OK_ACTION_LABEL" = "Tamam"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Yeniden Dene"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Hesap"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Konum"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Yok"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Yapılandırılmış Twitter hesabı yok. Ayarlarda bir Twitter hesabı ekleyebilir veya oluşturabilirsin."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Twitter Hesabı Yok"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Tweet gönderilemedi."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dg"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dg"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%ds"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%ds"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dd"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%ds"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%ds"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "İptal"; |
| | | |
| | | "tw__card_compose_character_count" = "%td karakter kaldı"; |
| | | |
| | | "tw__card_compose_close_hint" = "Besteciyi gizlemek için çift dokun."; |
| | | |
| | | "tw__card_compose_install_preview" = "%@ için yükleme butonu önizlemesi"; |
| | | |
| | | "tw__card_compose_profile_image" = "%@ adlı kişinin profili"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Bu Tweeti göndermek için çift dokun"; |
| | | |
| | | "tw__card_composer_app_store" = "Uygulama Mağazası"; |
| | | |
| | | "tw__card_composer_install_button" = "Yükle"; |
| | | |
| | | "tw__card_composer_tweet" = "Tweetle"; |
| | | |
| | | "tw__close_button" = "Kapat"; |
| | | |
| | | "tw__composer_placeholder_text" = "Neler Oluyor?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "@%@ Twitter hesabından e-postana erişim izni verdiğinde, %@ kaynağından güncellemeleri ve diğer bilgileri alabilirsin."; |
| | | |
| | | "tw__empty_timeline" = "Zaman akışı boş"; |
| | | |
| | | "tw__image_viewer_done_button" = "Tamam"; |
| | | |
| | | "tw__open_in_text" = "%@ uygulamasında aç"; |
| | | |
| | | "tw__privacy_information_button" = "Gizlilik bilgileri"; |
| | | |
| | | "tw__share_tweet" = "Tweeti Paylaş"; |
| | | |
| | | "tw__share_tweet_subject_format" = "%1$@ (@%2$@) adlı kişiden Tweet"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Twitter ile giriş yap"; |
| | | |
| | | "tw__single_image" = "Resim Eklentisi"; |
| | | |
| | | "tw__test_string" = "Test"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Ek"; |
| | | |
| | | "tw__tweet_like_button" = "Beğen"; |
| | | |
| | | "tw__tweet_liked_state" = "Beğenildi"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Beğenilmedi"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Profil"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "%@ tarafından retweetlendi"; |
| | | |
| | | "tw__tweet_share_button" = "Paylaş"; |
| | | |
| | | "tw__user_content_image" = "Uygulama Önizlemesi"; |
| | | |
| | | "tw__video_thumbnail" = "Video Eklentisi"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Bu bir sponsorlu reklamdır"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Твіт не надіслано"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "В iOS виберіть «Параметри» > «Приватність» > «Служба локації», щоб дозволити Твіттеру отримувати дані про ваше місцезнаходження."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Дозвольте Твіттеру отримувати дані про ваше місцезнаходження"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Не вдалося визначити ваше місцезнаходження. Спробуйте ще раз пізніше."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Не вдалось отримати дані про місцезнаходження"; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Спробувати ще раз"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Твітнути"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Профіль"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Місцезнаходження"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Немає"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Профіль Твіттера не налаштовано. Ви можете додати або створити профіль Твіттера в Налаштуваннях."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Профіль Твіттера не вказано"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Не вдалося надіслати твіт."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Твіттер"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%d дн."; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%d дн."; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%d год"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%d год"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%d хв"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%d хв"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%d с"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%d с"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Скасувати"; |
| | | |
| | | "tw__card_compose_character_count" = "Лишилося символів: %td"; |
| | | |
| | | "tw__card_compose_close_hint" = "Торкніться двічі, щоб прибрати редактор."; |
| | | |
| | | "tw__card_compose_install_preview" = "Попередній перегляд кнопки установки для %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Профіль %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Торкніться двічі, щоб опублікувати цей твіт"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "Встановити"; |
| | | |
| | | "tw__card_composer_tweet" = "Твітнути"; |
| | | |
| | | "tw__close_button" = "Закрити"; |
| | | |
| | | "tw__composer_placeholder_text" = "Що відбувається?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Отримуйте оновлення та іншу інформацію від додатка %@, надавши йому доступ до адреси електронної пошти у вашому профілі Твіттера @%@."; |
| | | |
| | | "tw__empty_timeline" = "Стрічка пуста"; |
| | | |
| | | "tw__image_viewer_done_button" = "Готово"; |
| | | |
| | | "tw__open_in_text" = "Відкрити в %@"; |
| | | |
| | | "tw__privacy_information_button" = "Інформація про конфіденційність"; |
| | | |
| | | "tw__share_tweet" = "Поділитися твітом"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Твіт від %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Увійти за допомогою профілю Твіттера"; |
| | | |
| | | "tw__single_image" = "Прикріплено зображення"; |
| | | |
| | | "tw__test_string" = "Тест"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Прикріплення"; |
| | | |
| | | "tw__tweet_like_button" = "Вподобати"; |
| | | |
| | | "tw__tweet_liked_state" = "Вподобано"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Не вподобано"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Профіль"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Ретвітнуто користувачем(кою) %@"; |
| | | |
| | | "tw__tweet_share_button" = "Поділитися"; |
| | | |
| | | "tw__user_content_image" = "Попередній перегляд додатка"; |
| | | |
| | | "tw__video_thumbnail" = "Прикріплено відео"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Це спонсорська реклама"; |
| | | |
New file |
| | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dدن"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dدن"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dگھنٹے"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dگھنٹہ"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dمنٹ"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dمنٹ"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%dسیکنڈ"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%dسیکنڈ"; |
| | | |
| | | "tw__card_compose_profile_image" = "%@ کی پروفائل"; |
| | | |
| | | "tw__card_composer_app_store" = "ایپ اسٹور"; |
| | | |
| | | "tw__card_composer_install_button" = "انسٹال کریں"; |
| | | |
| | | "tw__card_composer_tweet" = "ٹویٹ"; |
| | | |
| | | "tw__composer_placeholder_text" = "کیا ہو رہا ہے؟"; |
| | | |
| | | "tw__email_share_detail_message_format" = "%@ سے اپ ڈیٹس اور دیگر معلومات حاصل کریں جب آپ نے انہیں @%@ اپنے ٹوئٹر اکاؤنٹ پر اپنے ای میل تک رسائی کی اجازت دی ہو"; |
| | | |
| | | "tw__empty_timeline" = "ٹائم لائن خالی ہے"; |
| | | |
| | | "tw__image_viewer_done_button" = "ہو گیا"; |
| | | |
| | | "tw__open_in_text" = "%@ میں کھولیں"; |
| | | |
| | | "tw__privacy_information_button" = "ذاتی معلومات"; |
| | | |
| | | "tw__share_tweet" = "ٹویٹ شیئر کریں"; |
| | | |
| | | "tw__share_tweet_subject_format" = "ٹویٹ بطرف %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "ٹوئٹر کے ساتھ لاگ ان کریں"; |
| | | |
| | | "tw__single_image" = "تصویر منسلک ہے"; |
| | | |
| | | "tw__test_string" = "ٹیسٹ"; |
| | | |
| | | "tw__tweet_image_accessibility" = "منسلکہ"; |
| | | |
| | | "tw__tweet_like_button" = "پسند"; |
| | | |
| | | "tw__tweet_liked_state" = "پسند کردہ"; |
| | | |
| | | "tw__tweet_not_liked_state" = "نا پسند کردہ"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "پروفائل"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "%@ کی ریٹویٹ شدہ"; |
| | | |
| | | "tw__tweet_share_button" = "شیئر کریں"; |
| | | |
| | | "tw__user_content_image" = "ایپلی کیشن کا پیش منظر"; |
| | | |
| | | "tw__video_thumbnail" = "ویڈیو منسلک ہے"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "یہ اسپانسر شدہ اشتہار ہے"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "Tweet không gửi"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "Hãy truy cập Cài đặt\niOS > Quyền riêng tư > Dịch vụ định vị để cho phép Twitter truy cập vị trí của bạn."; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "Cho phép Twitter truy cập vị trí của bạn"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "Không thể tìm thấy vị trí của bạn. Hãy thử lại sau."; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "Không truy cập được vị trí"; |
| | | |
| | | "OK_ACTION_LABEL" = "OK"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "Thử lại"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "Tweet"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "Tài khoản"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "Vị trí"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "Không"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "Không có tài khoản Twitter nào được cấu hình. Bạn có thể\nthêm hoặc tạo tài khoản Twitter trong Cài đặt."; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "Không có tài khoản Twitter"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "Tweet không gửi được."; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%dngày"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%dngày"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%dgiờ"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%dgiờ"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%dphút"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%dphút"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%dgiây"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%dgiây"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "Hủy"; |
| | | |
| | | "tw__card_compose_character_count" = "%td ký tự còn lại"; |
| | | |
| | | "tw__card_compose_close_hint" = "Nhấn đúp để bỏ qua trình soạn."; |
| | | |
| | | "tw__card_compose_install_preview" = "Xem trước nút cài đặt cho %@"; |
| | | |
| | | "tw__card_compose_profile_image" = "Hồ sơ của %@"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "Nhấn đúp để đăng Tweet này"; |
| | | |
| | | "tw__card_composer_app_store" = "Kho Ứng dụng"; |
| | | |
| | | "tw__card_composer_install_button" = "Cài đặt"; |
| | | |
| | | "tw__card_composer_tweet" = "Đăng Tweet"; |
| | | |
| | | "tw__close_button" = "Đóng"; |
| | | |
| | | "tw__composer_placeholder_text" = "Điều gì Đang xảy ra?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "Nhận các cập nhật và thông tin khác từ %@ khi bạn cho phép họ truy cập email trên tài khoản Twitter của mình @%@."; |
| | | |
| | | "tw__empty_timeline" = "Dòng thời gian trống không"; |
| | | |
| | | "tw__image_viewer_done_button" = "Đã xong"; |
| | | |
| | | "tw__open_in_text" = "Mở bằng %@"; |
| | | |
| | | "tw__privacy_information_button" = "Thông tin về quyền riêng tư"; |
| | | |
| | | "tw__share_tweet" = "Chia sẻ Tweet"; |
| | | |
| | | "tw__share_tweet_subject_format" = "Tweet từ %1$@ (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "Đăng nhập vào Twitter"; |
| | | |
| | | "tw__single_image" = "Đính kèm Ảnh"; |
| | | |
| | | "tw__test_string" = "Thử nghiệm"; |
| | | |
| | | "tw__tweet_image_accessibility" = "Đính kèm"; |
| | | |
| | | "tw__tweet_like_button" = "Thích"; |
| | | |
| | | "tw__tweet_liked_state" = "Đã thích"; |
| | | |
| | | "tw__tweet_not_liked_state" = "Chưa được Thích"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "Hồ sơ"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "Tweet lại bởi %@"; |
| | | |
| | | "tw__tweet_share_button" = "Chia sẻ"; |
| | | |
| | | "tw__user_content_image" = "Xem trước Ứng dụng"; |
| | | |
| | | "tw__video_thumbnail" = "Đính kèm Video"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "Đây là quảng cáo được tài trợ"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "推文未发送"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "请前往 iOS 的设置>隐私>位置服务,允许 Twitter 访问你的位置。"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "允许 Twitter 访问你的位置"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "不能找到你的位置。请稍后再试。"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "访问位置失败"; |
| | | |
| | | "OK_ACTION_LABEL" = "确定"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "重试"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "推文"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "账号"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "位置"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "无"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "未设置 Twitter 账号。你可以在设置中添加或创建一个 Twitter 账号。"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "无 Twitter 账号"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "推文发送失败。"; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%d天"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%d天"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%d小时"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%d小时"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%d分钟"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%d分钟"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%d秒"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%d秒"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "取消"; |
| | | |
| | | "tw__card_compose_character_count" = "剩余%td字符"; |
| | | |
| | | "tw__card_compose_close_hint" = "双击以关闭发推输入框。"; |
| | | |
| | | "tw__card_compose_install_preview" = "用于预览 %@ 的按钮"; |
| | | |
| | | "tw__card_compose_profile_image" = "%@的个人资料"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "双击来发出这条推文"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "安装"; |
| | | |
| | | "tw__card_composer_tweet" = "发推"; |
| | | |
| | | "tw__close_button" = "关闭"; |
| | | |
| | | "tw__composer_placeholder_text" = "有什么新鲜事?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "当你允许%@访问你在@%@Twitter账号的电子邮件获取更新和其他信息。"; |
| | | |
| | | "tw__empty_timeline" = "时间线为空"; |
| | | |
| | | "tw__image_viewer_done_button" = "完成"; |
| | | |
| | | "tw__open_in_text" = "在 %@ 中打开"; |
| | | |
| | | "tw__privacy_information_button" = "隐私信息"; |
| | | |
| | | "tw__share_tweet" = "转推"; |
| | | |
| | | "tw__share_tweet_subject_format" = "来自 %1$@ (@%2$@) 的推文"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "使用 Twitter 登录"; |
| | | |
| | | "tw__single_image" = "图像附件"; |
| | | |
| | | "tw__test_string" = "测试"; |
| | | |
| | | "tw__tweet_image_accessibility" = "附件"; |
| | | |
| | | "tw__tweet_like_button" = "喜欢"; |
| | | |
| | | "tw__tweet_liked_state" = "被喜欢"; |
| | | |
| | | "tw__tweet_not_liked_state" = "没有被喜欢"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "个人资料"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "由 %@ 转推"; |
| | | |
| | | "tw__tweet_share_button" = "分享"; |
| | | |
| | | "tw__user_content_image" = "应用截图"; |
| | | |
| | | "tw__video_thumbnail" = "视频附件"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "这是赞助方广告"; |
| | | |
New file |
| | |
| | | "COMPOSITION_SEND_TWEET_ERROR_LABEL" = "推文未發送"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_MESSAGE" = "請前往 iOS 的「設定 > 隱私 > 位置服務」,允許 Twitter 存取你的位置。"; |
| | | |
| | | "LOCATION_SERVICES_ACCESS_DENIED_ALERT_TITLE" = "允許 Twitter 存取你的位置"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_MESSAGE" = "找不到你的位置,請稍後再試。"; |
| | | |
| | | "LOCATION_SERVICES_ERROR_ALERT_TITLE" = "無法存取位置"; |
| | | |
| | | "OK_ACTION_LABEL" = "確定"; |
| | | |
| | | "RETRY_ACTION_LABEL" = "重試"; |
| | | |
| | | "SEND_TWEET_ACTION_LABEL" = "推文"; |
| | | |
| | | "SHARE_EXT_ACCOUNT" = "帳戶"; |
| | | |
| | | "SHARE_EXT_LOCATION" = "位置"; |
| | | |
| | | "SHARE_EXT_NONE_VALUE" = "無"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_MESSAGE" = "未設定任何 Twitter 帳戶。你可以在「設定」中加入或建立 Twitter 帳戶。"; |
| | | |
| | | "SHARE_EXT_NO_ACCOUNTS_TITLE" = "沒有 Twitter 帳戶"; |
| | | |
| | | "SHARE_EXT_TWEET_FAILED_TITLE" = "推文無法發送。"; |
| | | |
| | | "SHARE_EXT_TWITTER_TITLE" = "Twitter"; |
| | | |
| | | "TIME_SHORT_DAYS_FORMAT" = "%d 天"; |
| | | |
| | | "TIME_SHORT_DAY_FORMAT" = "%d 天"; |
| | | |
| | | "TIME_SHORT_HOURS_FORMAT" = "%d 小時"; |
| | | |
| | | "TIME_SHORT_HOUR_FORMAT" = "%d 小時"; |
| | | |
| | | "TIME_SHORT_MINUTES_FORMAT" = "%d 分鐘"; |
| | | |
| | | "TIME_SHORT_MINUTE_FORMAT" = "%d 分鐘"; |
| | | |
| | | "TIME_SHORT_SECONDS_FORMAT" = "%d 秒"; |
| | | |
| | | "TIME_SHORT_SECOND_FORMAT" = "%d 秒"; |
| | | |
| | | "TSEUI_CANCEL_ACTION_LABEL" = "取消"; |
| | | |
| | | "tw__card_compose_character_count" = "還剩 %td 個字元"; |
| | | |
| | | "tw__card_compose_close_hint" = "點選兩下即可關閉撰寫工具。"; |
| | | |
| | | "tw__card_compose_install_preview" = "%@ 的安裝按鈕預覽"; |
| | | |
| | | "tw__card_compose_profile_image" = "%@ 的個人資料"; |
| | | |
| | | "tw__card_compose_tweet_hint" = "點選兩下即可發佈此推文"; |
| | | |
| | | "tw__card_composer_app_store" = "App Store"; |
| | | |
| | | "tw__card_composer_install_button" = "安裝"; |
| | | |
| | | "tw__card_composer_tweet" = "推文"; |
| | | |
| | | "tw__close_button" = "關閉"; |
| | | |
| | | "tw__composer_placeholder_text" = "有什麼新鮮事?"; |
| | | |
| | | "tw__email_share_detail_message_format" = "當你允許 %@ 在你的 Twitter 帳戶 @%@ 上存取你的電子郵件時,就可以收到它們的更新和其他資訊。"; |
| | | |
| | | "tw__empty_timeline" = "時間軸是空的"; |
| | | |
| | | "tw__image_viewer_done_button" = "完成"; |
| | | |
| | | "tw__open_in_text" = "在 %@ 中開啟"; |
| | | |
| | | "tw__privacy_information_button" = "隱私資訊"; |
| | | |
| | | "tw__share_tweet" = "分享推文"; |
| | | |
| | | "tw__share_tweet_subject_format" = "來自 %1$@ 的推文 (@%2$@)"; |
| | | |
| | | "tw__sign_in_with_twitter_button" = "用 Twitter 登入"; |
| | | |
| | | "tw__single_image" = "影像附件"; |
| | | |
| | | "tw__test_string" = "測試"; |
| | | |
| | | "tw__tweet_image_accessibility" = "附件"; |
| | | |
| | | "tw__tweet_like_button" = "喜歡"; |
| | | |
| | | "tw__tweet_liked_state" = "已喜歡"; |
| | | |
| | | "tw__tweet_not_liked_state" = "尚未喜歡"; |
| | | |
| | | "tw__tweet_profile_accessibility" = "個人檔案"; |
| | | |
| | | "tw__tweet_retweeted_by_user" = "由 %@ 轉推"; |
| | | |
| | | "tw__tweet_share_button" = "分享"; |
| | | |
| | | "tw__user_content_image" = "應用程式預覽"; |
| | | |
| | | "tw__video_thumbnail" = "影片附件"; |
| | | |
| | | "tw__view_is_sponsored_ad" = "這是贊助廣告"; |
| | | |
New file |
| | |
| | | TwitterKit.framework/TwitterKitResources.bundle |
New file |
| | |
| | | TwitterKit.framework/TwitterShareExtensionUIResources.bundle |
New file |
| | |
| | | // |
| | | // WATwitterImpl.h |
| | | // WATwitterImpl |
| | | // |
| | | // Created by hank on 2017/5/2. |
| | | // Copyright © 2017年 hank. All rights reserved. |
| | | // |
| | | |
| | | #import <UIKit/UIKit.h> |
| | | |
| | | //! Project version number for WATwitterImpl. |
| | | FOUNDATION_EXPORT double WATwitterImplVersionNumber; |
| | | |
| | | //! Project version string for WATwitterImpl. |
| | | FOUNDATION_EXPORT const unsigned char WATwitterImplVersionString[]; |
| | | |
| | | // In this header, you should import all the public headers of your framework using statements like #import <WATwitterImpl/PublicHeader.h> |
| | | |
| | | //time:2017/5/13 12:05 ver:3.6.4 |
New file |
| | |
| | | framework module WATwitterImpl { |
| | | umbrella header "WATwitterImpl.h" |
| | | |
| | | export * |
| | | module * { export * } |
| | | } |