mirror of
https://github.com/miniflux/v2.git
synced 2025-06-27 16:36:00 +00:00
feat(integration)!: remove Pocket integration
BREAKING CHANGE: Pocket will no longer be available after July 8, 2025. https://support.mozilla.org/en-US/kb/future-of-pocket#w_when-is-pocket-shutting-down
This commit is contained in:
parent
70b513b8db
commit
e9c1e90b81
41 changed files with 105 additions and 710 deletions
|
@ -70,7 +70,7 @@ Features
|
||||||
|
|
||||||
### Integrations
|
### Integrations
|
||||||
|
|
||||||
- 25+ integrations with third-party services: [Apprise](https://github.com/caronc/apprise), [Betula](https://sr.ht/~bouncepaw/betula/), [Cubox](https://cubox.cc/), [Discord](https://discord.com/), [Espial](https://github.com/jonschoning/espial), [Instapaper](https://www.instapaper.com/), [LinkAce](https://www.linkace.org/), [Linkding](https://github.com/sissbruecker/linkding), [LinkWarden](https://linkwarden.app/), [Matrix](https://matrix.org), [Notion](https://www.notion.com/), [Ntfy](https://ntfy.sh/), [Nunux Keeper](https://keeper.nunux.org/), [Pinboard](https://pinboard.in/), [Pocket](https://getpocket.com/), [Pushover](https://pushover.net), [RainDrop](https://raindrop.io/), [Readeck](https://readeck.org/en/), [Readwise Reader](https://readwise.io/read), [RssBridge](https://rss-bridge.org/), [Shaarli](https://github.com/shaarli/Shaarli), [Shiori](https://github.com/go-shiori/shiori), [Slack](https://slack.com/), [Telegram](https://telegram.org), [Wallabag](https://www.wallabag.org/), etc.
|
- 25+ integrations with third-party services: [Apprise](https://github.com/caronc/apprise), [Betula](https://sr.ht/~bouncepaw/betula/), [Cubox](https://cubox.cc/), [Discord](https://discord.com/), [Espial](https://github.com/jonschoning/espial), [Instapaper](https://www.instapaper.com/), [LinkAce](https://www.linkace.org/), [Linkding](https://github.com/sissbruecker/linkding), [LinkWarden](https://linkwarden.app/), [Matrix](https://matrix.org), [Notion](https://www.notion.com/), [Ntfy](https://ntfy.sh/), [Nunux Keeper](https://keeper.nunux.org/), [Pinboard](https://pinboard.in/), [Pushover](https://pushover.net), [RainDrop](https://raindrop.io/), [Readeck](https://readeck.org/en/), [Readwise Reader](https://readwise.io/read), [RssBridge](https://rss-bridge.org/), [Shaarli](https://github.com/shaarli/Shaarli), [Shiori](https://github.com/go-shiori/shiori), [Slack](https://slack.com/), [Telegram](https://telegram.org), [Wallabag](https://www.wallabag.org/), etc.
|
||||||
- Bookmarklet for subscribing to websites directly from any web browser.
|
- Bookmarklet for subscribing to websites directly from any web browser.
|
||||||
- Webhooks for real-time notifications or custom integrations.
|
- Webhooks for real-time notifications or custom integrations.
|
||||||
- Compatibility with existing mobile applications using the Fever or Google Reader API.
|
- Compatibility with existing mobile applications using the Fever or Google Reader API.
|
||||||
|
|
|
@ -1466,41 +1466,6 @@ func TestCreateAdmin(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPocketConsumerKeyFromEnvVariable(t *testing.T) {
|
|
||||||
os.Clearenv()
|
|
||||||
os.Setenv("POCKET_CONSUMER_KEY", "something")
|
|
||||||
|
|
||||||
parser := NewParser()
|
|
||||||
opts, err := parser.ParseEnvironmentVariables()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf(`Parsing failure: %v`, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
expected := "something"
|
|
||||||
result := opts.PocketConsumerKey("default")
|
|
||||||
|
|
||||||
if result != expected {
|
|
||||||
t.Fatalf(`Unexpected POCKET_CONSUMER_KEY value, got %q instead of %q`, result, expected)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestPocketConsumerKeyFromUserPrefs(t *testing.T) {
|
|
||||||
os.Clearenv()
|
|
||||||
|
|
||||||
parser := NewParser()
|
|
||||||
opts, err := parser.ParseEnvironmentVariables()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf(`Parsing failure: %v`, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
expected := "default"
|
|
||||||
result := opts.PocketConsumerKey("default")
|
|
||||||
|
|
||||||
if result != expected {
|
|
||||||
t.Fatalf(`Unexpected POCKET_CONSUMER_KEY value, got %q instead of %q`, result, expected)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMediaProxyMode(t *testing.T) {
|
func TestMediaProxyMode(t *testing.T) {
|
||||||
os.Clearenv()
|
os.Clearenv()
|
||||||
os.Setenv("MEDIA_PROXY_MODE", "all")
|
os.Setenv("MEDIA_PROXY_MODE", "all")
|
||||||
|
@ -1968,8 +1933,6 @@ func TestParseConfigFile(t *testing.T) {
|
||||||
|
|
||||||
DEBUG = yes
|
DEBUG = yes
|
||||||
|
|
||||||
POCKET_CONSUMER_KEY= >#1234
|
|
||||||
|
|
||||||
Invalid text
|
Invalid text
|
||||||
`)
|
`)
|
||||||
|
|
||||||
|
@ -1994,12 +1957,6 @@ Invalid text
|
||||||
t.Errorf(`Unexpected debug mode value, got %q`, opts.LogLevel())
|
t.Errorf(`Unexpected debug mode value, got %q`, opts.LogLevel())
|
||||||
}
|
}
|
||||||
|
|
||||||
expected := ">#1234"
|
|
||||||
result := opts.PocketConsumerKey("default")
|
|
||||||
if result != expected {
|
|
||||||
t.Errorf(`Unexpected POCKET_CONSUMER_KEY value, got %q instead of %q`, result, expected)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tmpfile.Close(); err != nil {
|
if err := tmpfile.Close(); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,6 @@ const (
|
||||||
defaultOauth2OidcProviderName = "OpenID Connect"
|
defaultOauth2OidcProviderName = "OpenID Connect"
|
||||||
defaultOAuth2Provider = ""
|
defaultOAuth2Provider = ""
|
||||||
defaultDisableLocalAuth = false
|
defaultDisableLocalAuth = false
|
||||||
defaultPocketConsumerKey = ""
|
|
||||||
defaultHTTPClientTimeout = 20
|
defaultHTTPClientTimeout = 20
|
||||||
defaultHTTPClientMaxBodySize = 15
|
defaultHTTPClientMaxBodySize = 15
|
||||||
defaultHTTPClientProxy = ""
|
defaultHTTPClientProxy = ""
|
||||||
|
@ -163,7 +162,6 @@ type Options struct {
|
||||||
oidcProviderName string
|
oidcProviderName string
|
||||||
oauth2Provider string
|
oauth2Provider string
|
||||||
disableLocalAuth bool
|
disableLocalAuth bool
|
||||||
pocketConsumerKey string
|
|
||||||
httpClientTimeout int
|
httpClientTimeout int
|
||||||
httpClientMaxBodySize int64
|
httpClientMaxBodySize int64
|
||||||
httpClientProxyURL *url.URL
|
httpClientProxyURL *url.URL
|
||||||
|
@ -245,7 +243,6 @@ func NewOptions() *Options {
|
||||||
oidcProviderName: defaultOauth2OidcProviderName,
|
oidcProviderName: defaultOauth2OidcProviderName,
|
||||||
oauth2Provider: defaultOAuth2Provider,
|
oauth2Provider: defaultOAuth2Provider,
|
||||||
disableLocalAuth: defaultDisableLocalAuth,
|
disableLocalAuth: defaultDisableLocalAuth,
|
||||||
pocketConsumerKey: defaultPocketConsumerKey,
|
|
||||||
httpClientTimeout: defaultHTTPClientTimeout,
|
httpClientTimeout: defaultHTTPClientTimeout,
|
||||||
httpClientMaxBodySize: defaultHTTPClientMaxBodySize * 1024 * 1024,
|
httpClientMaxBodySize: defaultHTTPClientMaxBodySize * 1024 * 1024,
|
||||||
httpClientProxyURL: nil,
|
httpClientProxyURL: nil,
|
||||||
|
@ -579,14 +576,6 @@ func (o *Options) HasSchedulerService() bool {
|
||||||
return o.schedulerService
|
return o.schedulerService
|
||||||
}
|
}
|
||||||
|
|
||||||
// PocketConsumerKey returns the Pocket Consumer Key if configured.
|
|
||||||
func (o *Options) PocketConsumerKey(defaultValue string) string {
|
|
||||||
if o.pocketConsumerKey != "" {
|
|
||||||
return o.pocketConsumerKey
|
|
||||||
}
|
|
||||||
return defaultValue
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPClientTimeout returns the time limit in seconds before the HTTP client cancel the request.
|
// HTTPClientTimeout returns the time limit in seconds before the HTTP client cancel the request.
|
||||||
func (o *Options) HTTPClientTimeout() int {
|
func (o *Options) HTTPClientTimeout() int {
|
||||||
return o.httpClientTimeout
|
return o.httpClientTimeout
|
||||||
|
@ -769,7 +758,6 @@ func (o *Options) SortedOptions(redactSecret bool) []*Option {
|
||||||
"OAUTH2_REDIRECT_URL": o.oauth2RedirectURL,
|
"OAUTH2_REDIRECT_URL": o.oauth2RedirectURL,
|
||||||
"OAUTH2_USER_CREATION": o.oauth2UserCreationAllowed,
|
"OAUTH2_USER_CREATION": o.oauth2UserCreationAllowed,
|
||||||
"DISABLE_LOCAL_AUTH": o.disableLocalAuth,
|
"DISABLE_LOCAL_AUTH": o.disableLocalAuth,
|
||||||
"POCKET_CONSUMER_KEY": redactSecretValue(o.pocketConsumerKey, redactSecret),
|
|
||||||
"POLLING_FREQUENCY": o.pollingFrequency,
|
"POLLING_FREQUENCY": o.pollingFrequency,
|
||||||
"FORCE_REFRESH_INTERVAL": o.forceRefreshInterval,
|
"FORCE_REFRESH_INTERVAL": o.forceRefreshInterval,
|
||||||
"POLLING_PARSING_ERROR_LIMIT": o.pollingParsingErrorLimit,
|
"POLLING_PARSING_ERROR_LIMIT": o.pollingParsingErrorLimit,
|
||||||
|
|
|
@ -213,10 +213,6 @@ func (p *Parser) parseLines(lines []string) (err error) {
|
||||||
p.opts.adminPassword = parseString(value, defaultAdminPassword)
|
p.opts.adminPassword = parseString(value, defaultAdminPassword)
|
||||||
case "ADMIN_PASSWORD_FILE":
|
case "ADMIN_PASSWORD_FILE":
|
||||||
p.opts.adminPassword = readSecretFile(value, defaultAdminPassword)
|
p.opts.adminPassword = readSecretFile(value, defaultAdminPassword)
|
||||||
case "POCKET_CONSUMER_KEY":
|
|
||||||
p.opts.pocketConsumerKey = parseString(value, defaultPocketConsumerKey)
|
|
||||||
case "POCKET_CONSUMER_KEY_FILE":
|
|
||||||
p.opts.pocketConsumerKey = readSecretFile(value, defaultPocketConsumerKey)
|
|
||||||
case "OAUTH2_USER_CREATION":
|
case "OAUTH2_USER_CREATION":
|
||||||
p.opts.oauth2UserCreationAllowed = parseBool(value, defaultOAuth2UserCreation)
|
p.opts.oauth2UserCreationAllowed = parseBool(value, defaultOAuth2UserCreation)
|
||||||
case "OAUTH2_CLIENT_ID":
|
case "OAUTH2_CLIENT_ID":
|
||||||
|
|
|
@ -1090,4 +1090,13 @@ var migrations = []func(tx *sql.Tx, driver string) error{
|
||||||
_, err = tx.Exec(`ALTER TABLE users ADD COLUMN open_external_links_in_new_tab bool default 't'`)
|
_, err = tx.Exec(`ALTER TABLE users ADD COLUMN open_external_links_in_new_tab bool default 't'`)
|
||||||
return err
|
return err
|
||||||
},
|
},
|
||||||
|
func(tx *sql.Tx, _ string) (err error) {
|
||||||
|
sql := `
|
||||||
|
ALTER TABLE integrations DROP COLUMN pocket_enabled;
|
||||||
|
ALTER TABLE integrations DROP COLUMN pocket_access_token;
|
||||||
|
ALTER TABLE integrations DROP COLUMN pocket_consumer_key;
|
||||||
|
`
|
||||||
|
_, err = tx.Exec(sql)
|
||||||
|
return err
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,6 @@ const (
|
||||||
OAuth2CodeVerifierContextKey
|
OAuth2CodeVerifierContextKey
|
||||||
FlashMessageContextKey
|
FlashMessageContextKey
|
||||||
FlashErrorMessageContextKey
|
FlashErrorMessageContextKey
|
||||||
PocketRequestTokenContextKey
|
|
||||||
LastForceRefreshContextKey
|
LastForceRefreshContextKey
|
||||||
ClientIPContextKey
|
ClientIPContextKey
|
||||||
GoogleReaderToken
|
GoogleReaderToken
|
||||||
|
@ -135,11 +134,6 @@ func FlashErrorMessage(r *http.Request) string {
|
||||||
return getContextStringValue(r, FlashErrorMessageContextKey)
|
return getContextStringValue(r, FlashErrorMessageContextKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PocketRequestToken returns the Pocket Request Token if any.
|
|
||||||
func PocketRequestToken(r *http.Request) string {
|
|
||||||
return getContextStringValue(r, PocketRequestTokenContextKey)
|
|
||||||
}
|
|
||||||
|
|
||||||
// LastForceRefresh returns the last force refresh timestamp.
|
// LastForceRefresh returns the last force refresh timestamp.
|
||||||
func LastForceRefresh(r *http.Request) int64 {
|
func LastForceRefresh(r *http.Request) int64 {
|
||||||
jsonStringValue := getContextStringValue(r, LastForceRefreshContextKey)
|
jsonStringValue := getContextStringValue(r, LastForceRefreshContextKey)
|
||||||
|
|
|
@ -390,28 +390,6 @@ func TestFlashErrorMessage(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPocketRequestToken(t *testing.T) {
|
|
||||||
r, _ := http.NewRequest("GET", "http://example.org", nil)
|
|
||||||
|
|
||||||
result := PocketRequestToken(r)
|
|
||||||
expected := ""
|
|
||||||
|
|
||||||
if result != expected {
|
|
||||||
t.Errorf(`Unexpected context value, got %q instead of %q`, result, expected)
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx := r.Context()
|
|
||||||
ctx = context.WithValue(ctx, PocketRequestTokenContextKey, "request token")
|
|
||||||
r = r.WithContext(ctx)
|
|
||||||
|
|
||||||
result = PocketRequestToken(r)
|
|
||||||
expected = "request token"
|
|
||||||
|
|
||||||
if result != expected {
|
|
||||||
t.Errorf(`Unexpected context value, got %q instead of %q`, result, expected)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestClientIP(t *testing.T) {
|
func TestClientIP(t *testing.T) {
|
||||||
r, _ := http.NewRequest("GET", "http://example.org", nil)
|
r, _ := http.NewRequest("GET", "http://example.org", nil)
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,6 @@ package integration // import "miniflux.app/v2/internal/integration"
|
||||||
import (
|
import (
|
||||||
"log/slog"
|
"log/slog"
|
||||||
|
|
||||||
"miniflux.app/v2/internal/config"
|
|
||||||
"miniflux.app/v2/internal/integration/apprise"
|
"miniflux.app/v2/internal/integration/apprise"
|
||||||
"miniflux.app/v2/internal/integration/betula"
|
"miniflux.app/v2/internal/integration/betula"
|
||||||
"miniflux.app/v2/internal/integration/cubox"
|
"miniflux.app/v2/internal/integration/cubox"
|
||||||
|
@ -23,7 +22,6 @@ import (
|
||||||
"miniflux.app/v2/internal/integration/nunuxkeeper"
|
"miniflux.app/v2/internal/integration/nunuxkeeper"
|
||||||
"miniflux.app/v2/internal/integration/omnivore"
|
"miniflux.app/v2/internal/integration/omnivore"
|
||||||
"miniflux.app/v2/internal/integration/pinboard"
|
"miniflux.app/v2/internal/integration/pinboard"
|
||||||
"miniflux.app/v2/internal/integration/pocket"
|
|
||||||
"miniflux.app/v2/internal/integration/pushover"
|
"miniflux.app/v2/internal/integration/pushover"
|
||||||
"miniflux.app/v2/internal/integration/raindrop"
|
"miniflux.app/v2/internal/integration/raindrop"
|
||||||
"miniflux.app/v2/internal/integration/readeck"
|
"miniflux.app/v2/internal/integration/readeck"
|
||||||
|
@ -197,24 +195,6 @@ func SendEntry(entry *model.Entry, userIntegrations *model.Integration) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if userIntegrations.PocketEnabled {
|
|
||||||
slog.Debug("Sending entry to Pocket",
|
|
||||||
slog.Int64("user_id", userIntegrations.UserID),
|
|
||||||
slog.Int64("entry_id", entry.ID),
|
|
||||||
slog.String("entry_url", entry.URL),
|
|
||||||
)
|
|
||||||
|
|
||||||
client := pocket.NewClient(config.Opts.PocketConsumerKey(userIntegrations.PocketConsumerKey), userIntegrations.PocketAccessToken)
|
|
||||||
if err := client.AddURL(entry.URL, entry.Title); err != nil {
|
|
||||||
slog.Error("Unable to send entry to Pocket",
|
|
||||||
slog.Int64("user_id", userIntegrations.UserID),
|
|
||||||
slog.Int64("entry_id", entry.ID),
|
|
||||||
slog.String("entry_url", entry.URL),
|
|
||||||
slog.Any("error", err),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if userIntegrations.LinkAceEnabled {
|
if userIntegrations.LinkAceEnabled {
|
||||||
slog.Debug("Sending entry to LinkAce",
|
slog.Debug("Sending entry to LinkAce",
|
||||||
slog.Int64("user_id", userIntegrations.UserID),
|
slog.Int64("user_id", userIntegrations.UserID),
|
||||||
|
|
|
@ -1,132 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
package pocket // import "miniflux.app/v2/internal/integration/pocket"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"miniflux.app/v2/internal/version"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Connector manages the authorization flow with Pocket to get a personal access token.
|
|
||||||
type Connector struct {
|
|
||||||
consumerKey string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewConnector returns a new Pocket Connector.
|
|
||||||
func NewConnector(consumerKey string) *Connector {
|
|
||||||
return &Connector{consumerKey}
|
|
||||||
}
|
|
||||||
|
|
||||||
// RequestToken fetches a new request token from Pocket API.
|
|
||||||
func (c *Connector) RequestToken(redirectURL string) (string, error) {
|
|
||||||
apiEndpoint := "https://getpocket.com/v3/oauth/request"
|
|
||||||
requestBody, err := json.Marshal(&createTokenRequest{ConsumerKey: c.consumerKey, RedirectURI: redirectURL})
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("pocket: unable to encode request body: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
request, err := http.NewRequest(http.MethodPost, apiEndpoint, bytes.NewReader(requestBody))
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("pocket: unable to create request: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
request.Header.Set("Content-Type", "application/json")
|
|
||||||
request.Header.Set("X-Accept", "application/json")
|
|
||||||
request.Header.Set("User-Agent", "Miniflux/"+version.Version)
|
|
||||||
|
|
||||||
httpClient := &http.Client{Timeout: defaultClientTimeout}
|
|
||||||
response, err := httpClient.Do(request)
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("pocket: unable to send request: %v", err)
|
|
||||||
}
|
|
||||||
defer response.Body.Close()
|
|
||||||
|
|
||||||
if response.StatusCode >= 400 {
|
|
||||||
return "", fmt.Errorf("pocket: unable get request token: url=%s status=%d", apiEndpoint, response.StatusCode)
|
|
||||||
}
|
|
||||||
|
|
||||||
var result createTokenResponse
|
|
||||||
if err := json.NewDecoder(response.Body).Decode(&result); err != nil {
|
|
||||||
return "", fmt.Errorf("pocket: unable to decode response: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if result.Code == "" {
|
|
||||||
return "", errors.New("pocket: request token is empty")
|
|
||||||
}
|
|
||||||
|
|
||||||
return result.Code, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// AccessToken fetches a new access token once the end-user authorized the application.
|
|
||||||
func (c *Connector) AccessToken(requestToken string) (string, error) {
|
|
||||||
apiEndpoint := "https://getpocket.com/v3/oauth/authorize"
|
|
||||||
requestBody, err := json.Marshal(&authorizeRequest{ConsumerKey: c.consumerKey, Code: requestToken})
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("pocket: unable to encode request body: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
request, err := http.NewRequest(http.MethodPost, apiEndpoint, bytes.NewReader(requestBody))
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("pocket: unable to create request: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
request.Header.Set("Content-Type", "application/json")
|
|
||||||
request.Header.Set("X-Accept", "application/json")
|
|
||||||
request.Header.Set("User-Agent", "Miniflux/"+version.Version)
|
|
||||||
|
|
||||||
httpClient := &http.Client{Timeout: defaultClientTimeout}
|
|
||||||
response, err := httpClient.Do(request)
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("pocket: unable to send request: %v", err)
|
|
||||||
}
|
|
||||||
defer response.Body.Close()
|
|
||||||
|
|
||||||
if response.StatusCode >= 400 {
|
|
||||||
return "", fmt.Errorf("pocket: unable get access token: url=%s status=%d", apiEndpoint, response.StatusCode)
|
|
||||||
}
|
|
||||||
|
|
||||||
var result authorizeReponse
|
|
||||||
if err := json.NewDecoder(response.Body).Decode(&result); err != nil {
|
|
||||||
return "", fmt.Errorf("pocket: unable to decode response: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if result.AccessToken == "" {
|
|
||||||
return "", errors.New("pocket: access token is empty")
|
|
||||||
}
|
|
||||||
|
|
||||||
return result.AccessToken, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// AuthorizationURL returns the authorization URL for the end-user.
|
|
||||||
func (c *Connector) AuthorizationURL(requestToken, redirectURL string) string {
|
|
||||||
return fmt.Sprintf(
|
|
||||||
"https://getpocket.com/auth/authorize?request_token=%s&redirect_uri=%s",
|
|
||||||
requestToken,
|
|
||||||
redirectURL,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
type createTokenRequest struct {
|
|
||||||
ConsumerKey string `json:"consumer_key"`
|
|
||||||
RedirectURI string `json:"redirect_uri"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type createTokenResponse struct {
|
|
||||||
Code string `json:"code"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type authorizeRequest struct {
|
|
||||||
ConsumerKey string `json:"consumer_key"`
|
|
||||||
Code string `json:"code"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type authorizeReponse struct {
|
|
||||||
AccessToken string `json:"access_token"`
|
|
||||||
Username string `json:"username"`
|
|
||||||
}
|
|
|
@ -1,70 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
package pocket // import "miniflux.app/v2/internal/integration/pocket"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"miniflux.app/v2/internal/version"
|
|
||||||
)
|
|
||||||
|
|
||||||
const defaultClientTimeout = 10 * time.Second
|
|
||||||
|
|
||||||
type Client struct {
|
|
||||||
consumerKey string
|
|
||||||
accessToken string
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewClient(consumerKey, accessToken string) *Client {
|
|
||||||
return &Client{consumerKey, accessToken}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Client) AddURL(entryURL, entryTitle string) error {
|
|
||||||
if c.consumerKey == "" || c.accessToken == "" {
|
|
||||||
return fmt.Errorf("pocket: missing consumer key or access token")
|
|
||||||
}
|
|
||||||
|
|
||||||
apiEndpoint := "https://getpocket.com/v3/add"
|
|
||||||
requestBody, err := json.Marshal(&createItemRequest{
|
|
||||||
AccessToken: c.accessToken,
|
|
||||||
ConsumerKey: c.consumerKey,
|
|
||||||
Title: entryTitle,
|
|
||||||
URL: entryURL,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("pocket: unable to encode request body: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
request, err := http.NewRequest(http.MethodPost, apiEndpoint, bytes.NewReader(requestBody))
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("pocket: unable to create request: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
request.Header.Set("Content-Type", "application/json")
|
|
||||||
request.Header.Set("User-Agent", "Miniflux/"+version.Version)
|
|
||||||
|
|
||||||
httpClient := &http.Client{Timeout: defaultClientTimeout}
|
|
||||||
response, err := httpClient.Do(request)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("pocket: unable to send request: %v", err)
|
|
||||||
}
|
|
||||||
defer response.Body.Close()
|
|
||||||
|
|
||||||
if response.StatusCode >= 400 {
|
|
||||||
return fmt.Errorf("pocket: unable to create item: url=%s status=%d", apiEndpoint, response.StatusCode)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type createItemRequest struct {
|
|
||||||
AccessToken string `json:"access_token"`
|
|
||||||
ConsumerKey string `json:"consumer_key"`
|
|
||||||
Title string `json:"title,omitempty"`
|
|
||||||
URL string `json:"url"`
|
|
||||||
}
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "Es gibt keine Artikel, die diesem Tag entsprechen.",
|
"alert.no_tag_entry": "Es gibt keine Artikel, die diesem Tag entsprechen.",
|
||||||
"alert.no_unread_entry": "Es existiert kein ungelesener Artikel.",
|
"alert.no_unread_entry": "Es existiert kein ungelesener Artikel.",
|
||||||
"alert.no_user": "Sie sind der einzige Benutzer.",
|
"alert.no_user": "Sie sind der einzige Benutzer.",
|
||||||
"alert.pocket_linked": "Ihr Pocket-Konto ist jetzt verknüpft!",
|
|
||||||
"alert.prefs_saved": "Einstellungen gespeichert!",
|
"alert.prefs_saved": "Einstellungen gespeichert!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"Sie haben zu viele Aktualisierungen ausgelöst. Bitte warten Sie %d Minute, bevor Sie es erneut versuchen.",
|
"Sie haben zu viele Aktualisierungen ausgelöst. Bitte warten Sie %d Minute, bevor Sie es erneut versuchen.",
|
||||||
|
@ -133,8 +132,6 @@
|
||||||
"error.network_operation": "Miniflux kann die Webseite aufgrund eines Netzwerk-Fehlers nicht erreichen: %v",
|
"error.network_operation": "Miniflux kann die Webseite aufgrund eines Netzwerk-Fehlers nicht erreichen: %v",
|
||||||
"error.network_timeout": "Die Webseite ist zu langsam und die Anfrage ist abgelaufen: %v.",
|
"error.network_timeout": "Die Webseite ist zu langsam und die Anfrage ist abgelaufen: %v.",
|
||||||
"error.password_min_length": "Wenigstens 6 Zeichen müssen genutzt werden.",
|
"error.password_min_length": "Wenigstens 6 Zeichen müssen genutzt werden.",
|
||||||
"error.pocket_access_token": "Zugriffstoken konnte nicht von Pocket abgerufen werden!",
|
|
||||||
"error.pocket_request_token": "Anfrage-Token konnte nicht von Pocket abgerufen werden!",
|
|
||||||
"error.proxy_url_not_empty": "Die Proxy-URL darf nicht leer sein.",
|
"error.proxy_url_not_empty": "Die Proxy-URL darf nicht leer sein.",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Ungültige Blockierregel: Regel #%d hat keinen gültigen Feldnamen (Optionen: %s)",
|
"error.settings_block_rule_fieldname_invalid": "Ungültige Blockierregel: Regel #%d hat keinen gültigen Feldnamen (Optionen: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Ungültige Blockierregel: Das Muster für Regel #%d ist kein zulässiger regulärer Ausdruck",
|
"error.settings_block_rule_invalid_regex": "Ungültige Blockierregel: Das Muster für Regel #%d ist kein zulässiger regulärer Ausdruck",
|
||||||
|
@ -280,10 +277,6 @@
|
||||||
"form.integration.pinboard_bookmark": "Lesezeichen als ungelesen markieren",
|
"form.integration.pinboard_bookmark": "Lesezeichen als ungelesen markieren",
|
||||||
"form.integration.pinboard_tags": "Pinboard-Tags",
|
"form.integration.pinboard_tags": "Pinboard-Tags",
|
||||||
"form.integration.pinboard_token": "Pinboard-API-Token",
|
"form.integration.pinboard_token": "Pinboard-API-Token",
|
||||||
"form.integration.pocket_access_token": "Pocket-Zugangstoken",
|
|
||||||
"form.integration.pocket_activate": "Einträge in Pocket speichern",
|
|
||||||
"form.integration.pocket_connect_link": "Verbinden Sie Ihr Pocket-Konto",
|
|
||||||
"form.integration.pocket_consumer_key": "Pocket-Verbraucher-Schlüssel",
|
|
||||||
"form.integration.pushover_activate": "Einträge an Pushover senden",
|
"form.integration.pushover_activate": "Einträge an Pushover senden",
|
||||||
"form.integration.pushover_device": "Pushovergerät (optional)",
|
"form.integration.pushover_device": "Pushovergerät (optional)",
|
||||||
"form.integration.pushover_prefix": "Pushover-URL-Präfix (optional)",
|
"form.integration.pushover_prefix": "Pushover-URL-Präfix (optional)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "Δεν υπάρχουν αντικείμενα που να ταιριάζουν με αυτή την ετικέτα.",
|
"alert.no_tag_entry": "Δεν υπάρχουν αντικείμενα που να ταιριάζουν με αυτή την ετικέτα.",
|
||||||
"alert.no_unread_entry": "Δεν υπάρχουν μη αναγνωσμένα άρθρα.",
|
"alert.no_unread_entry": "Δεν υπάρχουν μη αναγνωσμένα άρθρα.",
|
||||||
"alert.no_user": "Είστε ο μόνος χρήστης.",
|
"alert.no_user": "Είστε ο μόνος χρήστης.",
|
||||||
"alert.pocket_linked": "Ο λογαριασμός Pocket είναι τώρα συνδεδεμένος!",
|
|
||||||
"alert.prefs_saved": "Οι προτιμήσεις αποθηκεύτηκαν!",
|
"alert.prefs_saved": "Οι προτιμήσεις αποθηκεύτηκαν!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"Έχετε ενεργοποιήσει πάρα πολλές ανανεώσεις ροών. Παρακαλώ περιμένετε %d λεπτό πριν προσπαθήσετε ξανά.",
|
"Έχετε ενεργοποιήσει πάρα πολλές ανανεώσεις ροών. Παρακαλώ περιμένετε %d λεπτό πριν προσπαθήσετε ξανά.",
|
||||||
|
@ -133,8 +132,6 @@
|
||||||
"error.network_operation": "Το Miniflux δεν μπορεί να φτάσει σε αυτόν τον ιστότοπο λόγω σφάλματος δικτύου: %v.",
|
"error.network_operation": "Το Miniflux δεν μπορεί να φτάσει σε αυτόν τον ιστότοπο λόγω σφάλματος δικτύου: %v.",
|
||||||
"error.network_timeout": "Αυτός ο ιστότοπος είναι πολύ αργός και το αίτημα έληξε: %v",
|
"error.network_timeout": "Αυτός ο ιστότοπος είναι πολύ αργός και το αίτημα έληξε: %v",
|
||||||
"error.password_min_length": "Ο κωδικός πρόσβασης πρέπει να έχει τουλάχιστον 6 χαρακτήρες.",
|
"error.password_min_length": "Ο κωδικός πρόσβασης πρέπει να έχει τουλάχιστον 6 χαρακτήρες.",
|
||||||
"error.pocket_access_token": "Δεν είναι δυνατή η λήψη του access token από το Pocket!",
|
|
||||||
"error.pocket_request_token": "Δεν είναι δυνατή η λήψη του request token από το Pocket!",
|
|
||||||
"error.proxy_url_not_empty": "Η διεύθυνση URL του διακομιστή μεσολάβησης δεν μπορεί να είναι κενή.",
|
"error.proxy_url_not_empty": "Η διεύθυνση URL του διακομιστή μεσολάβησης δεν μπορεί να είναι κενή.",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Μη έγκυρος κανόνας αποκλεισμού: ο κανόνας #%d λείπει ένα έγκυρο όνομα πεδίου (Επιλογές: %s)",
|
"error.settings_block_rule_fieldname_invalid": "Μη έγκυρος κανόνας αποκλεισμού: ο κανόνας #%d λείπει ένα έγκυρο όνομα πεδίου (Επιλογές: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Μη έγκυρος κανόνας αποκλεισμού: το μοτίβο του κανόνα #%d δεν είναι έγκυρη κανονική έκφραση",
|
"error.settings_block_rule_invalid_regex": "Μη έγκυρος κανόνας αποκλεισμού: το μοτίβο του κανόνα #%d δεν είναι έγκυρη κανονική έκφραση",
|
||||||
|
@ -280,10 +277,6 @@
|
||||||
"form.integration.pinboard_bookmark": "Σημείωση του σελιδοδείκτη ως μη αναγνωσμένου",
|
"form.integration.pinboard_bookmark": "Σημείωση του σελιδοδείκτη ως μη αναγνωσμένου",
|
||||||
"form.integration.pinboard_tags": "Ετικέτες Pinboard",
|
"form.integration.pinboard_tags": "Ετικέτες Pinboard",
|
||||||
"form.integration.pinboard_token": "Pinboard API Token",
|
"form.integration.pinboard_token": "Pinboard API Token",
|
||||||
"form.integration.pocket_access_token": "Pocket Access Token",
|
|
||||||
"form.integration.pocket_activate": "Αποθήκευση άρθρων στο Pocket",
|
|
||||||
"form.integration.pocket_connect_link": "Συνδέστε τον λογαριασμό Pocket σας",
|
|
||||||
"form.integration.pocket_consumer_key": "Pocket Consumer Key",
|
|
||||||
"form.integration.pushover_activate": "Προώθηση καταχωρήσεων στο Pushover",
|
"form.integration.pushover_activate": "Προώθηση καταχωρήσεων στο Pushover",
|
||||||
"form.integration.pushover_device": "Συσκευή Pushover (προαιρετικό)",
|
"form.integration.pushover_device": "Συσκευή Pushover (προαιρετικό)",
|
||||||
"form.integration.pushover_prefix": "Πρόθεμα διεύθυνσης URL Pushover (προαιρετικό)",
|
"form.integration.pushover_prefix": "Πρόθεμα διεύθυνσης URL Pushover (προαιρετικό)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "There are no entries matching this tag.",
|
"alert.no_tag_entry": "There are no entries matching this tag.",
|
||||||
"alert.no_unread_entry": "There are no unread entries.",
|
"alert.no_unread_entry": "There are no unread entries.",
|
||||||
"alert.no_user": "You are the only user.",
|
"alert.no_user": "You are the only user.",
|
||||||
"alert.pocket_linked": "Your Pocket account is now linked!",
|
|
||||||
"alert.prefs_saved": "Preferences saved!",
|
"alert.prefs_saved": "Preferences saved!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"You have triggered too many feed refreshes. Please wait %d minute before trying again.",
|
"You have triggered too many feed refreshes. Please wait %d minute before trying again.",
|
||||||
|
@ -133,8 +132,6 @@
|
||||||
"error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
|
"error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
|
||||||
"error.network_timeout": "This website is too slow and the request timed out: %v",
|
"error.network_timeout": "This website is too slow and the request timed out: %v",
|
||||||
"error.password_min_length": "The password must have at least 6 characters.",
|
"error.password_min_length": "The password must have at least 6 characters.",
|
||||||
"error.pocket_access_token": "Unable to fetch access token from Pocket!",
|
|
||||||
"error.pocket_request_token": "Unable to fetch request token from Pocket!",
|
|
||||||
"error.proxy_url_not_empty": "The proxy URL cannot be empty.",
|
"error.proxy_url_not_empty": "The proxy URL cannot be empty.",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Invalid Block rule: rule #%d is missing a valid field name (Options: %s)",
|
"error.settings_block_rule_fieldname_invalid": "Invalid Block rule: rule #%d is missing a valid field name (Options: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Invalid Block rule: rule #%d's pattern is not a valid regex",
|
"error.settings_block_rule_invalid_regex": "Invalid Block rule: rule #%d's pattern is not a valid regex",
|
||||||
|
@ -280,10 +277,6 @@
|
||||||
"form.integration.pinboard_bookmark": "Mark bookmark as unread",
|
"form.integration.pinboard_bookmark": "Mark bookmark as unread",
|
||||||
"form.integration.pinboard_tags": "Pinboard Tags",
|
"form.integration.pinboard_tags": "Pinboard Tags",
|
||||||
"form.integration.pinboard_token": "Pinboard API Token",
|
"form.integration.pinboard_token": "Pinboard API Token",
|
||||||
"form.integration.pocket_access_token": "Pocket Access Token",
|
|
||||||
"form.integration.pocket_activate": "Save entries to Pocket",
|
|
||||||
"form.integration.pocket_connect_link": "Connect your Pocket account",
|
|
||||||
"form.integration.pocket_consumer_key": "Pocket Consumer Key",
|
|
||||||
"form.integration.pushover_activate": "Push entries to Pushover",
|
"form.integration.pushover_activate": "Push entries to Pushover",
|
||||||
"form.integration.pushover_device": "Pushover device (optional)",
|
"form.integration.pushover_device": "Pushover device (optional)",
|
||||||
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "No hay artículos con esta etiqueta.",
|
"alert.no_tag_entry": "No hay artículos con esta etiqueta.",
|
||||||
"alert.no_unread_entry": "No hay artículos sin leer.",
|
"alert.no_unread_entry": "No hay artículos sin leer.",
|
||||||
"alert.no_user": "Eres el único usuario.",
|
"alert.no_user": "Eres el único usuario.",
|
||||||
"alert.pocket_linked": "¡Tu cuenta de Pocket ya está vinculada!",
|
|
||||||
"alert.prefs_saved": "¡Las preferencias se han guardado!",
|
"alert.prefs_saved": "¡Las preferencias se han guardado!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"Has activado demasiadas actualizaciones del feed. Espere %d minuto antes de volver a intentarlo.",
|
"Has activado demasiadas actualizaciones del feed. Espere %d minuto antes de volver a intentarlo.",
|
||||||
|
@ -133,8 +132,6 @@
|
||||||
"error.network_operation": "Miniflux no puede acceder a este sitio web debido a un error de red: %v.",
|
"error.network_operation": "Miniflux no puede acceder a este sitio web debido a un error de red: %v.",
|
||||||
"error.network_timeout": "Este sitio web es demasiado lento y se agotó el tiempo de espera de la solicitud: %v",
|
"error.network_timeout": "Este sitio web es demasiado lento y se agotó el tiempo de espera de la solicitud: %v",
|
||||||
"error.password_min_length": "La contraseña debería tener al menos 6 caracteres.",
|
"error.password_min_length": "La contraseña debería tener al menos 6 caracteres.",
|
||||||
"error.pocket_access_token": "Incapaz de obtener un token de acceso de Pocket!",
|
|
||||||
"error.pocket_request_token": "Incapaz de obtener un token de solicitud de Pocket!",
|
|
||||||
"error.proxy_url_not_empty": "The proxy URL cannot be empty.",
|
"error.proxy_url_not_empty": "The proxy URL cannot be empty.",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Regla de bloqueo no válida: a la regla #%d le falta un nombre de campo válido (Opciones: %s)",
|
"error.settings_block_rule_fieldname_invalid": "Regla de bloqueo no válida: a la regla #%d le falta un nombre de campo válido (Opciones: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Regla de bloqueo no válida: el patrón de la regla #%d no es una expresión regular válida",
|
"error.settings_block_rule_invalid_regex": "Regla de bloqueo no válida: el patrón de la regla #%d no es una expresión regular válida",
|
||||||
|
@ -280,10 +277,6 @@
|
||||||
"form.integration.pinboard_bookmark": "Marcar marcador como no leído",
|
"form.integration.pinboard_bookmark": "Marcar marcador como no leído",
|
||||||
"form.integration.pinboard_tags": "Etiquetas de Pinboard",
|
"form.integration.pinboard_tags": "Etiquetas de Pinboard",
|
||||||
"form.integration.pinboard_token": "Token de API de Pinboard",
|
"form.integration.pinboard_token": "Token de API de Pinboard",
|
||||||
"form.integration.pocket_access_token": "Token de acceso de Pocket",
|
|
||||||
"form.integration.pocket_activate": "Enviar artículos a Pocket",
|
|
||||||
"form.integration.pocket_connect_link": "Conectar a la cuenta de Pocket",
|
|
||||||
"form.integration.pocket_consumer_key": "Clave del consumidor de Pocket",
|
|
||||||
"form.integration.pushover_activate": "Enviar artículos a Pushover",
|
"form.integration.pushover_activate": "Enviar artículos a Pushover",
|
||||||
"form.integration.pushover_device": "Dispositivo Pushover (opcional)",
|
"form.integration.pushover_device": "Dispositivo Pushover (opcional)",
|
||||||
"form.integration.pushover_prefix": "Prefijo de URL de Pushover (opcional)",
|
"form.integration.pushover_prefix": "Prefijo de URL de Pushover (opcional)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "Tätä tunnistetta vastaavia merkintöjä ei ole.",
|
"alert.no_tag_entry": "Tätä tunnistetta vastaavia merkintöjä ei ole.",
|
||||||
"alert.no_unread_entry": "Ei ole lukemattomia artikkeleita.",
|
"alert.no_unread_entry": "Ei ole lukemattomia artikkeleita.",
|
||||||
"alert.no_user": "Olet ainoa käyttäjä.",
|
"alert.no_user": "Olet ainoa käyttäjä.",
|
||||||
"alert.pocket_linked": "Pocket-tilisi on nyt linkitetty!",
|
|
||||||
"alert.prefs_saved": "Asetukset tallennettu!",
|
"alert.prefs_saved": "Asetukset tallennettu!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"Olet käynnistänyt liian monta syötteen päivitystä. Odota %d minuutti ennen kuin yrität uudelleen.",
|
"Olet käynnistänyt liian monta syötteen päivitystä. Odota %d minuutti ennen kuin yrität uudelleen.",
|
||||||
|
@ -133,8 +132,6 @@
|
||||||
"error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
|
"error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
|
||||||
"error.network_timeout": "This website is too slow and the request timed out: %v",
|
"error.network_timeout": "This website is too slow and the request timed out: %v",
|
||||||
"error.password_min_length": "Salasanassa on oltava vähintään 6 merkkiä.",
|
"error.password_min_length": "Salasanassa on oltava vähintään 6 merkkiä.",
|
||||||
"error.pocket_access_token": "Unable to fetch access token from Pocket!",
|
|
||||||
"error.pocket_request_token": "Unable to fetch request token from Pocket!",
|
|
||||||
"error.proxy_url_not_empty": "The proxy URL cannot be empty.",
|
"error.proxy_url_not_empty": "The proxy URL cannot be empty.",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Invalid Block rule: rule #%d is missing a valid field name (Options: %s)",
|
"error.settings_block_rule_fieldname_invalid": "Invalid Block rule: rule #%d is missing a valid field name (Options: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Invalid Block rule: rule #%d's pattern is not a valid regex",
|
"error.settings_block_rule_invalid_regex": "Invalid Block rule: rule #%d's pattern is not a valid regex",
|
||||||
|
@ -280,10 +277,6 @@
|
||||||
"form.integration.pinboard_bookmark": "Merkitse kirjanmerkki lukemattomaksi",
|
"form.integration.pinboard_bookmark": "Merkitse kirjanmerkki lukemattomaksi",
|
||||||
"form.integration.pinboard_tags": "Pinboard-tagit",
|
"form.integration.pinboard_tags": "Pinboard-tagit",
|
||||||
"form.integration.pinboard_token": "Pinboard API-tunnus",
|
"form.integration.pinboard_token": "Pinboard API-tunnus",
|
||||||
"form.integration.pocket_access_token": "Pocket-käyttöoikeustunnus",
|
|
||||||
"form.integration.pocket_activate": "Tallenna artikkelit Pocketiin",
|
|
||||||
"form.integration.pocket_connect_link": "Yhdistä Pocket-tilisi",
|
|
||||||
"form.integration.pocket_consumer_key": "Pocket Consumer Key",
|
|
||||||
"form.integration.pushover_activate": "Push entries to Pushover",
|
"form.integration.pushover_activate": "Push entries to Pushover",
|
||||||
"form.integration.pushover_device": "Pushover device (optional)",
|
"form.integration.pushover_device": "Pushover device (optional)",
|
||||||
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "Il n'y a aucun article correspondant à ce tag.",
|
"alert.no_tag_entry": "Il n'y a aucun article correspondant à ce tag.",
|
||||||
"alert.no_unread_entry": "Il n'y a rien de nouveau à lire.",
|
"alert.no_unread_entry": "Il n'y a rien de nouveau à lire.",
|
||||||
"alert.no_user": "Vous êtes le seul utilisateur.",
|
"alert.no_user": "Vous êtes le seul utilisateur.",
|
||||||
"alert.pocket_linked": "Votre compte Pocket est maintenant connecté !",
|
|
||||||
"alert.prefs_saved": "Préférences sauvegardées !",
|
"alert.prefs_saved": "Préférences sauvegardées !",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"Vous avez déclenché trop d'actualisations de flux. Veuillez attendre %d minute avant de réessayer.",
|
"Vous avez déclenché trop d'actualisations de flux. Veuillez attendre %d minute avant de réessayer.",
|
||||||
|
@ -133,8 +132,6 @@
|
||||||
"error.network_operation": "Miniflux n'est pas en mesure de se connecter à ce site web à cause d'un problème réseau : %v.",
|
"error.network_operation": "Miniflux n'est pas en mesure de se connecter à ce site web à cause d'un problème réseau : %v.",
|
||||||
"error.network_timeout": "Ce site web est trop lent à répondre : %v.",
|
"error.network_timeout": "Ce site web est trop lent à répondre : %v.",
|
||||||
"error.password_min_length": "Vous devez utiliser au moins 6 caractères pour le mot de passe.",
|
"error.password_min_length": "Vous devez utiliser au moins 6 caractères pour le mot de passe.",
|
||||||
"error.pocket_access_token": "Impossible de récupérer le jeton d'accès depuis Pocket !",
|
|
||||||
"error.pocket_request_token": "Impossible de récupérer le jeton d'accès depuis Pocket !",
|
|
||||||
"error.proxy_url_not_empty": "L'URL du proxy ne peut pas être vide.",
|
"error.proxy_url_not_empty": "L'URL du proxy ne peut pas être vide.",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Règle de blocage invalide : la règle n°%d ne contient pas un nom de champ valide (Options : %s)",
|
"error.settings_block_rule_fieldname_invalid": "Règle de blocage invalide : la règle n°%d ne contient pas un nom de champ valide (Options : %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Règle de blocage invalide : le motif de la règle n°%d n'est pas une expression régulière valide",
|
"error.settings_block_rule_invalid_regex": "Règle de blocage invalide : le motif de la règle n°%d n'est pas une expression régulière valide",
|
||||||
|
@ -280,10 +277,6 @@
|
||||||
"form.integration.pinboard_bookmark": "Marquer le lien comme non lu",
|
"form.integration.pinboard_bookmark": "Marquer le lien comme non lu",
|
||||||
"form.integration.pinboard_tags": "Libellés de Pinboard",
|
"form.integration.pinboard_tags": "Libellés de Pinboard",
|
||||||
"form.integration.pinboard_token": "Jeton de sécurité de l'API de Pinboard",
|
"form.integration.pinboard_token": "Jeton de sécurité de l'API de Pinboard",
|
||||||
"form.integration.pocket_access_token": "Jeton d'accès de l'API de Pocket",
|
|
||||||
"form.integration.pocket_activate": "Sauvegarder les articles vers Pocket",
|
|
||||||
"form.integration.pocket_connect_link": "Connectez votre compte Pocket",
|
|
||||||
"form.integration.pocket_consumer_key": "Clé de l'API de Pocket",
|
|
||||||
"form.integration.pushover_activate": "Envoyer les articles vers Pushover",
|
"form.integration.pushover_activate": "Envoyer les articles vers Pushover",
|
||||||
"form.integration.pushover_device": "Nom de l'appareil Pushover (facultatif)",
|
"form.integration.pushover_device": "Nom de l'appareil Pushover (facultatif)",
|
||||||
"form.integration.pushover_prefix": "URL de préfixe Pushover (facultatif)",
|
"form.integration.pushover_prefix": "URL de préfixe Pushover (facultatif)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "इस टैग से मेल खाती कोई प्रविष्टियाँ नहीं हैं।",
|
"alert.no_tag_entry": "इस टैग से मेल खाती कोई प्रविष्टियाँ नहीं हैं।",
|
||||||
"alert.no_unread_entry": "कोई अपठित वस्तुत नहीं है।",
|
"alert.no_unread_entry": "कोई अपठित वस्तुत नहीं है।",
|
||||||
"alert.no_user": "आप एकमात्र उपयोगकर्ता हैं।",
|
"alert.no_user": "आप एकमात्र उपयोगकर्ता हैं।",
|
||||||
"alert.pocket_linked": "आपका पॉकेट खाता अब लिंक हो गया है!",
|
|
||||||
"alert.prefs_saved": "प्राथमिकताएं सहेजी गईं!",
|
"alert.prefs_saved": "प्राथमिकताएं सहेजी गईं!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"आपने बहुत अधिक फ़ीड ताज़ा करने की प्रक्रिया शुरू कर दी है। कृपया पुनः प्रयास करने से पहले %d मिनट प्रतीक्षा करें।",
|
"आपने बहुत अधिक फ़ीड ताज़ा करने की प्रक्रिया शुरू कर दी है। कृपया पुनः प्रयास करने से पहले %d मिनट प्रतीक्षा करें।",
|
||||||
|
@ -133,8 +132,6 @@
|
||||||
"error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
|
"error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.",
|
||||||
"error.network_timeout": "This website is too slow and the request timed out: %v",
|
"error.network_timeout": "This website is too slow and the request timed out: %v",
|
||||||
"error.password_min_length": "पासवर्ड में कम से कम 6 अक्षर होने चाहिए।",
|
"error.password_min_length": "पासवर्ड में कम से कम 6 अक्षर होने चाहिए।",
|
||||||
"error.pocket_access_token": "पॉकेट से एक्सेस टोकन प्राप्त करने में असमर्थ!",
|
|
||||||
"error.pocket_request_token": "पॉकेट से अनुरोध टोकन लाने में असमर्थ!",
|
|
||||||
"error.proxy_url_not_empty": "The proxy URL cannot be empty.",
|
"error.proxy_url_not_empty": "The proxy URL cannot be empty.",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Invalid Block rule: rule #%d is missing a valid field name (Options: %s)",
|
"error.settings_block_rule_fieldname_invalid": "Invalid Block rule: rule #%d is missing a valid field name (Options: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Invalid Block rule: rule #%d's pattern is not a valid regex",
|
"error.settings_block_rule_invalid_regex": "Invalid Block rule: rule #%d's pattern is not a valid regex",
|
||||||
|
@ -280,10 +277,6 @@
|
||||||
"form.integration.pinboard_bookmark": "बुकमार्क को अपठित के रूप में चिह्नित करें",
|
"form.integration.pinboard_bookmark": "बुकमार्क को अपठित के रूप में चिह्नित करें",
|
||||||
"form.integration.pinboard_tags": "पिनबोर्ड टैग",
|
"form.integration.pinboard_tags": "पिनबोर्ड टैग",
|
||||||
"form.integration.pinboard_token": "पिनबोर्ड एपीआई टोकन",
|
"form.integration.pinboard_token": "पिनबोर्ड एपीआई टोकन",
|
||||||
"form.integration.pocket_access_token": "पॉकेट एक्सेस टोकन",
|
|
||||||
"form.integration.pocket_activate": "विषय-कविता को पॉकेट में सहेजें",
|
|
||||||
"form.integration.pocket_connect_link": "अपना पॉकेट खाता कनेक्ट करें",
|
|
||||||
"form.integration.pocket_consumer_key": "पॉकेट उपभोक्ता कुंजी",
|
|
||||||
"form.integration.pushover_activate": "Push entries to Pushover",
|
"form.integration.pushover_activate": "Push entries to Pushover",
|
||||||
"form.integration.pushover_device": "Pushover device (optional)",
|
"form.integration.pushover_device": "Pushover device (optional)",
|
||||||
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "Tidak ada entri yang cocok dengan tag ini.",
|
"alert.no_tag_entry": "Tidak ada entri yang cocok dengan tag ini.",
|
||||||
"alert.no_unread_entry": "Belum ada artikel yang dibaca.",
|
"alert.no_unread_entry": "Belum ada artikel yang dibaca.",
|
||||||
"alert.no_user": "Anda adalah satu-satunya pengguna.",
|
"alert.no_user": "Anda adalah satu-satunya pengguna.",
|
||||||
"alert.pocket_linked": "Akun Pocket Anda sudah terhubung!",
|
|
||||||
"alert.prefs_saved": "Preferensi disimpan!",
|
"alert.prefs_saved": "Preferensi disimpan!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"Anda terlalu banyak menyegarkan umpan. Mohon tunggu %d menit sebelum mencoba lagi."
|
"Anda terlalu banyak menyegarkan umpan. Mohon tunggu %d menit sebelum mencoba lagi."
|
||||||
|
@ -130,8 +129,6 @@
|
||||||
"error.network_operation": "Miniflux tidak dapat menjangkau situs ini dikarenakan galat jaringan: %v.",
|
"error.network_operation": "Miniflux tidak dapat menjangkau situs ini dikarenakan galat jaringan: %v.",
|
||||||
"error.network_timeout": "Situs ini terlalu lambat dan permintaan ke situs terlalu lama: %v",
|
"error.network_timeout": "Situs ini terlalu lambat dan permintaan ke situs terlalu lama: %v",
|
||||||
"error.password_min_length": "Kata sandi harus memiliki setidaknya 6 karakter.",
|
"error.password_min_length": "Kata sandi harus memiliki setidaknya 6 karakter.",
|
||||||
"error.pocket_access_token": "Tidak bisa mendapatkan token akses dari Pocket!",
|
|
||||||
"error.pocket_request_token": "Tidak bisa mendapatkan token permintaan dari Pocket!",
|
|
||||||
"error.proxy_url_not_empty": "URL proksi tidak boleh kosong.",
|
"error.proxy_url_not_empty": "URL proksi tidak boleh kosong.",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Aturan blokir tidak valid: aturan #%d tidak mempunyai nama bidang yang valid (Opsi: %s)",
|
"error.settings_block_rule_fieldname_invalid": "Aturan blokir tidak valid: aturan #%d tidak mempunyai nama bidang yang valid (Opsi: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Aturan blokir tidak valid: aturan pola #%d bukan ekspresi regular (regex) yang valid",
|
"error.settings_block_rule_invalid_regex": "Aturan blokir tidak valid: aturan pola #%d bukan ekspresi regular (regex) yang valid",
|
||||||
|
@ -277,10 +274,6 @@
|
||||||
"form.integration.pinboard_bookmark": "Tandai markah sebagai belum dibaca",
|
"form.integration.pinboard_bookmark": "Tandai markah sebagai belum dibaca",
|
||||||
"form.integration.pinboard_tags": "Tanda di Pinboard",
|
"form.integration.pinboard_tags": "Tanda di Pinboard",
|
||||||
"form.integration.pinboard_token": "Token API Pinboard",
|
"form.integration.pinboard_token": "Token API Pinboard",
|
||||||
"form.integration.pocket_access_token": "Token Akses Pocket",
|
|
||||||
"form.integration.pocket_activate": "Simpan artikel ke Pocket",
|
|
||||||
"form.integration.pocket_connect_link": "Hubungkan akun Pocket Anda",
|
|
||||||
"form.integration.pocket_consumer_key": "Kunci Pelanggan Pocket",
|
|
||||||
"form.integration.pushover_activate": "Kirim artikel ke Pushover",
|
"form.integration.pushover_activate": "Kirim artikel ke Pushover",
|
||||||
"form.integration.pushover_device": "Perangkat Pushover (opsional)",
|
"form.integration.pushover_device": "Perangkat Pushover (opsional)",
|
||||||
"form.integration.pushover_prefix": "Prefiks URL Pushover (opsional)",
|
"form.integration.pushover_prefix": "Prefiks URL Pushover (opsional)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "Non ci sono voci corrispondenti a questo tag.",
|
"alert.no_tag_entry": "Non ci sono voci corrispondenti a questo tag.",
|
||||||
"alert.no_unread_entry": "Nessun articolo da leggere.",
|
"alert.no_unread_entry": "Nessun articolo da leggere.",
|
||||||
"alert.no_user": "Tu sei l'unico utente.",
|
"alert.no_user": "Tu sei l'unico utente.",
|
||||||
"alert.pocket_linked": "Il tuo account Pocket ora è collegato!",
|
|
||||||
"alert.prefs_saved": "Preferenze salvate!",
|
"alert.prefs_saved": "Preferenze salvate!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"Hai richiesto troppi aggiornamenti dei feed. Attendi %d minuto prima di riprovare.",
|
"Hai richiesto troppi aggiornamenti dei feed. Attendi %d minuto prima di riprovare.",
|
||||||
|
@ -133,8 +132,6 @@
|
||||||
"error.network_operation": "Miniflux non riesce a raggiungere questo sito web a causa di un errore di rete: %v.",
|
"error.network_operation": "Miniflux non riesce a raggiungere questo sito web a causa di un errore di rete: %v.",
|
||||||
"error.network_timeout": "Questo sito web è troppo lento e la richiesta è scaduta: %v",
|
"error.network_timeout": "Questo sito web è troppo lento e la richiesta è scaduta: %v",
|
||||||
"error.password_min_length": "La password deve contenere almeno 6 caratteri.",
|
"error.password_min_length": "La password deve contenere almeno 6 caratteri.",
|
||||||
"error.pocket_access_token": "Non sono riuscito ad ottenere l'access token da Pocket!",
|
|
||||||
"error.pocket_request_token": "Non sono riuscito ad ottenere il request token da Pocket!",
|
|
||||||
"error.proxy_url_not_empty": "L'URL del proxy non può essere vuoto.",
|
"error.proxy_url_not_empty": "L'URL del proxy non può essere vuoto.",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Invalid Block rule: rule #%d is missing a valid field name (Options: %s)",
|
"error.settings_block_rule_fieldname_invalid": "Invalid Block rule: rule #%d is missing a valid field name (Options: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Invalid Block rule: rule #%d's pattern is not a valid regex",
|
"error.settings_block_rule_invalid_regex": "Invalid Block rule: rule #%d's pattern is not a valid regex",
|
||||||
|
@ -280,10 +277,6 @@
|
||||||
"form.integration.pinboard_bookmark": "Segna i preferiti come non letti",
|
"form.integration.pinboard_bookmark": "Segna i preferiti come non letti",
|
||||||
"form.integration.pinboard_tags": "Tag di Pinboard",
|
"form.integration.pinboard_tags": "Tag di Pinboard",
|
||||||
"form.integration.pinboard_token": "Token dell'API di Pinboard",
|
"form.integration.pinboard_token": "Token dell'API di Pinboard",
|
||||||
"form.integration.pocket_access_token": "Access token dell'account Pocket",
|
|
||||||
"form.integration.pocket_activate": "Salva gli articoli su Pocket",
|
|
||||||
"form.integration.pocket_connect_link": "Collega il tuo account Pocket",
|
|
||||||
"form.integration.pocket_consumer_key": "Consumer key dell'account Pocket",
|
|
||||||
"form.integration.pushover_activate": "Push entries to Pushover",
|
"form.integration.pushover_activate": "Push entries to Pushover",
|
||||||
"form.integration.pushover_device": "Pushover device (optional)",
|
"form.integration.pushover_device": "Pushover device (optional)",
|
||||||
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "このタグに一致するエントリーはありません。",
|
"alert.no_tag_entry": "このタグに一致するエントリーはありません。",
|
||||||
"alert.no_unread_entry": "未読の記事はありません。",
|
"alert.no_unread_entry": "未読の記事はありません。",
|
||||||
"alert.no_user": "あなたが唯一のユーザーです。",
|
"alert.no_user": "あなたが唯一のユーザーです。",
|
||||||
"alert.pocket_linked": "Pocket アカウントとリンクされました!",
|
|
||||||
"alert.prefs_saved": "設定情報は保存されました!",
|
"alert.prefs_saved": "設定情報は保存されました!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"フィードの更新を要求しすぎました。%d 分後に再度お試しください。"
|
"フィードの更新を要求しすぎました。%d 分後に再度お試しください。"
|
||||||
|
@ -130,8 +129,6 @@
|
||||||
"error.network_operation": "Miniflux はネットワークエラーのためこのウェブサイトに到達できません: %v.",
|
"error.network_operation": "Miniflux はネットワークエラーのためこのウェブサイトに到達できません: %v.",
|
||||||
"error.network_timeout": "このウェブサイトは応答が遅すぎるためタイムアウトしました: %v",
|
"error.network_timeout": "このウェブサイトは応答が遅すぎるためタイムアウトしました: %v",
|
||||||
"error.password_min_length": "パスワードは6文字以上である必要があります。",
|
"error.password_min_length": "パスワードは6文字以上である必要があります。",
|
||||||
"error.pocket_access_token": "Pocket の access token が取得できません!",
|
|
||||||
"error.pocket_request_token": "Pocket の request token が取得できません!",
|
|
||||||
"error.proxy_url_not_empty": "プロキシURLを空にすることはできません。",
|
"error.proxy_url_not_empty": "プロキシURLを空にすることはできません。",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Invalid Block rule: rule #%d is missing a valid field name (Options: %s)",
|
"error.settings_block_rule_fieldname_invalid": "Invalid Block rule: rule #%d is missing a valid field name (Options: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Invalid Block rule: rule #%d's pattern is not a valid regex",
|
"error.settings_block_rule_invalid_regex": "Invalid Block rule: rule #%d's pattern is not a valid regex",
|
||||||
|
@ -277,10 +274,6 @@
|
||||||
"form.integration.pinboard_bookmark": "ブックマークを未読にする",
|
"form.integration.pinboard_bookmark": "ブックマークを未読にする",
|
||||||
"form.integration.pinboard_tags": "Pinboard の Tag",
|
"form.integration.pinboard_tags": "Pinboard の Tag",
|
||||||
"form.integration.pinboard_token": "Pinboard の API Token",
|
"form.integration.pinboard_token": "Pinboard の API Token",
|
||||||
"form.integration.pocket_access_token": "Pocket の Access Token",
|
|
||||||
"form.integration.pocket_activate": "Pocket に記事を保存する",
|
|
||||||
"form.integration.pocket_connect_link": "Pocket account に接続",
|
|
||||||
"form.integration.pocket_consumer_key": "Pocket の Consumer Key",
|
|
||||||
"form.integration.pushover_activate": "Push entries to Pushover",
|
"form.integration.pushover_activate": "Push entries to Pushover",
|
||||||
"form.integration.pushover_device": "Pushover device (optional)",
|
"form.integration.pushover_device": "Pushover device (optional)",
|
||||||
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "Bô kah chit ê khan-á ū hû-ha̍p ê siau-sit",
|
"alert.no_tag_entry": "Bô kah chit ê khan-á ū hû-ha̍p ê siau-sit",
|
||||||
"alert.no_unread_entry": "Chit-má ah-bô tha̍k kè ê siau-sit",
|
"alert.no_unread_entry": "Chit-má ah-bô tha̍k kè ê siau-sit",
|
||||||
"alert.no_user": "Lí sī ûi-it ê sú-iōng-lâng",
|
"alert.no_user": "Lí sī ûi-it ê sú-iōng-lâng",
|
||||||
"alert.pocket_linked": "Í-keng kā lí ê Pocket kháu-chō kiat chòe-hé--ah!",
|
|
||||||
"alert.prefs_saved": "Siat-tēng í-keng pó-chûn--ah!",
|
"alert.prefs_saved": "Siat-tēng í-keng pó-chûn--ah!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"Lí í-keng ín-khí siuⁿ chōe pái siau-sit lâi-goân ōaⁿ-sin, chhiáⁿ tán-hāu %d hun-cheng āu koh chhì-khòaⁿ-māi."
|
"Lí í-keng ín-khí siuⁿ chōe pái siau-sit lâi-goân ōaⁿ-sin, chhiáⁿ tán-hāu %d hun-cheng āu koh chhì-khòaⁿ-māi."
|
||||||
|
@ -130,8 +129,6 @@
|
||||||
"error.network_operation": "Miniflux bô-hoat-tō͘ liân kàu chit ê bāng-chām, ū khó-lêng sī bāng-lō͘ būn-tôe: %v.",
|
"error.network_operation": "Miniflux bô-hoat-tō͘ liân kàu chit ê bāng-chām, ū khó-lêng sī bāng-lō͘ būn-tôe: %v.",
|
||||||
"error.network_timeout": "Chit ê bāng-chām ê hôe-èng siuⁿ bān, chhéng-kiû chhiau-kè sî-kan: %v.",
|
"error.network_timeout": "Chit ê bāng-chām ê hôe-èng siuⁿ bān, chhéng-kiû chhiau-kè sî-kan: %v.",
|
||||||
"error.password_min_length": "Chhiáⁿ chì-chió ài su-li̍p la̍k ê lī goân.",
|
"error.password_min_length": "Chhiáⁿ chì-chió ài su-li̍p la̍k ê lī goân.",
|
||||||
"error.pocket_access_token": "Bô-hoat-tō͘ ùi Pocket thê tio̍h access token",
|
|
||||||
"error.pocket_request_token": "Bô-hoat-tō͘ ùi Pocket thê tio̍h request token",
|
|
||||||
"error.proxy_url_not_empty": "Proxy URL bōe-sái sī khang--ê.",
|
"error.proxy_url_not_empty": "Proxy URL bōe-sái sī khang--ê.",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Bô-hāu ê hong-só kui-chek: kui-chek #%d khiàm ū-hāu ê lân-ūi miâ (e-sai ê soán-hāng: %s)",
|
"error.settings_block_rule_fieldname_invalid": "Bô-hāu ê hong-só kui-chek: kui-chek #%d khiàm ū-hāu ê lân-ūi miâ (e-sai ê soán-hāng: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Bô-hāu ê hong-só kui-chek: kui-chek #%d ê bô͘-sek m̄ sī ha̍p-hoat ê chiàⁿ-kui piáu-ta̍t sek",
|
"error.settings_block_rule_invalid_regex": "Bô-hāu ê hong-só kui-chek: kui-chek #%d ê bô͘-sek m̄ sī ha̍p-hoat ê chiàⁿ-kui piáu-ta̍t sek",
|
||||||
|
@ -277,10 +274,6 @@
|
||||||
"form.integration.pinboard_bookmark": "Chù chòe ah-bōe tha̍k",
|
"form.integration.pinboard_bookmark": "Chù chòe ah-bōe tha̍k",
|
||||||
"form.integration.pinboard_tags": "Pinboard khan-á",
|
"form.integration.pinboard_tags": "Pinboard khan-á",
|
||||||
"form.integration.pinboard_token": "Pinboard API Token",
|
"form.integration.pinboard_token": "Pinboard API Token",
|
||||||
"form.integration.pocket_access_token": "Pocket token",
|
|
||||||
"form.integration.pocket_activate": "Pó-chûn siau-sit kàu Pocket",
|
|
||||||
"form.integration.pocket_connect_link": "Kah Pocket kháu-chō kiat chòe-hé",
|
|
||||||
"form.integration.pocket_consumer_key": "Pocket sú-iōng-lâng só-sî",
|
|
||||||
"form.integration.pushover_activate": "Pó-chûn siau-sit kàu Pushover",
|
"form.integration.pushover_activate": "Pó-chûn siau-sit kàu Pushover",
|
||||||
"form.integration.pushover_device": "Pushover ki-hì (soán thiⁿ)",
|
"form.integration.pushover_device": "Pushover ki-hì (soán thiⁿ)",
|
||||||
"form.integration.pushover_prefix": "Pushover URL tó͘-bí (soán thiⁿ)",
|
"form.integration.pushover_prefix": "Pushover URL tó͘-bí (soán thiⁿ)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "Er zijn geen artikelen die overeenkomen met deze tag.",
|
"alert.no_tag_entry": "Er zijn geen artikelen die overeenkomen met deze tag.",
|
||||||
"alert.no_unread_entry": "Er zijn geen ongelezen artikelen.",
|
"alert.no_unread_entry": "Er zijn geen ongelezen artikelen.",
|
||||||
"alert.no_user": "Je bent de enige gebruiker.",
|
"alert.no_user": "Je bent de enige gebruiker.",
|
||||||
"alert.pocket_linked": "Jouw Pocket-account is nu gekoppeld!",
|
|
||||||
"alert.prefs_saved": "Instellingen opgeslagen!",
|
"alert.prefs_saved": "Instellingen opgeslagen!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"Je hebt te veel feed-vernieuwingen getriggered. Wacht aub %d minuut voor opnieuw proberen.",
|
"Je hebt te veel feed-vernieuwingen getriggered. Wacht aub %d minuut voor opnieuw proberen.",
|
||||||
|
@ -133,8 +132,6 @@
|
||||||
"error.network_operation": "Miniflux kan deze website niet bereiken vanwege een netwerkfout: %v.",
|
"error.network_operation": "Miniflux kan deze website niet bereiken vanwege een netwerkfout: %v.",
|
||||||
"error.network_timeout": "Deze website is te traag en de aanvraag gaf timeout: %v",
|
"error.network_timeout": "Deze website is te traag en de aanvraag gaf timeout: %v",
|
||||||
"error.password_min_length": "Minimaal 6 tekens gebruiken.",
|
"error.password_min_length": "Minimaal 6 tekens gebruiken.",
|
||||||
"error.pocket_access_token": "Kon geen toegangstoken ophalen van Pocket!",
|
|
||||||
"error.pocket_request_token": "Kon geen aanvraagtoken ophalen van Pocket!",
|
|
||||||
"error.proxy_url_not_empty": "De proxy-URL mag niet leeg zijn.",
|
"error.proxy_url_not_empty": "De proxy-URL mag niet leeg zijn.",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Ongeldige blokkeerregel: regel #%d mist een geldige veldnaam (Opties: %s)",
|
"error.settings_block_rule_fieldname_invalid": "Ongeldige blokkeerregel: regel #%d mist een geldige veldnaam (Opties: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Ongeldige blokkeerregel: het patroon van regel #%d is geen geldige regex",
|
"error.settings_block_rule_invalid_regex": "Ongeldige blokkeerregel: het patroon van regel #%d is geen geldige regex",
|
||||||
|
@ -280,10 +277,6 @@
|
||||||
"form.integration.pinboard_bookmark": "Markeer favoriet als ongelezen",
|
"form.integration.pinboard_bookmark": "Markeer favoriet als ongelezen",
|
||||||
"form.integration.pinboard_tags": "Pinboard tags",
|
"form.integration.pinboard_tags": "Pinboard tags",
|
||||||
"form.integration.pinboard_token": "Pinboard API token",
|
"form.integration.pinboard_token": "Pinboard API token",
|
||||||
"form.integration.pocket_access_token": "Pocket Access Token",
|
|
||||||
"form.integration.pocket_activate": "Artikelen opslaan in Pocket",
|
|
||||||
"form.integration.pocket_connect_link": "Verbind je Pocket-account",
|
|
||||||
"form.integration.pocket_consumer_key": "Pocket Consumer Key",
|
|
||||||
"form.integration.pushover_activate": "Push entries to Pushover",
|
"form.integration.pushover_activate": "Push entries to Pushover",
|
||||||
"form.integration.pushover_device": "Pushover device (optional)",
|
"form.integration.pushover_device": "Pushover device (optional)",
|
||||||
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "Brak wpisów pasujących do tego znacznika.",
|
"alert.no_tag_entry": "Brak wpisów pasujących do tego znacznika.",
|
||||||
"alert.no_unread_entry": "Nie ma żadnych nieprzeczytanych wpisów.",
|
"alert.no_unread_entry": "Nie ma żadnych nieprzeczytanych wpisów.",
|
||||||
"alert.no_user": "Jesteś jedynym użytkownikiem.",
|
"alert.no_user": "Jesteś jedynym użytkownikiem.",
|
||||||
"alert.pocket_linked": "Twoje konto Pocket jest teraz połączone!",
|
|
||||||
"alert.prefs_saved": "Ustawienia zapisane!",
|
"alert.prefs_saved": "Ustawienia zapisane!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"Wykonano zbyt wiele odświeżeń kanału. Poczekaj %d minutę przed ponowną próbą.",
|
"Wykonano zbyt wiele odświeżeń kanału. Poczekaj %d minutę przed ponowną próbą.",
|
||||||
|
@ -136,8 +135,6 @@
|
||||||
"error.network_operation": "Miniflux nie może połączyć się z tą witryną z powodu błędu sieci: %v.",
|
"error.network_operation": "Miniflux nie może połączyć się z tą witryną z powodu błędu sieci: %v.",
|
||||||
"error.network_timeout": "Ta witryna internetowa jest zbyt wolna i upłynął limit czasu żądania: %v",
|
"error.network_timeout": "Ta witryna internetowa jest zbyt wolna i upłynął limit czasu żądania: %v",
|
||||||
"error.password_min_length": "Musisz użyć co najmniej 6 znaków.",
|
"error.password_min_length": "Musisz użyć co najmniej 6 znaków.",
|
||||||
"error.pocket_access_token": "Nie można pobrać tokena dostępu z Pocket!",
|
|
||||||
"error.pocket_request_token": "Nie można pobrać tokena żądania z Pocket!",
|
|
||||||
"error.proxy_url_not_empty": "Adres URL serwera proxy nie może być pusty.",
|
"error.proxy_url_not_empty": "Adres URL serwera proxy nie może być pusty.",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Nieprawidłowa reguła blokowania: w regule #%d brakuje prawidłowej nazwy pola (opcje: %s)",
|
"error.settings_block_rule_fieldname_invalid": "Nieprawidłowa reguła blokowania: w regule #%d brakuje prawidłowej nazwy pola (opcje: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Nieprawidłowa reguła blokowania: wzór reguły #%d nie jest prawidłowym wyrażeniem regularnym",
|
"error.settings_block_rule_invalid_regex": "Nieprawidłowa reguła blokowania: wzór reguły #%d nie jest prawidłowym wyrażeniem regularnym",
|
||||||
|
@ -283,10 +280,6 @@
|
||||||
"form.integration.pinboard_bookmark": "Zaznacz zakładkę jako nieprzeczytaną",
|
"form.integration.pinboard_bookmark": "Zaznacz zakładkę jako nieprzeczytaną",
|
||||||
"form.integration.pinboard_tags": "Znaczniki Pinboard",
|
"form.integration.pinboard_tags": "Znaczniki Pinboard",
|
||||||
"form.integration.pinboard_token": "Token API do Pinboard",
|
"form.integration.pinboard_token": "Token API do Pinboard",
|
||||||
"form.integration.pocket_access_token": "Token dostępu do Pocket",
|
|
||||||
"form.integration.pocket_activate": "Zapisuj wpisy w Pocket",
|
|
||||||
"form.integration.pocket_connect_link": "Połącz swoje konto Pocket",
|
|
||||||
"form.integration.pocket_consumer_key": "Klucz klienta do Pocket",
|
|
||||||
"form.integration.pushover_activate": "Prześlij wpisy do Pushover",
|
"form.integration.pushover_activate": "Prześlij wpisy do Pushover",
|
||||||
"form.integration.pushover_device": "Urządzenie Pushover (opcjonalne)",
|
"form.integration.pushover_device": "Urządzenie Pushover (opcjonalne)",
|
||||||
"form.integration.pushover_prefix": "Prefiks adresu URL Pushover (opcjonalny)",
|
"form.integration.pushover_prefix": "Prefiks adresu URL Pushover (opcjonalny)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "Não há itens que correspondam a esta etiqueta.",
|
"alert.no_tag_entry": "Não há itens que correspondam a esta etiqueta.",
|
||||||
"alert.no_unread_entry": "Não há itens não lidos.",
|
"alert.no_unread_entry": "Não há itens não lidos.",
|
||||||
"alert.no_user": "Você é o único usuário.",
|
"alert.no_user": "Você é o único usuário.",
|
||||||
"alert.pocket_linked": "Sua conta do Pocket está vinculada!",
|
|
||||||
"alert.prefs_saved": "Suas preferências foram salvas!",
|
"alert.prefs_saved": "Suas preferências foram salvas!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"Você acionou muitas atualizações de fontes. Por favor, aguarde %d minuto antes de tentar novamente.",
|
"Você acionou muitas atualizações de fontes. Por favor, aguarde %d minuto antes de tentar novamente.",
|
||||||
|
@ -133,8 +132,6 @@
|
||||||
"error.network_operation": "O Miniflux não conseguiu acessar este site devido a um erro de rede: %v.",
|
"error.network_operation": "O Miniflux não conseguiu acessar este site devido a um erro de rede: %v.",
|
||||||
"error.network_timeout": "Este site está muito lento e a solicitação expirou: %v",
|
"error.network_timeout": "Este site está muito lento e a solicitação expirou: %v",
|
||||||
"error.password_min_length": "A senha deve ter no mínimo 6 caracteres.",
|
"error.password_min_length": "A senha deve ter no mínimo 6 caracteres.",
|
||||||
"error.pocket_access_token": "Não foi possível obter um token de acesso no Pocket!",
|
|
||||||
"error.pocket_request_token": "Não foi possível obter um pedido de token no Pocket!",
|
|
||||||
"error.proxy_url_not_empty": "A URL do proxy não pode estar vazia.",
|
"error.proxy_url_not_empty": "A URL do proxy não pode estar vazia.",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Regra de bloqueio inválida: a regra #%d está sem um nome de campo válido (Opções: %s)",
|
"error.settings_block_rule_fieldname_invalid": "Regra de bloqueio inválida: a regra #%d está sem um nome de campo válido (Opções: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Regra de bloqueio inválida: o padrão da regra #%d não é uma expressão regular válida",
|
"error.settings_block_rule_invalid_regex": "Regra de bloqueio inválida: o padrão da regra #%d não é uma expressão regular válida",
|
||||||
|
@ -280,10 +277,6 @@
|
||||||
"form.integration.pinboard_bookmark": "Salvar marcador como não lido",
|
"form.integration.pinboard_bookmark": "Salvar marcador como não lido",
|
||||||
"form.integration.pinboard_tags": "Etiquetas (tags) do Pinboard",
|
"form.integration.pinboard_tags": "Etiquetas (tags) do Pinboard",
|
||||||
"form.integration.pinboard_token": "Token de API do Pinboard",
|
"form.integration.pinboard_token": "Token de API do Pinboard",
|
||||||
"form.integration.pocket_access_token": "Token de acesso do Pocket",
|
|
||||||
"form.integration.pocket_activate": "Salvar itens no Pocket",
|
|
||||||
"form.integration.pocket_connect_link": "Conectar a conta do Pocket",
|
|
||||||
"form.integration.pocket_consumer_key": "Chave de consumo (Consumer Key) do Pocket",
|
|
||||||
"form.integration.pushover_activate": "Enviar itens para o Pushover",
|
"form.integration.pushover_activate": "Enviar itens para o Pushover",
|
||||||
"form.integration.pushover_device": "Dispositivo Pushover (opcional)",
|
"form.integration.pushover_device": "Dispositivo Pushover (opcional)",
|
||||||
"form.integration.pushover_prefix": "Prefixo da URL do Pushover (opcional)",
|
"form.integration.pushover_prefix": "Prefixo da URL do Pushover (opcional)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "Nu sunt înregistrări pentru această etichetă.",
|
"alert.no_tag_entry": "Nu sunt înregistrări pentru această etichetă.",
|
||||||
"alert.no_unread_entry": "Nu sunt intrări necitite.",
|
"alert.no_unread_entry": "Nu sunt intrări necitite.",
|
||||||
"alert.no_user": "Sunteți singurul utilizator.",
|
"alert.no_user": "Sunteți singurul utilizator.",
|
||||||
"alert.pocket_linked": "Contul dvs. Pocket este atașat!",
|
|
||||||
"alert.prefs_saved": "Preferințe salvate!",
|
"alert.prefs_saved": "Preferințe salvate!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"Ați activat actualizarea a prea multe fluxuri de informații. Vă rog să așteptați %d minut înainte de a reîncerca.",
|
"Ați activat actualizarea a prea multe fluxuri de informații. Vă rog să așteptați %d minut înainte de a reîncerca.",
|
||||||
|
@ -136,8 +135,6 @@
|
||||||
"error.network_operation": "Miniflux nu poate ajunge la acest site din cauza unei erori de rețea: %v.",
|
"error.network_operation": "Miniflux nu poate ajunge la acest site din cauza unei erori de rețea: %v.",
|
||||||
"error.network_timeout": "Acest site web este prea lent și conexiunea nu s-a realizat: %v",
|
"error.network_timeout": "Acest site web este prea lent și conexiunea nu s-a realizat: %v",
|
||||||
"error.password_min_length": "Parola trebuie să aibă cel puțin 6 caractere.",
|
"error.password_min_length": "Parola trebuie să aibă cel puțin 6 caractere.",
|
||||||
"error.pocket_access_token": "Nu poate obține token-ul de acces de la Pocket!",
|
|
||||||
"error.pocket_request_token": "Nu poate obține token-ul solicitat de la Pocket!",
|
|
||||||
"error.proxy_url_not_empty": "URL-ul proxy nu poate fi gol.",
|
"error.proxy_url_not_empty": "URL-ul proxy nu poate fi gol.",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Regulă de bloc invalidă: regulii #%d îi lipsește un nume valid de câmp (Opțiuni: %s)",
|
"error.settings_block_rule_fieldname_invalid": "Regulă de bloc invalidă: regulii #%d îi lipsește un nume valid de câmp (Opțiuni: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Regulă de bloc invalidă: modelul regulii #%d's nu este regex valid",
|
"error.settings_block_rule_invalid_regex": "Regulă de bloc invalidă: modelul regulii #%d's nu este regex valid",
|
||||||
|
@ -283,10 +280,6 @@
|
||||||
"form.integration.pinboard_bookmark": "Marchează bookmark ca necitit",
|
"form.integration.pinboard_bookmark": "Marchează bookmark ca necitit",
|
||||||
"form.integration.pinboard_tags": "Etichete Pinboard",
|
"form.integration.pinboard_tags": "Etichete Pinboard",
|
||||||
"form.integration.pinboard_token": "Token API Pinboard",
|
"form.integration.pinboard_token": "Token API Pinboard",
|
||||||
"form.integration.pocket_access_token": "Token Acces Pocket",
|
|
||||||
"form.integration.pocket_activate": "Salvează înregistrările în Pocket",
|
|
||||||
"form.integration.pocket_connect_link": "Conectează contul Pocket personal",
|
|
||||||
"form.integration.pocket_consumer_key": "Cheie Consumator Pocket",
|
|
||||||
"form.integration.pushover_activate": "Activează Pushover",
|
"form.integration.pushover_activate": "Activează Pushover",
|
||||||
"form.integration.pushover_device": "Dispozitiv Pushover (opțional)",
|
"form.integration.pushover_device": "Dispozitiv Pushover (opțional)",
|
||||||
"form.integration.pushover_prefix": "Prefix Pushover (opțional)",
|
"form.integration.pushover_prefix": "Prefix Pushover (opțional)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "Нет записей, соответствующих этому тегу.",
|
"alert.no_tag_entry": "Нет записей, соответствующих этому тегу.",
|
||||||
"alert.no_unread_entry": "Нет непрочитанных статей.",
|
"alert.no_unread_entry": "Нет непрочитанных статей.",
|
||||||
"alert.no_user": "Вы единственный пользователь.",
|
"alert.no_user": "Вы единственный пользователь.",
|
||||||
"alert.pocket_linked": "Ваш Pocket аккаунт теперь привязан!",
|
|
||||||
"alert.prefs_saved": "Предпочтения сохранены!",
|
"alert.prefs_saved": "Предпочтения сохранены!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"Вы запустили слишком много обновлений подписок. Подождите %d минуту для нового запуска",
|
"Вы запустили слишком много обновлений подписок. Подождите %d минуту для нового запуска",
|
||||||
|
@ -136,8 +135,6 @@
|
||||||
"error.network_operation": "Miniflux не может открыть сайт из-за ошибки сети: %v.",
|
"error.network_operation": "Miniflux не может открыть сайт из-за ошибки сети: %v.",
|
||||||
"error.network_timeout": "Этот сайт слишком медленный и время ожидания запроса истекло: %v",
|
"error.network_timeout": "Этот сайт слишком медленный и время ожидания запроса истекло: %v",
|
||||||
"error.password_min_length": "Вы должны использовать минимум 6 символов.",
|
"error.password_min_length": "Вы должны использовать минимум 6 символов.",
|
||||||
"error.pocket_access_token": "Не удалось получить ключ доступа от Pocket!",
|
|
||||||
"error.pocket_request_token": "Не удалось получить request token от Pocket!",
|
|
||||||
"error.proxy_url_not_empty": "URL прокси не может быть пустым.",
|
"error.proxy_url_not_empty": "URL прокси не может быть пустым.",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Недопустимое правило блокировки: у правила #%d отсутствует корректное имя поля (Возможные варианты: %s)",
|
"error.settings_block_rule_fieldname_invalid": "Недопустимое правило блокировки: у правила #%d отсутствует корректное имя поля (Возможные варианты: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Недопустимое правило блокировки: шаблон правила #%d не является корректным регулярным выражением",
|
"error.settings_block_rule_invalid_regex": "Недопустимое правило блокировки: шаблон правила #%d не является корректным регулярным выражением",
|
||||||
|
@ -283,10 +280,6 @@
|
||||||
"form.integration.pinboard_bookmark": "Помечать закладки как непрочитанное",
|
"form.integration.pinboard_bookmark": "Помечать закладки как непрочитанное",
|
||||||
"form.integration.pinboard_tags": "Теги Pinboard",
|
"form.integration.pinboard_tags": "Теги Pinboard",
|
||||||
"form.integration.pinboard_token": "Токен Pinboard API",
|
"form.integration.pinboard_token": "Токен Pinboard API",
|
||||||
"form.integration.pocket_access_token": "Ключ доступа к Pocket",
|
|
||||||
"form.integration.pocket_activate": "Сохранять статьи в Pocket",
|
|
||||||
"form.integration.pocket_connect_link": "Подключить аккаунт Pocket",
|
|
||||||
"form.integration.pocket_consumer_key": "Ключ пользователя Pocket",
|
|
||||||
"form.integration.pushover_activate": "Отправлять статьи Pushover",
|
"form.integration.pushover_activate": "Отправлять статьи Pushover",
|
||||||
"form.integration.pushover_device": "Устройство Pushover (опционально)",
|
"form.integration.pushover_device": "Устройство Pushover (опционально)",
|
||||||
"form.integration.pushover_prefix": "URL-префикс Pushover (опционально)",
|
"form.integration.pushover_prefix": "URL-префикс Pushover (опционально)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "Bu etiketle eşleşen hiçbir giriş yok.",
|
"alert.no_tag_entry": "Bu etiketle eşleşen hiçbir giriş yok.",
|
||||||
"alert.no_unread_entry": "Okunmamış makele yok",
|
"alert.no_unread_entry": "Okunmamış makele yok",
|
||||||
"alert.no_user": "Tek kullanıcı sizsiniz",
|
"alert.no_user": "Tek kullanıcı sizsiniz",
|
||||||
"alert.pocket_linked": "Pocket hesabınız artık bağlandı.",
|
|
||||||
"alert.prefs_saved": "Tercihler kaydedildi!",
|
"alert.prefs_saved": "Tercihler kaydedildi!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"Çok fazla besleme yenilemesi başlattınız. Tekrar denemeden önce lütfen %d dakika bekleyin.",
|
"Çok fazla besleme yenilemesi başlattınız. Tekrar denemeden önce lütfen %d dakika bekleyin.",
|
||||||
|
@ -133,8 +132,6 @@
|
||||||
"error.network_operation": "Miniflux bir ağ hatası nedeniyle bu websitesine erişemiyor: %v.",
|
"error.network_operation": "Miniflux bir ağ hatası nedeniyle bu websitesine erişemiyor: %v.",
|
||||||
"error.network_timeout": "Bu websitesi çok yavaş ve istek zaman aşımına uğradı: %v",
|
"error.network_timeout": "Bu websitesi çok yavaş ve istek zaman aşımına uğradı: %v",
|
||||||
"error.password_min_length": "Parola en az 6 karakter içermeli.",
|
"error.password_min_length": "Parola en az 6 karakter içermeli.",
|
||||||
"error.pocket_access_token": "Pocket'tan access tokeni alınamıyor!",
|
|
||||||
"error.pocket_request_token": "Pocket'tan request tokeni alınamıyor!",
|
|
||||||
"error.proxy_url_not_empty": "Proxy URL'si boş olamaz.",
|
"error.proxy_url_not_empty": "Proxy URL'si boş olamaz.",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Geçersiz Engelleme kuralı: #%d kuralında geçerli bir alan adı eksik (Seçenekler: %s)",
|
"error.settings_block_rule_fieldname_invalid": "Geçersiz Engelleme kuralı: #%d kuralında geçerli bir alan adı eksik (Seçenekler: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Geçersiz Engelleme kuralı: #%d kuralı modeli geçerli bir düzenli ifade değil",
|
"error.settings_block_rule_invalid_regex": "Geçersiz Engelleme kuralı: #%d kuralı modeli geçerli bir düzenli ifade değil",
|
||||||
|
@ -280,10 +277,6 @@
|
||||||
"form.integration.pinboard_bookmark": "Yer imini okunmadı olarak işaretle",
|
"form.integration.pinboard_bookmark": "Yer imini okunmadı olarak işaretle",
|
||||||
"form.integration.pinboard_tags": "Pinboard Etiketleri",
|
"form.integration.pinboard_tags": "Pinboard Etiketleri",
|
||||||
"form.integration.pinboard_token": "Pinboard API Token",
|
"form.integration.pinboard_token": "Pinboard API Token",
|
||||||
"form.integration.pocket_access_token": "Pocket Access Token",
|
|
||||||
"form.integration.pocket_activate": "Makaleleri Pocket'a kaydet",
|
|
||||||
"form.integration.pocket_connect_link": "Pocket hesabını bağla",
|
|
||||||
"form.integration.pocket_consumer_key": "Pocket Consumer Anahtarı",
|
|
||||||
"form.integration.pushover_activate": "Push entries to Pushover",
|
"form.integration.pushover_activate": "Push entries to Pushover",
|
||||||
"form.integration.pushover_device": "Pushover device (optional)",
|
"form.integration.pushover_device": "Pushover device (optional)",
|
||||||
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "Немає записів, що відповідають цьому тегу.",
|
"alert.no_tag_entry": "Немає записів, що відповідають цьому тегу.",
|
||||||
"alert.no_unread_entry": "Немає непрочитаних статей.",
|
"alert.no_unread_entry": "Немає непрочитаних статей.",
|
||||||
"alert.no_user": "Ви єдиний користувач.",
|
"alert.no_user": "Ви єдиний користувач.",
|
||||||
"alert.pocket_linked": "Тепер ваш обліковий запис Pocket підключено!",
|
|
||||||
"alert.prefs_saved": "Уподобання збережено!",
|
"alert.prefs_saved": "Уподобання збережено!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"Ви запустили надто багато оновлень стрічок. Будь ласка, зачекайте %d хвилину перед повторною спробою.",
|
"Ви запустили надто багато оновлень стрічок. Будь ласка, зачекайте %d хвилину перед повторною спробою.",
|
||||||
|
@ -136,8 +135,6 @@
|
||||||
"error.network_operation": "Miniflux не може отримати доступ до цього сайту через помилку мережі: %v.",
|
"error.network_operation": "Miniflux не може отримати доступ до цього сайту через помилку мережі: %v.",
|
||||||
"error.network_timeout": "Цей сайт занадто повільний і запит перевищив час очікування: %v",
|
"error.network_timeout": "Цей сайт занадто повільний і запит перевищив час очікування: %v",
|
||||||
"error.password_min_length": "Пароль має складати щонайменше 6 символів.",
|
"error.password_min_length": "Пароль має складати щонайменше 6 символів.",
|
||||||
"error.pocket_access_token": "Не вдалося отримати токен доступу з Pocket!",
|
|
||||||
"error.pocket_request_token": "Не вдалося отримати токен доступу з Pocket!",
|
|
||||||
"error.proxy_url_not_empty": "Proxy URL не може бути порожнім.",
|
"error.proxy_url_not_empty": "Proxy URL не може бути порожнім.",
|
||||||
"error.settings_block_rule_fieldname_invalid": "Недійсне правило блокування: у правилі #%d відсутнє коректне ім’я поля (Опції: %s)",
|
"error.settings_block_rule_fieldname_invalid": "Недійсне правило блокування: у правилі #%d відсутнє коректне ім’я поля (Опції: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "Недійсне правило блокування: шаблон правила #%d не є коректним регулярним виразом",
|
"error.settings_block_rule_invalid_regex": "Недійсне правило блокування: шаблон правила #%d не є коректним регулярним виразом",
|
||||||
|
@ -283,10 +280,6 @@
|
||||||
"form.integration.pinboard_bookmark": "Відмічати закладку як непрочитану",
|
"form.integration.pinboard_bookmark": "Відмічати закладку як непрочитану",
|
||||||
"form.integration.pinboard_tags": "Теги для Pinboard",
|
"form.integration.pinboard_tags": "Теги для Pinboard",
|
||||||
"form.integration.pinboard_token": "API ключ від Pinboard",
|
"form.integration.pinboard_token": "API ключ від Pinboard",
|
||||||
"form.integration.pocket_access_token": "Pocket Access Token",
|
|
||||||
"form.integration.pocket_activate": "Зберігати статті до Pocket",
|
|
||||||
"form.integration.pocket_connect_link": "Підключити ваш обліковий запис Pocket",
|
|
||||||
"form.integration.pocket_consumer_key": "Pocket Consumer Key",
|
|
||||||
"form.integration.pushover_activate": "Push entries to Pushover",
|
"form.integration.pushover_activate": "Push entries to Pushover",
|
||||||
"form.integration.pushover_device": "Pushover device (optional)",
|
"form.integration.pushover_device": "Pushover device (optional)",
|
||||||
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "没有与此标签匹配的条目。",
|
"alert.no_tag_entry": "没有与此标签匹配的条目。",
|
||||||
"alert.no_unread_entry": "目前没有未读文章",
|
"alert.no_unread_entry": "目前没有未读文章",
|
||||||
"alert.no_user": "您是目前仅有的用户",
|
"alert.no_user": "您是目前仅有的用户",
|
||||||
"alert.pocket_linked": "您的 Pocket 帐户现已关联",
|
|
||||||
"alert.prefs_saved": "设置已存储!",
|
"alert.prefs_saved": "设置已存储!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"多次触发订阅源更新,请等待 %d 分钟后重试。"
|
"多次触发订阅源更新,请等待 %d 分钟后重试。"
|
||||||
|
@ -130,8 +129,6 @@
|
||||||
"error.network_operation": "Miniflux 无法访问该网站由于网络错误: %v。",
|
"error.network_operation": "Miniflux 无法访问该网站由于网络错误: %v。",
|
||||||
"error.network_timeout": "该网站响应过慢,请求超时: %v",
|
"error.network_timeout": "该网站响应过慢,请求超时: %v",
|
||||||
"error.password_min_length": "请至少输入 6 个字符",
|
"error.password_min_length": "请至少输入 6 个字符",
|
||||||
"error.pocket_access_token": "无法从 Pocket 获取访问令牌!",
|
|
||||||
"error.pocket_request_token": "无法从 Pocket 获取请求令牌!",
|
|
||||||
"error.proxy_url_not_empty": "代理 URL 不能为空。",
|
"error.proxy_url_not_empty": "代理 URL 不能为空。",
|
||||||
"error.settings_block_rule_fieldname_invalid": "无效的阻止规则: 规则 #%d 缺少合法的字段名 (可选: %s)",
|
"error.settings_block_rule_fieldname_invalid": "无效的阻止规则: 规则 #%d 缺少合法的字段名 (可选: %s)",
|
||||||
"error.settings_block_rule_invalid_regex": "无效的阻止规则: 规则 #%d 的模式字符不是合法的正则表达式。",
|
"error.settings_block_rule_invalid_regex": "无效的阻止规则: 规则 #%d 的模式字符不是合法的正则表达式。",
|
||||||
|
@ -277,10 +274,6 @@
|
||||||
"form.integration.pinboard_bookmark": "标记为未读",
|
"form.integration.pinboard_bookmark": "标记为未读",
|
||||||
"form.integration.pinboard_tags": "Pinboard 标签",
|
"form.integration.pinboard_tags": "Pinboard 标签",
|
||||||
"form.integration.pinboard_token": "Pinboard API 令牌",
|
"form.integration.pinboard_token": "Pinboard API 令牌",
|
||||||
"form.integration.pocket_access_token": "Pocket 访问令牌",
|
|
||||||
"form.integration.pocket_activate": "将文章保存到 Pocket",
|
|
||||||
"form.integration.pocket_connect_link": "连接您的 Pocket 帐户",
|
|
||||||
"form.integration.pocket_consumer_key": "Pocket 用户密钥",
|
|
||||||
"form.integration.pushover_activate": "将条目推送至 Pushover",
|
"form.integration.pushover_activate": "将条目推送至 Pushover",
|
||||||
"form.integration.pushover_device": "Pushover 装置(可选)",
|
"form.integration.pushover_device": "Pushover 装置(可选)",
|
||||||
"form.integration.pushover_prefix": "Pushover URL 前缀(可选)",
|
"form.integration.pushover_prefix": "Pushover URL 前缀(可选)",
|
||||||
|
@ -601,4 +594,4 @@
|
||||||
"time_elapsed.yesterday": "昨天",
|
"time_elapsed.yesterday": "昨天",
|
||||||
"tooltip.keyboard_shortcuts": "快捷键: %s",
|
"tooltip.keyboard_shortcuts": "快捷键: %s",
|
||||||
"tooltip.logged_user": "当前登录 %s"
|
"tooltip.logged_user": "当前登录 %s"
|
||||||
}
|
}
|
|
@ -27,7 +27,6 @@
|
||||||
"alert.no_tag_entry": "沒有與此標籤相符的文章。",
|
"alert.no_tag_entry": "沒有與此標籤相符的文章。",
|
||||||
"alert.no_unread_entry": "目前沒有未讀文章",
|
"alert.no_unread_entry": "目前沒有未讀文章",
|
||||||
"alert.no_user": "您是唯一的使用者",
|
"alert.no_user": "您是唯一的使用者",
|
||||||
"alert.pocket_linked": "您的 Pocket 帳戶已關聯",
|
|
||||||
"alert.prefs_saved": "設定已儲存!",
|
"alert.prefs_saved": "設定已儲存!",
|
||||||
"alert.too_many_feeds_refresh": [
|
"alert.too_many_feeds_refresh": [
|
||||||
"您已觸發過太多次 Feed 更新,請等待 %d 分鐘後再嘗試。"
|
"您已觸發過太多次 Feed 更新,請等待 %d 分鐘後再嘗試。"
|
||||||
|
@ -130,8 +129,6 @@
|
||||||
"error.network_operation": "Miniflux 無法連線到該網站,可能是網路問題:%v。",
|
"error.network_operation": "Miniflux 無法連線到該網站,可能是網路問題:%v。",
|
||||||
"error.network_timeout": "該網站回應過慢,請求逾時:%v。",
|
"error.network_timeout": "該網站回應過慢,請求逾時:%v。",
|
||||||
"error.password_min_length": "請至少輸入 6 個字元",
|
"error.password_min_length": "請至少輸入 6 個字元",
|
||||||
"error.pocket_access_token": "無法從 Pocket 取得存取金鑰!",
|
|
||||||
"error.pocket_request_token": "無法從 Pocket 取得請求金鑰!",
|
|
||||||
"error.proxy_url_not_empty": "代理伺服器網址不能為空。",
|
"error.proxy_url_not_empty": "代理伺服器網址不能為空。",
|
||||||
"error.settings_block_rule_fieldname_invalid": "無效的封鎖規則:規則 #%d 缺少有效的欄位名稱 (可用選項:%s)",
|
"error.settings_block_rule_fieldname_invalid": "無效的封鎖規則:規則 #%d 缺少有效的欄位名稱 (可用選項:%s)",
|
||||||
"error.settings_block_rule_invalid_regex": "無效的封鎖規則:規則 #%d 的模式不是合法的正規表示式",
|
"error.settings_block_rule_invalid_regex": "無效的封鎖規則:規則 #%d 的模式不是合法的正規表示式",
|
||||||
|
@ -277,10 +274,6 @@
|
||||||
"form.integration.pinboard_bookmark": "標記為未讀",
|
"form.integration.pinboard_bookmark": "標記為未讀",
|
||||||
"form.integration.pinboard_tags": "Pinboard 標籤",
|
"form.integration.pinboard_tags": "Pinboard 標籤",
|
||||||
"form.integration.pinboard_token": "Pinboard API Token",
|
"form.integration.pinboard_token": "Pinboard API Token",
|
||||||
"form.integration.pocket_access_token": "Pocket 存取金鑰",
|
|
||||||
"form.integration.pocket_activate": "儲存文章到 Pocket",
|
|
||||||
"form.integration.pocket_connect_link": "連線您的 Pocket 帳戶",
|
|
||||||
"form.integration.pocket_consumer_key": "Pocket 使用者金鑰",
|
|
||||||
"form.integration.pushover_activate": "Push entries to Pushover",
|
"form.integration.pushover_activate": "Push entries to Pushover",
|
||||||
"form.integration.pushover_device": "Pushover device (optional)",
|
"form.integration.pushover_device": "Pushover device (optional)",
|
||||||
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
"form.integration.pushover_prefix": "Pushover URL prefix (optional)",
|
||||||
|
|
|
@ -19,13 +19,12 @@ type SessionData struct {
|
||||||
FlashErrorMessage string `json:"flash_error_message"`
|
FlashErrorMessage string `json:"flash_error_message"`
|
||||||
Language string `json:"language"`
|
Language string `json:"language"`
|
||||||
Theme string `json:"theme"`
|
Theme string `json:"theme"`
|
||||||
PocketRequestToken string `json:"pocket_request_token"`
|
|
||||||
LastForceRefresh string `json:"last_force_refresh"`
|
LastForceRefresh string `json:"last_force_refresh"`
|
||||||
WebAuthnSessionData WebAuthnSession `json:"webauthn_session_data"`
|
WebAuthnSessionData WebAuthnSession `json:"webauthn_session_data"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SessionData) String() string {
|
func (s *SessionData) String() string {
|
||||||
return fmt.Sprintf(`CSRF=%q, OAuth2State=%q, OAuth2CodeVerifier=%q, FlashMsg=%q, FlashErrMsg=%q, Lang=%q, Theme=%q, PocketTkn=%q, LastForceRefresh=%s, WebAuthnSession=%q`,
|
return fmt.Sprintf(`CSRF=%q, OAuth2State=%q, OAuth2CodeVerifier=%q, FlashMsg=%q, FlashErrMsg=%q, Lang=%q, Theme=%q, LastForceRefresh=%s, WebAuthnSession=%q`,
|
||||||
s.CSRF,
|
s.CSRF,
|
||||||
s.OAuth2State,
|
s.OAuth2State,
|
||||||
s.OAuth2CodeVerifier,
|
s.OAuth2CodeVerifier,
|
||||||
|
@ -33,7 +32,6 @@ func (s *SessionData) String() string {
|
||||||
s.FlashErrorMessage,
|
s.FlashErrorMessage,
|
||||||
s.Language,
|
s.Language,
|
||||||
s.Theme,
|
s.Theme,
|
||||||
s.PocketRequestToken,
|
|
||||||
s.LastForceRefresh,
|
s.LastForceRefresh,
|
||||||
s.WebAuthnSessionData,
|
s.WebAuthnSessionData,
|
||||||
)
|
)
|
||||||
|
|
|
@ -41,9 +41,6 @@ type Integration struct {
|
||||||
EspialTags string
|
EspialTags string
|
||||||
ReadwiseEnabled bool
|
ReadwiseEnabled bool
|
||||||
ReadwiseAPIKey string
|
ReadwiseAPIKey string
|
||||||
PocketEnabled bool
|
|
||||||
PocketAccessToken string
|
|
||||||
PocketConsumerKey string
|
|
||||||
TelegramBotEnabled bool
|
TelegramBotEnabled bool
|
||||||
TelegramBotToken string
|
TelegramBotToken string
|
||||||
TelegramBotChatID string
|
TelegramBotChatID string
|
||||||
|
|
|
@ -142,9 +142,6 @@ func (s *Storage) Integration(userID int64) (*model.Integration, error) {
|
||||||
espial_tags,
|
espial_tags,
|
||||||
readwise_enabled,
|
readwise_enabled,
|
||||||
readwise_api_key,
|
readwise_api_key,
|
||||||
pocket_enabled,
|
|
||||||
pocket_access_token,
|
|
||||||
pocket_consumer_key,
|
|
||||||
telegram_bot_enabled,
|
telegram_bot_enabled,
|
||||||
telegram_bot_token,
|
telegram_bot_token,
|
||||||
telegram_bot_chat_id,
|
telegram_bot_chat_id,
|
||||||
|
@ -264,9 +261,6 @@ func (s *Storage) Integration(userID int64) (*model.Integration, error) {
|
||||||
&integration.EspialTags,
|
&integration.EspialTags,
|
||||||
&integration.ReadwiseEnabled,
|
&integration.ReadwiseEnabled,
|
||||||
&integration.ReadwiseAPIKey,
|
&integration.ReadwiseAPIKey,
|
||||||
&integration.PocketEnabled,
|
|
||||||
&integration.PocketAccessToken,
|
|
||||||
&integration.PocketConsumerKey,
|
|
||||||
&integration.TelegramBotEnabled,
|
&integration.TelegramBotEnabled,
|
||||||
&integration.TelegramBotToken,
|
&integration.TelegramBotToken,
|
||||||
&integration.TelegramBotChatID,
|
&integration.TelegramBotChatID,
|
||||||
|
@ -383,102 +377,99 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
|
||||||
nunux_keeper_enabled=$18,
|
nunux_keeper_enabled=$18,
|
||||||
nunux_keeper_url=$19,
|
nunux_keeper_url=$19,
|
||||||
nunux_keeper_api_key=$20,
|
nunux_keeper_api_key=$20,
|
||||||
pocket_enabled=$21,
|
googlereader_enabled=$21,
|
||||||
pocket_access_token=$22,
|
googlereader_username=$22,
|
||||||
pocket_consumer_key=$23,
|
googlereader_password=$23,
|
||||||
googlereader_enabled=$24,
|
telegram_bot_enabled=$24,
|
||||||
googlereader_username=$25,
|
telegram_bot_token=$25,
|
||||||
googlereader_password=$26,
|
telegram_bot_chat_id=$26,
|
||||||
telegram_bot_enabled=$27,
|
telegram_bot_topic_id=$27,
|
||||||
telegram_bot_token=$28,
|
telegram_bot_disable_web_page_preview=$28,
|
||||||
telegram_bot_chat_id=$29,
|
telegram_bot_disable_notification=$29,
|
||||||
telegram_bot_topic_id=$30,
|
telegram_bot_disable_buttons=$30,
|
||||||
telegram_bot_disable_web_page_preview=$31,
|
espial_enabled=$31,
|
||||||
telegram_bot_disable_notification=$32,
|
espial_url=$32,
|
||||||
telegram_bot_disable_buttons=$33,
|
espial_api_key=$33,
|
||||||
espial_enabled=$34,
|
espial_tags=$34,
|
||||||
espial_url=$35,
|
linkace_enabled=$35,
|
||||||
espial_api_key=$36,
|
linkace_url=$36,
|
||||||
espial_tags=$37,
|
linkace_api_key=$37,
|
||||||
linkace_enabled=$38,
|
linkace_tags=$38,
|
||||||
linkace_url=$39,
|
linkace_is_private=$39,
|
||||||
linkace_api_key=$40,
|
linkace_check_disabled=$40,
|
||||||
linkace_tags=$41,
|
linkding_enabled=$41,
|
||||||
linkace_is_private=$42,
|
linkding_url=$42,
|
||||||
linkace_check_disabled=$43,
|
linkding_api_key=$43,
|
||||||
linkding_enabled=$44,
|
linkding_tags=$44,
|
||||||
linkding_url=$45,
|
linkding_mark_as_unread=$45,
|
||||||
linkding_api_key=$46,
|
matrix_bot_enabled=$46,
|
||||||
linkding_tags=$47,
|
matrix_bot_user=$47,
|
||||||
linkding_mark_as_unread=$48,
|
matrix_bot_password=$48,
|
||||||
matrix_bot_enabled=$49,
|
matrix_bot_url=$49,
|
||||||
matrix_bot_user=$50,
|
matrix_bot_chat_id=$50,
|
||||||
matrix_bot_password=$51,
|
notion_enabled=$51,
|
||||||
matrix_bot_url=$52,
|
notion_token=$52,
|
||||||
matrix_bot_chat_id=$53,
|
notion_page_id=$53,
|
||||||
notion_enabled=$54,
|
readwise_enabled=$54,
|
||||||
notion_token=$55,
|
readwise_api_key=$55,
|
||||||
notion_page_id=$56,
|
apprise_enabled=$56,
|
||||||
readwise_enabled=$57,
|
apprise_url=$57,
|
||||||
readwise_api_key=$58,
|
apprise_services_url=$58,
|
||||||
apprise_enabled=$59,
|
readeck_enabled=$59,
|
||||||
apprise_url=$60,
|
readeck_url=$60,
|
||||||
apprise_services_url=$61,
|
readeck_api_key=$61,
|
||||||
readeck_enabled=$62,
|
readeck_labels=$62,
|
||||||
readeck_url=$63,
|
readeck_only_url=$63,
|
||||||
readeck_api_key=$64,
|
shiori_enabled=$64,
|
||||||
readeck_labels=$65,
|
shiori_url=$65,
|
||||||
readeck_only_url=$66,
|
shiori_username=$66,
|
||||||
shiori_enabled=$67,
|
shiori_password=$67,
|
||||||
shiori_url=$68,
|
shaarli_enabled=$68,
|
||||||
shiori_username=$69,
|
shaarli_url=$69,
|
||||||
shiori_password=$70,
|
shaarli_api_secret=$70,
|
||||||
shaarli_enabled=$71,
|
webhook_enabled=$71,
|
||||||
shaarli_url=$72,
|
webhook_url=$72,
|
||||||
shaarli_api_secret=$73,
|
webhook_secret=$73,
|
||||||
webhook_enabled=$74,
|
rssbridge_enabled=$74,
|
||||||
webhook_url=$75,
|
rssbridge_url=$75,
|
||||||
webhook_secret=$76,
|
omnivore_enabled=$76,
|
||||||
rssbridge_enabled=$77,
|
omnivore_api_key=$77,
|
||||||
rssbridge_url=$78,
|
omnivore_url=$78,
|
||||||
omnivore_enabled=$79,
|
linkwarden_enabled=$79,
|
||||||
omnivore_api_key=$80,
|
linkwarden_url=$80,
|
||||||
omnivore_url=$81,
|
linkwarden_api_key=$81,
|
||||||
linkwarden_enabled=$82,
|
raindrop_enabled=$82,
|
||||||
linkwarden_url=$83,
|
raindrop_token=$83,
|
||||||
linkwarden_api_key=$84,
|
raindrop_collection_id=$84,
|
||||||
raindrop_enabled=$85,
|
raindrop_tags=$85,
|
||||||
raindrop_token=$86,
|
betula_enabled=$86,
|
||||||
raindrop_collection_id=$87,
|
betula_url=$87,
|
||||||
raindrop_tags=$88,
|
betula_token=$88,
|
||||||
betula_enabled=$89,
|
ntfy_enabled=$89,
|
||||||
betula_url=$90,
|
ntfy_topic=$90,
|
||||||
betula_token=$91,
|
ntfy_url=$91,
|
||||||
ntfy_enabled=$92,
|
ntfy_api_token=$92,
|
||||||
ntfy_topic=$93,
|
ntfy_username=$93,
|
||||||
ntfy_url=$94,
|
ntfy_password=$94,
|
||||||
ntfy_api_token=$95,
|
ntfy_icon_url=$95,
|
||||||
ntfy_username=$96,
|
ntfy_internal_links=$96,
|
||||||
ntfy_password=$97,
|
cubox_enabled=$97,
|
||||||
ntfy_icon_url=$98,
|
cubox_api_link=$98,
|
||||||
ntfy_internal_links=$99,
|
discord_enabled=$99,
|
||||||
cubox_enabled=$100,
|
discord_webhook_link=$100,
|
||||||
cubox_api_link=$101,
|
slack_enabled=$101,
|
||||||
discord_enabled=$102,
|
slack_webhook_link=$102,
|
||||||
discord_webhook_link=$103,
|
pushover_enabled=$103,
|
||||||
slack_enabled=$104,
|
pushover_user=$104,
|
||||||
slack_webhook_link=$105,
|
pushover_token=$105,
|
||||||
pushover_enabled=$106,
|
pushover_device=$106,
|
||||||
pushover_user=$107,
|
pushover_prefix=$107,
|
||||||
pushover_token=$108,
|
rssbridge_token=$108,
|
||||||
pushover_device=$109,
|
karakeep_enabled=$109,
|
||||||
pushover_prefix=$110,
|
karakeep_api_key=$110,
|
||||||
rssbridge_token=$111,
|
karakeep_url=$111
|
||||||
karakeep_enabled=$112,
|
|
||||||
karakeep_api_key=$113,
|
|
||||||
karakeep_url=$114
|
|
||||||
WHERE
|
WHERE
|
||||||
user_id=$115
|
user_id=$112
|
||||||
`
|
`
|
||||||
_, err := s.db.Exec(
|
_, err := s.db.Exec(
|
||||||
query,
|
query,
|
||||||
|
@ -502,9 +493,6 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
|
||||||
integration.NunuxKeeperEnabled,
|
integration.NunuxKeeperEnabled,
|
||||||
integration.NunuxKeeperURL,
|
integration.NunuxKeeperURL,
|
||||||
integration.NunuxKeeperAPIKey,
|
integration.NunuxKeeperAPIKey,
|
||||||
integration.PocketEnabled,
|
|
||||||
integration.PocketAccessToken,
|
|
||||||
integration.PocketConsumerKey,
|
|
||||||
integration.GoogleReaderEnabled,
|
integration.GoogleReaderEnabled,
|
||||||
integration.GoogleReaderUsername,
|
integration.GoogleReaderUsername,
|
||||||
integration.GoogleReaderPassword,
|
integration.GoogleReaderPassword,
|
||||||
|
@ -624,7 +612,6 @@ func (s *Storage) HasSaveEntry(userID int64) (result bool) {
|
||||||
nunux_keeper_enabled='t' OR
|
nunux_keeper_enabled='t' OR
|
||||||
espial_enabled='t' OR
|
espial_enabled='t' OR
|
||||||
readwise_enabled='t' OR
|
readwise_enabled='t' OR
|
||||||
pocket_enabled='t' OR
|
|
||||||
linkace_enabled='t' OR
|
linkace_enabled='t' OR
|
||||||
linkding_enabled='t' OR
|
linkding_enabled='t' OR
|
||||||
linkwarden_enabled='t' OR
|
linkwarden_enabled='t' OR
|
||||||
|
|
|
@ -406,31 +406,6 @@
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details {{ if .form.PocketEnabled }}open{{ end }}>
|
|
||||||
<summary>Pocket</summary>
|
|
||||||
<div class="form-section">
|
|
||||||
<label>
|
|
||||||
<input type="checkbox" name="pocket_enabled" value="1" {{ if .form.PocketEnabled }}checked{{ end }}> {{ t "form.integration.pocket_activate" }}
|
|
||||||
</label>
|
|
||||||
|
|
||||||
{{ if not .hasPocketConsumerKeyConfigured }}
|
|
||||||
<label for="form-pocket-consumer-key">{{ t "form.integration.pocket_consumer_key" }}</label>
|
|
||||||
<input type="text" name="pocket_consumer_key" id="form-pocket-consumer-key" value="{{ .form.PocketConsumerKey }}" spellcheck="false">
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<label for="form-pocket-access-token">{{ t "form.integration.pocket_access_token" }}</label>
|
|
||||||
<input type="password" name="pocket_access_token" id="form-pocket-access-token" value="{{ .form.PocketAccessToken }}" autocomplete="new-password">
|
|
||||||
|
|
||||||
{{ if not .form.PocketAccessToken }}
|
|
||||||
<p><a href="{{ route "pocketAuthorize" }}">{{ t "form.integration.pocket_connect_link" }}</a></p>
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<div class="buttons">
|
|
||||||
<button type="submit" class="button button-primary" data-label-loading="{{ t "form.submit.saving" }}">{{ t "action.update" }}</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details {{ if .form.PushoverEnabled }}open{{ end }}>
|
<details {{ if .form.PushoverEnabled }}open{{ end }}>
|
||||||
<summary>Pushover</summary>
|
<summary>Pushover</summary>
|
||||||
<div class="form-section">
|
<div class="form-section">
|
||||||
|
|
|
@ -44,9 +44,6 @@ type IntegrationForm struct {
|
||||||
EspialTags string
|
EspialTags string
|
||||||
ReadwiseEnabled bool
|
ReadwiseEnabled bool
|
||||||
ReadwiseAPIKey string
|
ReadwiseAPIKey string
|
||||||
PocketEnabled bool
|
|
||||||
PocketAccessToken string
|
|
||||||
PocketConsumerKey string
|
|
||||||
TelegramBotEnabled bool
|
TelegramBotEnabled bool
|
||||||
TelegramBotToken string
|
TelegramBotToken string
|
||||||
TelegramBotChatID string
|
TelegramBotChatID string
|
||||||
|
@ -160,9 +157,6 @@ func (i IntegrationForm) Merge(integration *model.Integration) {
|
||||||
integration.EspialTags = i.EspialTags
|
integration.EspialTags = i.EspialTags
|
||||||
integration.ReadwiseEnabled = i.ReadwiseEnabled
|
integration.ReadwiseEnabled = i.ReadwiseEnabled
|
||||||
integration.ReadwiseAPIKey = i.ReadwiseAPIKey
|
integration.ReadwiseAPIKey = i.ReadwiseAPIKey
|
||||||
integration.PocketEnabled = i.PocketEnabled
|
|
||||||
integration.PocketAccessToken = i.PocketAccessToken
|
|
||||||
integration.PocketConsumerKey = i.PocketConsumerKey
|
|
||||||
integration.TelegramBotEnabled = i.TelegramBotEnabled
|
integration.TelegramBotEnabled = i.TelegramBotEnabled
|
||||||
integration.TelegramBotToken = i.TelegramBotToken
|
integration.TelegramBotToken = i.TelegramBotToken
|
||||||
integration.TelegramBotChatID = i.TelegramBotChatID
|
integration.TelegramBotChatID = i.TelegramBotChatID
|
||||||
|
@ -278,9 +272,6 @@ func NewIntegrationForm(r *http.Request) *IntegrationForm {
|
||||||
EspialTags: r.FormValue("espial_tags"),
|
EspialTags: r.FormValue("espial_tags"),
|
||||||
ReadwiseEnabled: r.FormValue("readwise_enabled") == "1",
|
ReadwiseEnabled: r.FormValue("readwise_enabled") == "1",
|
||||||
ReadwiseAPIKey: r.FormValue("readwise_api_key"),
|
ReadwiseAPIKey: r.FormValue("readwise_api_key"),
|
||||||
PocketEnabled: r.FormValue("pocket_enabled") == "1",
|
|
||||||
PocketAccessToken: r.FormValue("pocket_access_token"),
|
|
||||||
PocketConsumerKey: r.FormValue("pocket_consumer_key"),
|
|
||||||
TelegramBotEnabled: r.FormValue("telegram_bot_enabled") == "1",
|
TelegramBotEnabled: r.FormValue("telegram_bot_enabled") == "1",
|
||||||
TelegramBotToken: r.FormValue("telegram_bot_token"),
|
TelegramBotToken: r.FormValue("telegram_bot_token"),
|
||||||
TelegramBotChatID: r.FormValue("telegram_bot_chat_id"),
|
TelegramBotChatID: r.FormValue("telegram_bot_chat_id"),
|
||||||
|
|
|
@ -1,90 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
package ui // import "miniflux.app/v2/internal/ui"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log/slog"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"miniflux.app/v2/internal/config"
|
|
||||||
"miniflux.app/v2/internal/http/request"
|
|
||||||
"miniflux.app/v2/internal/http/response/html"
|
|
||||||
"miniflux.app/v2/internal/http/route"
|
|
||||||
"miniflux.app/v2/internal/integration/pocket"
|
|
||||||
"miniflux.app/v2/internal/locale"
|
|
||||||
"miniflux.app/v2/internal/ui/session"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (h *handler) pocketAuthorize(w http.ResponseWriter, r *http.Request) {
|
|
||||||
printer := locale.NewPrinter(request.UserLanguage(r))
|
|
||||||
user, err := h.store.UserByID(request.UserID(r))
|
|
||||||
if err != nil {
|
|
||||||
html.ServerError(w, r, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
integration, err := h.store.Integration(user.ID)
|
|
||||||
if err != nil {
|
|
||||||
html.ServerError(w, r, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
sess := session.New(h.store, request.SessionID(r))
|
|
||||||
connector := pocket.NewConnector(config.Opts.PocketConsumerKey(integration.PocketConsumerKey))
|
|
||||||
redirectURL := config.Opts.RootURL() + route.Path(h.router, "pocketCallback")
|
|
||||||
requestToken, err := connector.RequestToken(redirectURL)
|
|
||||||
if err != nil {
|
|
||||||
slog.Warn("Pocket authorization request failed",
|
|
||||||
slog.Any("user_id", user.ID),
|
|
||||||
slog.Any("error", err),
|
|
||||||
)
|
|
||||||
sess.NewFlashErrorMessage(printer.Print("error.pocket_request_token"))
|
|
||||||
html.Redirect(w, r, route.Path(h.router, "integrations"))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
sess.SetPocketRequestToken(requestToken)
|
|
||||||
html.Redirect(w, r, connector.AuthorizationURL(requestToken, redirectURL))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *handler) pocketCallback(w http.ResponseWriter, r *http.Request) {
|
|
||||||
printer := locale.NewPrinter(request.UserLanguage(r))
|
|
||||||
sess := session.New(h.store, request.SessionID(r))
|
|
||||||
|
|
||||||
user, err := h.store.UserByID(request.UserID(r))
|
|
||||||
if err != nil {
|
|
||||||
html.ServerError(w, r, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
integration, err := h.store.Integration(user.ID)
|
|
||||||
if err != nil {
|
|
||||||
html.ServerError(w, r, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
connector := pocket.NewConnector(config.Opts.PocketConsumerKey(integration.PocketConsumerKey))
|
|
||||||
accessToken, err := connector.AccessToken(request.PocketRequestToken(r))
|
|
||||||
if err != nil {
|
|
||||||
slog.Warn("Unable to get Pocket access token",
|
|
||||||
slog.Any("user_id", user.ID),
|
|
||||||
slog.Any("error", err),
|
|
||||||
)
|
|
||||||
sess.NewFlashErrorMessage(printer.Print("error.pocket_access_token"))
|
|
||||||
html.Redirect(w, r, route.Path(h.router, "integrations"))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
sess.SetPocketRequestToken("")
|
|
||||||
integration.PocketAccessToken = accessToken
|
|
||||||
|
|
||||||
err = h.store.UpdateIntegration(integration)
|
|
||||||
if err != nil {
|
|
||||||
html.ServerError(w, r, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
sess.NewFlashMessage(printer.Print("alert.pocket_linked"))
|
|
||||||
html.Redirect(w, r, route.Path(h.router, "integrations"))
|
|
||||||
}
|
|
|
@ -6,7 +6,6 @@ package ui // import "miniflux.app/v2/internal/ui"
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"miniflux.app/v2/internal/config"
|
|
||||||
"miniflux.app/v2/internal/http/request"
|
"miniflux.app/v2/internal/http/request"
|
||||||
"miniflux.app/v2/internal/http/response/html"
|
"miniflux.app/v2/internal/http/response/html"
|
||||||
"miniflux.app/v2/internal/ui/form"
|
"miniflux.app/v2/internal/ui/form"
|
||||||
|
@ -58,9 +57,6 @@ func (h *handler) showIntegrationPage(w http.ResponseWriter, r *http.Request) {
|
||||||
EspialTags: integration.EspialTags,
|
EspialTags: integration.EspialTags,
|
||||||
ReadwiseEnabled: integration.ReadwiseEnabled,
|
ReadwiseEnabled: integration.ReadwiseEnabled,
|
||||||
ReadwiseAPIKey: integration.ReadwiseAPIKey,
|
ReadwiseAPIKey: integration.ReadwiseAPIKey,
|
||||||
PocketEnabled: integration.PocketEnabled,
|
|
||||||
PocketAccessToken: integration.PocketAccessToken,
|
|
||||||
PocketConsumerKey: integration.PocketConsumerKey,
|
|
||||||
TelegramBotEnabled: integration.TelegramBotEnabled,
|
TelegramBotEnabled: integration.TelegramBotEnabled,
|
||||||
TelegramBotToken: integration.TelegramBotToken,
|
TelegramBotToken: integration.TelegramBotToken,
|
||||||
TelegramBotChatID: integration.TelegramBotChatID,
|
TelegramBotChatID: integration.TelegramBotChatID,
|
||||||
|
@ -149,7 +145,6 @@ func (h *handler) showIntegrationPage(w http.ResponseWriter, r *http.Request) {
|
||||||
view.Set("user", user)
|
view.Set("user", user)
|
||||||
view.Set("countUnread", h.store.CountUnreadEntries(user.ID))
|
view.Set("countUnread", h.store.CountUnreadEntries(user.ID))
|
||||||
view.Set("countErrorFeeds", h.store.CountUserFeedsWithErrors(user.ID))
|
view.Set("countErrorFeeds", h.store.CountUserFeedsWithErrors(user.ID))
|
||||||
view.Set("hasPocketConsumerKeyConfigured", config.Opts.PocketConsumerKey("") != "")
|
|
||||||
|
|
||||||
html.OK(w, r, view.Render("integrations"))
|
html.OK(w, r, view.Render("integrations"))
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,7 +126,6 @@ func (m *middleware) handleAppSession(next http.Handler) http.Handler {
|
||||||
ctx = context.WithValue(ctx, request.FlashErrorMessageContextKey, session.Data.FlashErrorMessage)
|
ctx = context.WithValue(ctx, request.FlashErrorMessageContextKey, session.Data.FlashErrorMessage)
|
||||||
ctx = context.WithValue(ctx, request.UserLanguageContextKey, session.Data.Language)
|
ctx = context.WithValue(ctx, request.UserLanguageContextKey, session.Data.Language)
|
||||||
ctx = context.WithValue(ctx, request.UserThemeContextKey, session.Data.Theme)
|
ctx = context.WithValue(ctx, request.UserThemeContextKey, session.Data.Theme)
|
||||||
ctx = context.WithValue(ctx, request.PocketRequestTokenContextKey, session.Data.PocketRequestToken)
|
|
||||||
ctx = context.WithValue(ctx, request.LastForceRefreshContextKey, session.Data.LastForceRefresh)
|
ctx = context.WithValue(ctx, request.LastForceRefreshContextKey, session.Data.LastForceRefresh)
|
||||||
ctx = context.WithValue(ctx, request.WebAuthnDataContextKey, session.Data.WebAuthnSessionData)
|
ctx = context.WithValue(ctx, request.WebAuthnDataContextKey, session.Data.WebAuthnSessionData)
|
||||||
next.ServeHTTP(w, r.WithContext(ctx))
|
next.ServeHTTP(w, r.WithContext(ctx))
|
||||||
|
|
|
@ -69,11 +69,6 @@ func (s *Session) SetTheme(theme string) {
|
||||||
s.store.UpdateAppSessionField(s.sessionID, "theme", theme)
|
s.store.UpdateAppSessionField(s.sessionID, "theme", theme)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetPocketRequestToken updates Pocket Request Token.
|
|
||||||
func (s *Session) SetPocketRequestToken(requestToken string) {
|
|
||||||
s.store.UpdateAppSessionField(s.sessionID, "pocket_request_token", requestToken)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *Session) SetWebAuthnSessionData(sessionData *model.WebAuthnSession) {
|
func (s *Session) SetWebAuthnSessionData(sessionData *model.WebAuthnSession) {
|
||||||
s.store.UpdateAppSessionObjectField(s.sessionID, "webauthn_session_data", sessionData)
|
s.store.UpdateAppSessionObjectField(s.sessionID, "webauthn_session_data", sessionData)
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,8 +126,6 @@ func Serve(router *mux.Router, store *storage.Storage, pool *worker.Pool) {
|
||||||
uiRouter.HandleFunc("/settings", handler.updateSettings).Name("updateSettings").Methods(http.MethodPost)
|
uiRouter.HandleFunc("/settings", handler.updateSettings).Name("updateSettings").Methods(http.MethodPost)
|
||||||
uiRouter.HandleFunc("/integrations", handler.showIntegrationPage).Name("integrations").Methods(http.MethodGet)
|
uiRouter.HandleFunc("/integrations", handler.showIntegrationPage).Name("integrations").Methods(http.MethodGet)
|
||||||
uiRouter.HandleFunc("/integration", handler.updateIntegration).Name("updateIntegration").Methods(http.MethodPost)
|
uiRouter.HandleFunc("/integration", handler.updateIntegration).Name("updateIntegration").Methods(http.MethodPost)
|
||||||
uiRouter.HandleFunc("/integration/pocket/authorize", handler.pocketAuthorize).Name("pocketAuthorize").Methods(http.MethodGet)
|
|
||||||
uiRouter.HandleFunc("/integration/pocket/callback", handler.pocketCallback).Name("pocketCallback").Methods(http.MethodGet)
|
|
||||||
uiRouter.HandleFunc("/about", handler.showAboutPage).Name("about").Methods(http.MethodGet)
|
uiRouter.HandleFunc("/about", handler.showAboutPage).Name("about").Methods(http.MethodGet)
|
||||||
|
|
||||||
// Session pages.
|
// Session pages.
|
||||||
|
|
12
miniflux.1
12
miniflux.1
|
@ -1,5 +1,5 @@
|
||||||
.\" Manpage for miniflux.
|
.\" Manpage for miniflux.
|
||||||
.TH "MINIFLUX" "1" "April 11, 2025" "\ \&" "\ \&"
|
.TH "MINIFLUX" "1" "June 15, 2025" "\ \&" "\ \&"
|
||||||
|
|
||||||
.SH NAME
|
.SH NAME
|
||||||
miniflux \- Minimalist and opinionated feed reader
|
miniflux \- Minimalist and opinionated feed reader
|
||||||
|
@ -483,16 +483,6 @@ Set to 1 to authorize OAuth2 user creation\&.
|
||||||
.br
|
.br
|
||||||
Disabled by default\&.
|
Disabled by default\&.
|
||||||
.TP
|
.TP
|
||||||
.B POCKET_CONSUMER_KEY
|
|
||||||
Pocket consumer API key for all users\&.
|
|
||||||
.br
|
|
||||||
Default is empty\&.
|
|
||||||
.TP
|
|
||||||
.B POCKET_CONSUMER_KEY_FILE
|
|
||||||
Path to a secret key exposed as a file, it should contain $POCKET_CONSUMER_KEY value\&.
|
|
||||||
.br
|
|
||||||
Default is empty\&.
|
|
||||||
.TP
|
|
||||||
.B POLLING_FREQUENCY
|
.B POLLING_FREQUENCY
|
||||||
Refresh interval in minutes for feeds\&.
|
Refresh interval in minutes for feeds\&.
|
||||||
.br
|
.br
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue