aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Amrul Izwan <58427636+amrulizwan@users.noreply.github.com> 2022-10-13 21:50:26 +0800
committerGravatar GitHub <noreply@github.com> 2022-10-13 15:50:26 +0200
commitca1764f49226f490ba15b2b0dfc3b5553f30e2b3 (patch)
treecaefa9f0382065862342b830da3a23835773efa4
parent859aa84c2d62242885d8a696ca68ce474896a589 (diff)
Add id-🇮🇩 Translation (#4706)
* Add id-🇮🇩 Translation * Update id Translation for admin.php * make fix-all * Bahasa Indonesia * Fix typos config * Update user.php * make fix-all * Typographic quotes * make fix-all Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
-rw-r--r--.typos.toml1
-rw-r--r--app/i18n/cz/gen.php1
-rw-r--r--app/i18n/de/gen.php1
-rw-r--r--app/i18n/el/gen.php39
-rw-r--r--app/i18n/en-us/gen.php1
-rw-r--r--app/i18n/en/gen.php1
-rwxr-xr-xapp/i18n/es/gen.php1
-rw-r--r--app/i18n/fr/gen.php1
-rw-r--r--app/i18n/he/gen.php1
-rw-r--r--app/i18n/id/admin.php216
-rw-r--r--app/i18n/id/conf.php283
-rw-r--r--app/i18n/id/feedback.php144
-rw-r--r--app/i18n/id/gen.php237
-rw-r--r--app/i18n/id/index.php75
-rw-r--r--app/i18n/id/install.php133
-rw-r--r--app/i18n/id/sub.php213
-rw-r--r--app/i18n/id/user.php54
-rw-r--r--app/i18n/it/gen.php1
-rw-r--r--app/i18n/ja/gen.php1
-rw-r--r--app/i18n/ko/gen.php1
-rw-r--r--app/i18n/nl/gen.php1
-rw-r--r--app/i18n/oc/gen.php1
-rw-r--r--app/i18n/pl/gen.php1
-rw-r--r--app/i18n/pt-br/gen.php1
-rw-r--r--app/i18n/ru/gen.php1
-rw-r--r--app/i18n/sk/gen.php1
-rw-r--r--app/i18n/tr/gen.php1
-rw-r--r--app/i18n/zh-cn/gen.php1
-rw-r--r--app/i18n/zh-tw/gen.php1
29 files changed, 1395 insertions, 19 deletions
diff --git a/.typos.toml b/.typos.toml
index 2ae8b3088..d6582c946 100644
--- a/.typos.toml
+++ b/.typos.toml
@@ -18,6 +18,7 @@ extend-exclude = [
"app/i18n/es/",
"app/i18n/fr/",
"app/i18n/he/",
+ "app/i18n/id/",
"app/i18n/it/",
"app/i18n/ja/",
"app/i18n/ko/",
diff --git a/app/i18n/cz/gen.php b/app/i18n/cz/gen.php
index dcea66020..1db55bff7 100644
--- a/app/i18n/cz/gen.php
+++ b/app/i18n/cz/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE
diff --git a/app/i18n/de/gen.php b/app/i18n/de/gen.php
index a22d3d466..f4b885ca6 100644
--- a/app/i18n/de/gen.php
+++ b/app/i18n/de/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE
diff --git a/app/i18n/el/gen.php b/app/i18n/el/gen.php
index 576d01bb8..aed28cae7 100644
--- a/app/i18n/el/gen.php
+++ b/app/i18n/el/gen.php
@@ -138,25 +138,26 @@ return array(
'should_be_activated' => 'JavaScript must be enabled', // TODO
),
'lang' => array(
- 'cz' => 'Čeština', // TODO
- 'de' => 'Deutsch', // TODO
- 'en' => 'English', // TODO
- 'en-us' => 'English (United States)', // TODO
- 'es' => 'Español', // TODO
- 'fr' => 'Français', // TODO
- 'he' => 'עברית', // TODO
- 'it' => 'Italiano', // TODO
- 'ja' => '日本語', // TODO
- 'ko' => '한국어', // TODO
- 'nl' => 'Nederlands', // TODO
- 'oc' => 'Occitan', // TODO
- 'pl' => 'Polski', // TODO
- 'pt-br' => 'Português (Brasil)', // TODO
- 'ru' => 'Русский', // TODO
- 'sk' => 'Slovenčina', // TODO
- 'tr' => 'Türkçe', // TODO
- 'zh-cn' => '简体中文', // TODO
- 'zh-tw' => '正體中文', // TODO
+ 'cz' => 'Čeština', // IGNORE
+ 'de' => 'Deutsch', // IGNORE
+ 'en' => 'English', // IGNORE
+ 'en-us' => 'English (United States)', // IGNORE
+ 'es' => 'Español', // IGNORE
+ 'fr' => 'Français', // IGNORE
+ 'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
+ 'it' => 'Italiano', // IGNORE
+ 'ja' => '日本語', // IGNORE
+ 'ko' => '한국어', // IGNORE
+ 'nl' => 'Nederlands', // IGNORE
+ 'oc' => 'Occitan', // IGNORE
+ 'pl' => 'Polski', // IGNORE
+ 'pt-br' => 'Português (Brasil)', // IGNORE
+ 'ru' => 'Русский', // IGNORE
+ 'sk' => 'Slovenčina', // IGNORE
+ 'tr' => 'Türkçe', // IGNORE
+ 'zh-cn' => '简体中文', // IGNORE
+ 'zh-tw' => '正體中文', // IGNORE
),
'menu' => array(
'about' => 'About', // TODO
diff --git a/app/i18n/en-us/gen.php b/app/i18n/en-us/gen.php
index a818fa670..bc7f96157 100644
--- a/app/i18n/en-us/gen.php
+++ b/app/i18n/en-us/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE
diff --git a/app/i18n/en/gen.php b/app/i18n/en/gen.php
index c052f17fd..7d044959b 100644
--- a/app/i18n/en/gen.php
+++ b/app/i18n/en/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español',
'fr' => 'Français',
'he' => 'עברית',
+ 'id' => 'Bahasa Indonesia',
'it' => 'Italiano',
'ja' => '日本語',
'ko' => '한국어',
diff --git a/app/i18n/es/gen.php b/app/i18n/es/gen.php
index 92e1331e5..6de0b5343 100755
--- a/app/i18n/es/gen.php
+++ b/app/i18n/es/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE
diff --git a/app/i18n/fr/gen.php b/app/i18n/fr/gen.php
index 9fbd73642..b2157fa69 100644
--- a/app/i18n/fr/gen.php
+++ b/app/i18n/fr/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE
diff --git a/app/i18n/he/gen.php b/app/i18n/he/gen.php
index c50f0fef7..ab1996326 100644
--- a/app/i18n/he/gen.php
+++ b/app/i18n/he/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE
diff --git a/app/i18n/id/admin.php b/app/i18n/id/admin.php
new file mode 100644
index 000000000..eba48647b
--- /dev/null
+++ b/app/i18n/id/admin.php
@@ -0,0 +1,216 @@
+<?php
+
+/******************************************************************************/
+/* Each entry of that file can be associated with a comment to indicate its */
+/* state. When there is no comment, it means the entry is fully translated. */
+/* The recognized comments are (comment matching is case-insensitive): */
+/* + TODO: the entry has never been translated. */
+/* + DIRTY: the entry has been translated but needs to be updated. */
+/* + IGNORE: the entry does not need to be translated. */
+/* When a comment is not recognized, it is discarded. */
+/******************************************************************************/
+
+return array(
+ 'auth' => array(
+ 'allow_anonymous' => 'Izinkan pembacaan anonim artikel pengguna default (%s)',
+ 'allow_anonymous_refresh' => 'Izinkan refresh artikel anonim',
+ 'api_enabled' => 'Izinkan <abbr>API</abbr> akses <small>(Diperlukan untuk aplikasi seluler)</small>', // DIRTY
+ 'form' => 'Web form (traditional, membutuhkan JavaScript)',
+ 'http' => 'HTTP (untuk pengguna tingkat lanjut HTTPS)',
+ 'none' => 'None (dangerous)', // TODO
+ 'title' => 'Authentication', // TODO
+ 'token' => 'Authentication token', // TODO
+ 'token_help' => 'Memungkinkan akses ke output RSS dari pengguna default tanpa otentikasi:',
+ 'type' => 'Authentication method', // TODO
+ 'unsafe_autologin' => 'Izinkan login otomatis yang tidak aman menggunakan format: ',
+ ),
+ 'check_install' => array(
+ 'cache' => array(
+ 'nok' => 'Periksa izin <em>./data/cache</em> direktori. HTTP server harus memiliki izin menulis.',
+ 'ok' => 'Izin pada direktori cache bagus.', // DIRTY
+ ),
+ 'categories' => array(
+ 'nok' => 'Tabel kategori dikonfigurasi secara tidak tepat.',
+ 'ok' => 'Tabel kategori baik-baik saja.',
+ ),
+ 'connection' => array(
+ 'nok' => 'Koneksi ke database tidak dapat dibuat.',
+ 'ok' => 'Koneksi ke database berhasil.',
+ ),
+ 'ctype' => array(
+ 'nok' => 'Tidak dapat menemukan library yang diperlukan untuk pemeriksaan jenis karakter (php-ctype).',
+ 'ok' => 'Anda memiliki library yang dibutuhkan untuk pemeriksaan jenis karakter (ctype).',
+ ),
+ 'curl' => array(
+ 'nok' => 'Tidak dapat menemukan cURL library (php-curl package).',
+ 'ok' => 'Kamu punya cURL library.',
+ ),
+ 'data' => array(
+ 'nok' => 'Periksa izin <em>./data</em> direktori. HTTP server harus memiliki izin tulis.',
+ 'ok' => 'Izin pada direktori data bagus.',
+ ),
+ 'database' => 'Database installation', // TODO
+ 'dom' => array(
+ 'nok' => 'Tidak dapat menemukan library yang diperlukan untuk menelusuri DOM (php-xml package).',
+ 'ok' => 'Anda memiliki library yang diperlukan untuk menelusuri DOM.',
+ ),
+ 'entries' => array(
+ 'nok' => 'Tabel entri dikonfigurasi secara tidak benar.',
+ 'ok' => 'Tabel entri baik-baik saja.',
+ ),
+ 'favicons' => array(
+ 'nok' => 'Periksa izin on <em>./data/favicons</em> direktori. HTTP server harus memiliki izin tulis.',
+ 'ok' => 'Izin di Direktori Favicons bagus.',
+ ),
+ 'feeds' => array(
+ 'nok' => 'Tabel feed dikonfigurasi secara tidak benar.',
+ 'ok' => 'Feed table is okay.', // TODO
+ ),
+ 'fileinfo' => array(
+ 'nok' => 'Tidak dapat menemukan PHP fileinfo library (fileinfo package).',
+ 'ok' => 'You have the fileinfo library.', // TODO
+ ),
+ 'files' => 'File installation', // TODO
+ 'json' => array(
+ 'nok' => 'Tidak dapat menemukan JSON (php-json package).',
+ 'ok' => 'You have the JSON extension.', // TODO
+ ),
+ 'mbstring' => array(
+ 'nok' => 'Tidak dapat menemukan mbstring library untuk Unicode.',
+ 'ok' => 'Anda memiliki mbstring library untuk Unicode.',
+ ),
+ 'pcre' => array(
+ 'nok' => 'Tidak dapat menemukan library untuk regular expressions (php-pcre).',
+ 'ok' => 'Anda memiliki library untuk regular expressions (PCRE).',
+ ),
+ 'pdo' => array(
+ 'nok' => 'Tidak dapat menemukan PDO salah satu drivers yang didukung (pdo_mysql, pdo_sqlite, pdo_pgsql).',
+ 'ok' => 'Anda memiliki PDO dan setidaknya salah satu drivers yang didukung (pdo_mysql, pdo_sqlite, pdo_pgsql).',
+ ),
+ 'php' => array(
+ '_' => 'PHP installation', // TODO
+ 'nok' => 'Your PHP version is %s but FreshRSS requires at least version %s.', // TODO
+ 'ok' => 'Your PHP version (%s) is compatible with FreshRSS.', // TODO
+ ),
+ 'tables' => array(
+ 'nok' => 'Ada satu atau lebih tabel yang hilang dalam database.',
+ 'ok' => 'Tabel yang sesuai ada dalam database.',
+ ),
+ 'title' => 'Installation check', // TODO
+ 'tokens' => array(
+ 'nok' => 'Periksa izin pada <em>./data/tokens</em> direktori. HTTP server harus memiliki izin menulis',
+ 'ok' => 'Izin pada direktori token bagus.',
+ ),
+ 'users' => array(
+ 'nok' => 'Periksa izin <em>./data/users</em> direktori. HTTP server harus memiliki izin menulis',
+ 'ok' => 'Izin pada direktori pengguna bagus.',
+ ),
+ 'zip' => array(
+ 'nok' => 'Tidak dapat menemukan ekstensi zip (php-zip package).',
+ 'ok' => 'Anda memiliki ekstensi zip.',
+ ),
+ ),
+ 'extensions' => array(
+ 'author' => 'Pengarang',
+ 'community' => 'Ekstensi komunitas yang tersedia',
+ 'description' => 'Keterangan',
+ 'disabled' => 'Disabled', // TODO
+ 'empty_list' => 'Tidak ada ekstensi terpasang',
+ 'enabled' => 'Enabled', // TODO
+ 'latest' => 'Installed', // TODO
+ 'name' => 'Name', // TODO
+ 'no_configure_view' => 'Ekstensi ini tidak dapat dikonfigurasi.',
+ 'system' => array(
+ '_' => 'System extensions', // TODO
+ 'no_rights' => 'System extension (Anda tidak memiliki izin yang diperlukan)',
+ ),
+ 'title' => 'Extensions', // TODO
+ 'update' => 'Pembaruan tersedia',
+ 'user' => 'User extensions', // TODO
+ 'version' => 'Version', // TODO
+ ),
+ 'stats' => array(
+ '_' => 'Statistik',
+ 'all_feeds' => 'Semua feed',
+ 'category' => 'Kategori',
+ 'entry_count' => 'Entri masuk',
+ 'entry_per_category' => 'Entri per kategori',
+ 'entry_per_day' => 'Entri per hari (30 hari terakhir)',
+ 'entry_per_day_of_week' => 'Per hari dalam seminggu (rata-rata: %.2f pesan)',
+ 'entry_per_hour' => 'Per jam (rata-rata %.2f pesan)',
+ 'entry_per_month' => 'Per bulan (rata -rata: %.2f pesan)',
+ 'entry_repartition' => 'Mengembalikan entri',
+ 'feed' => 'Feed', // TODO
+ 'feed_per_category' => 'Feed per kategori',
+ 'idle' => 'Feed idle',
+ 'main' => 'Statistik utama',
+ 'main_stream' => 'Aliran utama',
+ 'no_idle' => 'Tidak ada idle feed!',
+ 'number_entries' => '%d artikel',
+ 'percent_of_total' => '%% dari total',
+ 'repartition' => 'Mengembalikan artikel',
+ 'status_favorites' => 'Favorites',
+ 'status_read' => 'Read', // TODO
+ 'status_total' => 'Total', // TODO
+ 'status_unread' => 'Unread', // TODO
+ 'title' => 'Statistik',
+ 'top_feed' => 'Sepuluh feed teratas',
+ ),
+ 'system' => array(
+ '_' => 'Sistem konfigurasi',
+ 'auto-update-url' => 'Auto-update server URL', // TODO
+ 'cookie-duration' => array(
+ 'help' => 'dalam hitungan detik',
+ 'number' => 'Durasi untuk terus masuk',
+ ),
+ 'force_email_validation' => 'Validasi alamat email paksa',
+ 'instance-name' => 'Nama instansi',
+ 'max-categories' => 'Jumlah kategori maksimal per pengguna',
+ 'max-feeds' => 'Maksimal Jumlah Feed Per Pengguna',
+ 'registration' => array(
+ 'number' => 'Jumlah Akun Maks',
+ 'select' => array(
+ 'label' => 'Formulir pendaftaran',
+ 'option' => array(
+ 'noform' => 'Disabled: Tidak ada formulir pendaftaran',
+ 'nolimit' => 'Enabled: Tidak ada batasan akun',
+ 'setaccountsnumber' => 'Setel Max. jumlah akun',
+ ),
+ ),
+ 'status' => array(
+ 'disabled' => 'Form disabled', // TODO
+ 'enabled' => 'Form enabled', // TODO
+ ),
+ 'title' => 'Formulir Pendaftaran Pengguna',
+ ),
+ ),
+ 'update' => array(
+ '_' => 'Update system', // TODO
+ 'apply' => 'Apply', // TODO
+ 'check' => 'Periksa pembaruan baru',
+ 'current_version' => 'Versi FreshRSS saat ini adalah %s.',
+ 'last' => 'Verifikasi terakhir: %s',
+ 'none' => 'Tidak ada pembaruan untuk diterapkan',
+ 'title' => 'Perbarui Sistem',
+ ),
+ 'user' => array(
+ 'admin' => 'Administrator', // TODO
+ 'article_count' => 'Artikel',
+ 'back_to_manage' => '← Kembali ke Daftar Pengguna',
+ 'create' => 'Buat pengguna baru',
+ 'database_size' => 'Ukuran database',
+ 'email' => 'Alamat email',
+ 'enabled' => 'Enabled', // TODO
+ 'feed_count' => 'Feeds', // TODO
+ 'is_admin' => 'Is admin', // TODO
+ 'language' => 'Bahasa',
+ 'last_user_activity' => 'Aktivitas pengguna terakhir',
+ 'list' => 'Daftar pengguna',
+ 'number' => 'Ada %d akun telah dibuat',
+ 'numbers' => 'Ada %d akun dibuat',
+ 'password_form' => 'Password<br /><small>(Untuk metode login bentuk web)</small>',
+ 'password_format' => 'Setidaknya 7 karakter',
+ 'title' => 'Kelola pengguna',
+ 'username' => 'Username', // TODO
+ ),
+);
diff --git a/app/i18n/id/conf.php b/app/i18n/id/conf.php
new file mode 100644
index 000000000..5e3a313db
--- /dev/null
+++ b/app/i18n/id/conf.php
@@ -0,0 +1,283 @@
+<?php
+
+/******************************************************************************/
+/* Each entry of that file can be associated with a comment to indicate its */
+/* state. When there is no comment, it means the entry is fully translated. */
+/* The recognized comments are (comment matching is case-insensitive): */
+/* + TODO: the entry has never been translated. */
+/* + DIRTY: the entry has been translated but needs to be updated. */
+/* + IGNORE: the entry does not need to be translated. */
+/* When a comment is not recognized, it is discarded. */
+/******************************************************************************/
+
+return array(
+ 'archiving' => array(
+ '_' => 'Archiving', // TODO
+ 'exception' => 'Purge exception', // TODO
+ 'help' => 'More options are available in the individual feed’s settings', // TODO
+ 'keep_favourites' => 'Never delete favorites',
+ 'keep_labels' => 'Never delete labels', // TODO
+ 'keep_max' => 'Maximum number of articles to keep', // TODO
+ 'keep_min_by_feed' => 'Minimum number of articles to keep per feed', // TODO
+ 'keep_period' => 'Maximum age of articles to keep', // TODO
+ 'keep_unreads' => 'Never delete unread articles', // TODO
+ 'maintenance' => 'Maintenance', // TODO
+ 'optimize' => 'Optimize database', // TODO
+ 'optimize_help' => 'Run occasionally to reduce the size of the database', // TODO
+ 'policy' => 'Purge policy', // TODO
+ 'policy_warning' => 'If no purge policy is selected, every article will be kept.', // TODO
+ 'purge_now' => 'Purge now', // TODO
+ 'title' => 'Archiving', // TODO
+ 'ttl' => 'Do not automatically refresh more often than', // TODO
+ ),
+ 'display' => array(
+ '_' => 'Display', // TODO
+ 'icon' => array(
+ 'bottom_line' => 'Bottom line', // TODO
+ 'display_authors' => 'Authors', // TODO
+ 'entry' => 'Article icons', // TODO
+ 'publication_date' => 'Date of publication', // TODO
+ 'related_tags' => 'Article tags', // TODO
+ 'sharing' => 'Sharing', // TODO
+ 'summary' => 'Summary', // TODO
+ 'top_line' => 'Top line', // TODO
+ ),
+ 'language' => 'Language', // TODO
+ 'notif_html5' => array(
+ 'seconds' => 'seconds (0 means no timeout)', // TODO
+ 'timeout' => 'HTML5 notification timeout', // TODO
+ ),
+ 'show_nav_buttons' => 'Show the navigation buttons', // TODO
+ 'theme' => 'Theme', // TODO
+ 'theme_not_available' => 'The “%s” theme is not available anymore. Please choose another theme.', // TODO
+ 'thumbnail' => array(
+ 'label' => 'Thumbnail', // TODO
+ 'landscape' => 'Landscape', // TODO
+ 'none' => 'None', // TODO
+ 'portrait' => 'Portrait', // TODO
+ 'square' => 'Square', // TODO
+ ),
+ 'title' => 'Display', // TODO
+ 'width' => array(
+ 'content' => 'Content width', // TODO
+ 'large' => 'Wide', // TODO
+ 'medium' => 'Medium', // TODO
+ 'no_limit' => 'Full Width', // TODO
+ 'thin' => 'Narrow', // TODO
+ ),
+ ),
+ 'logs' => array(
+ 'loglist' => array(
+ 'level' => 'Log Level', // TODO
+ 'message' => 'Log Message', // TODO
+ 'timestamp' => 'Timestamp', // TODO
+ ),
+ 'pagination' => array(
+ 'first' => 'First', // TODO
+ 'last' => 'Last', // TODO
+ 'next' => 'Next', // TODO
+ 'previous' => 'Previous', // TODO
+ ),
+ ),
+ 'profile' => array(
+ '_' => 'Profile management', // TODO
+ 'api' => 'API management', // TODO
+ 'delete' => array(
+ '_' => 'Account deletion', // TODO
+ 'warn' => 'Your account and all related data will be deleted.', // TODO
+ ),
+ 'email' => 'Email address', // TODO
+ 'password_api' => 'API password<br /><small>(e.g., for mobile apps)</small>', // TODO
+ 'password_form' => 'Password<br /><small>(for the Web-form login method)</small>', // TODO
+ 'password_format' => 'At least 7 characters', // TODO
+ 'title' => 'Profile', // TODO
+ ),
+ 'query' => array(
+ '_' => 'User queries', // TODO
+ 'deprecated' => 'This query is no longer valid. The referenced category or feed has been deleted.', // TODO
+ 'filter' => array(
+ '_' => 'Filter applied:', // TODO
+ 'categories' => 'Display by category', // TODO
+ 'feeds' => 'Display by feed', // TODO
+ 'order' => 'Sort by date', // TODO
+ 'search' => 'Expression', // TODO
+ 'state' => 'State', // TODO
+ 'tags' => 'Display by tag', // TODO
+ 'type' => 'Type', // TODO
+ ),
+ 'get_all' => 'Display all articles', // TODO
+ 'get_category' => 'Display “%s” category', // TODO
+ 'get_favorite' => 'Display favorite articles',
+ 'get_feed' => 'Display “%s” feed', // TODO
+ 'name' => 'Name', // TODO
+ 'no_filter' => 'No filter', // TODO
+ 'number' => 'Query n°%d', // TODO
+ 'order_asc' => 'Display oldest articles first', // TODO
+ 'order_desc' => 'Display newest articles first', // TODO
+ 'search' => 'Search for “%s”', // TODO
+ 'state_0' => 'Display all articles', // TODO
+ 'state_1' => 'Display read articles', // TODO
+ 'state_2' => 'Display unread articles', // TODO
+ 'state_3' => 'Display all articles', // TODO
+ 'state_4' => 'Display favorite articles',
+ 'state_5' => 'Display read favorite articles',
+ 'state_6' => 'Display unread favorite articles',
+ 'state_7' => 'Display favorite articles',
+ 'state_8' => 'Display not favorite articles',
+ 'state_9' => 'Display read not favorite articles',
+ 'state_10' => 'Display unread not favorite articles',
+ 'state_11' => 'Display not favorite articles',
+ 'state_12' => 'Display all articles', // TODO
+ 'state_13' => 'Display read articles', // TODO
+ 'state_14' => 'Display unread articles', // TODO
+ 'state_15' => 'Display all articles', // TODO
+ 'title' => 'User queries', // TODO
+ ),
+ 'reading' => array(
+ '_' => 'Reading', // TODO
+ 'after_onread' => 'After “mark all as read”,', // TODO
+ 'always_show_favorites' => 'Show all articles in favorites by default',
+ 'article' => array(
+ 'authors_date' => array(
+ '_' => 'Authors and date', // TODO
+ 'both' => 'In header and footer', // TODO
+ 'footer' => 'In footer', // TODO
+ 'header' => 'In header', // TODO
+ 'none' => 'None', // TODO
+ ),
+ 'feed_name' => array(
+ 'above_title' => 'Above title/tags', // TODO
+ 'none' => 'None', // TODO
+ 'with_authors' => 'In authors and date row', // TODO
+ ),
+ 'feed_title' => 'Feed title', // TODO
+ 'tags' => array(
+ '_' => 'Tags', // TODO
+ 'both' => 'In header and footer', // TODO
+ 'footer' => 'In footer', // TODO
+ 'header' => 'In header', // TODO
+ 'none' => 'None', // TODO
+ ),
+ 'tags_max' => array(
+ '_' => 'Max number of tags shown', // TODO
+ 'help' => '0 means: show all tags and do not collapse them', // TODO
+ ),
+ ),
+ 'articles_per_page' => 'Number of articles per page', // TODO
+ 'auto_load_more' => 'Load more articles at the bottom of the page', // TODO
+ 'auto_remove_article' => 'Hide articles after reading', // TODO
+ 'confirm_enabled' => 'Display a confirmation dialog on “mark all as read” actions', // TODO
+ 'display_articles_unfolded' => 'Show articles unfolded by default', // TODO
+ 'display_categories_unfolded' => 'Categories to unfold', // TODO
+ 'headline' => array(
+ 'articles' => 'Articles: Open/Close', // TODO
+ 'articles_header_footer' => 'Articles: header/footer', // TODO
+ 'categories' => 'Left navigation: Categories', // TODO
+ 'mark_as_read' => 'Mark article as read', // TODO
+ 'misc' => 'Miscellaneous', // TODO
+ 'view' => 'View', // TODO
+ ),
+ 'hide_read_feeds' => 'Hide categories & feeds with no unread articles (does not work with “Show all articles” configuration)', // TODO
+ 'img_with_lazyload' => 'Use “lazy load” mode to load pictures', // DIRTY
+ 'jump_next' => 'jump to next unread sibling (feed or category)', // TODO
+ 'mark_updated_article_unread' => 'Mark updated articles as unread', // TODO
+ 'number_divided_when_reader' => 'Divide by 2 in the reading view.', // TODO
+ 'read' => array(
+ 'article_open_on_website' => 'when the article is opened on its original website', // TODO
+ 'article_viewed' => 'when the article is viewed', // TODO
+ 'keep_max_n_unread' => 'Max number of articles to keep unread', // TODO
+ 'scroll' => 'while scrolling', // TODO
+ 'upon_gone' => 'when it is no longer in the upstream news feed', // TODO
+ 'upon_reception' => 'upon receiving the article', // TODO
+ 'when' => 'Mark an article as read…', // TODO
+ 'when_same_title' => 'if an identical title already exists in the top <i>n</i> newest articles', // TODO
+ ),
+ 'show' => array(
+ '_' => 'Articles to display', // TODO
+ 'active_category' => 'Active category', // TODO
+ 'adaptive' => 'Adjust showing', // TODO
+ 'all_articles' => 'Show all articles', // TODO
+ 'all_categories' => 'All categories', // TODO
+ 'no_category' => 'No category', // TODO
+ 'remember_categories' => 'Remember open categories', // TODO
+ 'unread' => 'Show only unread', // TODO
+ ),
+ 'show_fav_unread_help' => 'Applies also on labels', // TODO
+ 'sides_close_article' => 'Clicking outside of article text area closes the article', // TODO
+ 'sort' => array(
+ '_' => 'Sort order', // TODO
+ 'newer_first' => 'Newest first', // TODO
+ 'older_first' => 'Oldest first', // TODO
+ ),
+ 'sticky_post' => 'Stick the article to the top when opened', // TODO
+ 'title' => 'Reading', // TODO
+ 'view' => array(
+ 'default' => 'Default view', // TODO
+ 'global' => 'Global view', // TODO
+ 'normal' => 'Normal view', // TODO
+ 'reader' => 'Reading view', // TODO
+ ),
+ ),
+ 'sharing' => array(
+ '_' => 'Sharing', // TODO
+ 'add' => 'Add a sharing method', // TODO
+ 'blogotext' => 'Blogotext', // TODO
+ 'deprecated' => 'This service is deprecated and will be removed from FreshRSS in a <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="Open documentation for more information" target="_blank">future release</a>.', // TODO
+ 'diaspora' => 'Diaspora*', // TODO
+ 'email' => 'Email', // TODO
+ 'facebook' => 'Facebook', // TODO
+ 'more_information' => 'More information', // TODO
+ 'print' => 'Print', // TODO
+ 'raindrop' => 'Raindrop.io', // TODO
+ 'remove' => 'Remove sharing method', // TODO
+ 'shaarli' => 'Shaarli', // TODO
+ 'share_name' => 'Share name to display', // TODO
+ 'share_url' => 'Share URL to use', // TODO
+ 'title' => 'Sharing', // TODO
+ 'twitter' => 'Twitter', // TODO
+ 'wallabag' => 'wallabag', // TODO
+ ),
+ 'shortcut' => array(
+ '_' => 'Shortcuts', // TODO
+ 'article_action' => 'Article actions', // TODO
+ 'auto_share' => 'Share', // TODO
+ 'auto_share_help' => 'If there is only one sharing mode, it is used. Otherwise, modes are accessible by their number.', // TODO
+ 'close_dropdown' => 'Close menus', // TODO
+ 'collapse_article' => 'Collapse', // TODO
+ 'first_article' => 'Open the first article', // TODO
+ 'focus_search' => 'Access search box', // TODO
+ 'global_view' => 'Switch to global view', // TODO
+ 'help' => 'Display documentation', // TODO
+ 'javascript' => 'JavaScript must be enabled in order to use shortcuts', // TODO
+ 'last_article' => 'Open the last article', // TODO
+ 'load_more' => 'Load more articles', // TODO
+ 'mark_favorite' => 'Toggle favorite',
+ 'mark_read' => 'Toggle read', // TODO
+ 'navigation' => 'Navigation', // TODO
+ 'navigation_help' => 'With the <kbd>⇧ Shift</kbd> modifier, navigation shortcuts apply on feeds.<br/>With the <kbd>Alt ⎇</kbd> modifier, navigation shortcuts apply on categories.', // TODO
+ 'navigation_no_mod_help' => 'The following navigation shortcuts do not support modifiers.', // TODO
+ 'next_article' => 'Open the next article', // TODO
+ 'next_unread_article' => 'Open the next unread article', // TODO
+ 'non_standard' => 'Some keys (<kbd>%s</kbd>) may not work as shortcuts.', // TODO
+ 'normal_view' => 'Switch to normal view', // TODO
+ 'other_action' => 'Other actions', // TODO
+ 'previous_article' => 'Open the previous article', // TODO
+ 'reading_view' => 'Switch to reading view', // TODO
+ 'rss_view' => 'Open as RSS feed', // TODO
+ 'see_on_website' => 'See on original website', // TODO
+ 'shift_for_all_read' => '+ <kbd>Alt ⎇</kbd> to mark previous articles as read<br />+ <kbd>⇧ Shift</kbd> to mark all articles as read', // TODO
+ 'skip_next_article' => 'Focus next without opening', // TODO
+ 'skip_previous_article' => 'Focus previous without opening', // TODO
+ 'title' => 'Shortcuts', // TODO
+ 'toggle_media' => 'Play/pause media', // TODO
+ 'user_filter' => 'Access user queries', // TODO
+ 'user_filter_help' => 'If there is only one user query, it is used. Otherwise, queries are accessible by their number.', // TODO
+ 'views' => 'Views', // TODO
+ ),
+ 'user' => array(
+ 'articles_and_size' => '%s articles (%s)', // TODO
+ 'current' => 'Current user', // TODO
+ 'is_admin' => 'is administrator', // TODO
+ 'users' => 'Users', // TODO
+ ),
+);
diff --git a/app/i18n/id/feedback.php b/app/i18n/id/feedback.php
new file mode 100644
index 000000000..44ccab23d
--- /dev/null
+++ b/app/i18n/id/feedback.php
@@ -0,0 +1,144 @@
+<?php
+
+/******************************************************************************/
+/* Each entry of that file can be associated with a comment to indicate its */
+/* state. When there is no comment, it means the entry is fully translated. */
+/* The recognized comments are (comment matching is case-insensitive): */
+/* + TODO: the entry has never been translated. */
+/* + DIRTY: the entry has been translated but needs to be updated. */
+/* + IGNORE: the entry does not need to be translated. */
+/* When a comment is not recognized, it is discarded. */
+/******************************************************************************/
+
+return array(
+ 'access' => array(
+ 'denied' => 'You don’t have permission to access this page', // TODO
+ 'not_found' => 'You are looking for a page that doesn’t exist', // TODO
+ ),
+ 'admin' => array(
+ 'optimization_complete' => 'Optimization complete', // TODO
+ ),
+ 'api' => array(
+ 'password' => array(
+ 'failed' => 'Your password cannot be modified', // TODO
+ 'updated' => 'Your password has been modified', // TODO
+ ),
+ ),
+ 'auth' => array(
+ 'login' => array(
+ 'invalid' => 'Login is invalid', // TODO
+ 'success' => 'You are connected', // TODO
+ ),
+ 'logout' => array(
+ 'success' => 'You are disconnected', // TODO
+ ),
+ ),
+ 'conf' => array(
+ 'error' => 'An error occurred while saving configuration', // TODO
+ 'query_created' => 'Query “%s” has been created.', // TODO
+ 'shortcuts_updated' => 'Shortcuts have been updated', // TODO
+ 'updated' => 'Configuration has been updated', // TODO
+ ),
+ 'extensions' => array(
+ 'already_enabled' => '%s is already enabled', // TODO
+ 'cannot_remove' => '%s cannot be removed', // TODO
+ 'disable' => array(
+ 'ko' => '%s cannot be disabled. <a href="%s">Check FreshRSS logs</a> for details.', // TODO
+ 'ok' => '%s is now disabled', // TODO
+ ),
+ 'enable' => array(
+ 'ko' => '%s cannot be enabled. <a href="%s">Check FreshRSS logs</a> for details.', // TODO
+ 'ok' => '%s is now enabled', // TODO
+ ),
+ 'no_access' => 'You have no access on %s', // TODO
+ 'not_enabled' => '%s is not enabled', // TODO
+ 'not_found' => '%s does not exist', // TODO
+ 'removed' => '%s removed', // TODO
+ ),
+ 'import_export' => array(
+ 'export_no_zip_extension' => 'The ZIP extension is not present on your server. Please try to export files one by one.', // TODO
+ 'feeds_imported' => 'Your feeds have been imported and will now be updated', // TODO
+ 'feeds_imported_with_errors' => 'Your feeds have been imported, but some errors occurred', // TODO
+ 'file_cannot_be_uploaded' => 'File cannot be uploaded!', // TODO
+ 'no_zip_extension' => 'The ZIP extension is not present on your server.', // TODO
+ 'zip_error' => 'An error occurred during ZIP import.', // TODO
+ ),
+ 'profile' => array(
+ 'error' => 'Your profile cannot be modified', // TODO
+ 'updated' => 'Your profile has been modified', // TODO
+ ),
+ 'sub' => array(
+ 'actualize' => 'Updating', // TODO
+ 'articles' => array(
+ 'marked_read' => 'The selected articles have been marked as read.', // TODO
+ 'marked_unread' => 'The articles have been marked as unread.', // TODO
+ ),
+ 'category' => array(
+ 'created' => 'Category %s has been created.', // TODO
+ 'deleted' => 'Category has been deleted.', // TODO
+ 'emptied' => 'Category has been emptied', // TODO
+ 'error' => 'Category cannot be updated', // TODO
+ 'name_exists' => 'Category name already exists.', // TODO
+ 'no_id' => 'You must specify the id of the category.', // TODO
+ 'no_name' => 'Category name cannot be empty.', // TODO
+ 'not_delete_default' => 'You cannot delete the default category!', // TODO
+ 'not_exist' => 'The category does not exist!', // TODO
+ 'over_max' => 'You have reached your limit of categories (%d)', // TODO
+ 'updated' => 'Category has been updated.', // TODO
+ ),
+ 'feed' => array(
+ 'actualized' => '<em>%s</em> has been updated', // TODO
+ 'actualizeds' => 'RSS feeds have been updated', // TODO
+ 'added' => 'RSS feed <em>%s</em> has been added', // TODO
+ 'already_subscribed' => 'You have already subscribed to <em>%s</em>', // TODO
+ 'cache_cleared' => '<em>%s</em> cache has been cleared', // TODO
+ 'deleted' => 'Feed has been deleted', // TODO
+ 'error' => 'Feed cannot be updated', // TODO
+ 'internal_problem' => 'The newsfeed could not be added. <a href="%s">Check FreshRSS logs</a> for details. You can try force adding by appending <code>#force_feed</code> to the URL.', // TODO
+ 'invalid_url' => 'URL <em>%s</em> is invalid', // TODO
+ 'n_actualized' => '%d feeds have been updated', // TODO
+ 'n_entries_deleted' => '%d articles have been deleted', // TODO
+ 'no_refresh' => 'There are no feeds to refresh', // TODO
+ 'not_added' => '<em>%s</em> could not be added', // TODO
+ 'not_found' => 'Feed cannot be found', // TODO
+ 'over_max' => 'You have reached your limit of feeds (%d)', // TODO
+ 'reloaded' => '<em>%s</em> has been reloaded', // TODO
+ 'selector_preview' => array(
+ 'http_error' => 'Failed to load website content.', // TODO
+ 'no_entries' => 'There are no articles in this feed. You need at least one article to create a preview.', // TODO
+ 'no_feed' => 'Internal error (feed cannot be found).', // TODO
+ 'no_result' => 'The selector didn’t match anything. As a fallback the original feed text will be displayed instead.', // TODO
+ 'selector_empty' => 'The selector is empty. You need to define one to create a preview.', // TODO
+ ),
+ 'updated' => 'Feed has been updated', // TODO
+ ),
+ 'purge_completed' => 'Purge completed (%d articles deleted)', // TODO
+ ),
+ 'tag' => array(
+ 'created' => 'Tag “%s”has been created.', // DIRTY
+ 'name_exists' => 'Tag name already exists.', // TODO
+ 'renamed' => 'Tag “%s”has been renamed to “%s”.', // DIRTY
+ ),
+ 'update' => array(
+ 'can_apply' => 'FreshRSS will now be updated to the <strong>version %s</strong>.', // TODO
+ 'error' => 'The update process has encountered an error: %s', // TODO
+ 'file_is_nok' => 'New <strong>version %s</strong> available, but check permissions on <em>%s</em> directory. HTTP server must have have write permission', // TODO
+ 'finished' => 'Update complete!', // TODO
+ 'none' => 'No update to apply', // TODO
+ 'server_not_found' => 'Update server cannot be found. [%s]', // TODO
+ ),
+ 'user' => array(
+ 'created' => array(
+ '_' => 'User %s has been created', // TODO
+ 'error' => 'User %s cannot be created', // TODO
+ ),
+ 'deleted' => array(
+ '_' => 'User %s has been deleted', // TODO
+ 'error' => 'User %s cannot be deleted', // TODO
+ ),
+ 'updated' => array(
+ '_' => 'User %s has been updated', // TODO
+ 'error' => 'User %s has not been updated', // TODO
+ ),
+ ),
+);
diff --git a/app/i18n/id/gen.php b/app/i18n/id/gen.php
new file mode 100644
index 000000000..c1a1b9424
--- /dev/null
+++ b/app/i18n/id/gen.php
@@ -0,0 +1,237 @@
+<?php
+
+/******************************************************************************/
+/* Each entry of that file can be associated with a comment to indicate its */
+/* state. When there is no comment, it means the entry is fully translated. */
+/* The recognized comments are (comment matching is case-insensitive): */
+/* + TODO: the entry has never been translated. */
+/* + DIRTY: the entry has been translated but needs to be updated. */
+/* + IGNORE: the entry does not need to be translated. */
+/* When a comment is not recognized, it is discarded. */
+/******************************************************************************/
+
+return array(
+ 'action' => array(
+ 'actualize' => 'Update feeds', // TODO
+ 'add' => 'Add', // TODO
+ 'back' => '← Go back', // TODO
+ 'back_to_rss_feeds' => '← Go back to your RSS feeds', // TODO
+ 'cancel' => 'Cancel', // TODO
+ 'create' => 'Create', // TODO
+ 'delete_muted_feeds' => 'Delete muted feeds', // TODO
+ 'demote' => 'Demote', // TODO
+ 'disable' => 'Disable', // TODO
+ 'empty' => 'Empty', // TODO
+ 'enable' => 'Enable', // TODO
+ 'export' => 'Export', // TODO
+ 'filter' => 'Filter', // TODO
+ 'import' => 'Import', // TODO
+ 'load_default_shortcuts' => 'Load default shortcuts', // TODO
+ 'manage' => 'Manage', // TODO
+ 'mark_read' => 'Mark as read', // TODO
+ 'open_url' => 'Open URL', // TODO
+ 'promote' => 'Promote', // TODO
+ 'purge' => 'Purge', // TODO
+ 'refresh_opml' => 'Refresh OPML', // TODO
+ 'remove' => 'Remove', // TODO
+ 'rename' => 'Rename', // TODO
+ 'see_website' => 'See website', // TODO
+ 'submit' => 'Submit', // TODO
+ 'truncate' => 'Delete all articles', // TODO
+ 'update' => 'Update', // TODO
+ ),
+ 'auth' => array(
+ 'accept_tos' => 'I accept the <a href="%s">Terms of Service</a>.', // TODO
+ 'email' => 'Email address', // TODO
+ 'keep_logged_in' => 'Keep me logged in <small>(%s days)</small>', // DIRTY
+ 'login' => 'Login', // TODO
+ 'logout' => 'Logout', // TODO
+ 'password' => array(
+ '_' => 'Password', // TODO
+ 'format' => '<small>At least 7 characters</small>', // TODO
+ ),
+ 'registration' => array(
+ '_' => 'New account', // TODO
+ 'ask' => 'Create an account?', // TODO
+ 'title' => 'Account creation', // TODO
+ ),
+ 'username' => array(
+ '_' => 'Username', // TODO
+ 'format' => '<small>Maximum 16 alphanumeric characters</small>', // TODO
+ ),
+ ),
+ 'date' => array(
+ 'Apr' => '\\A\\p\\r\\i\\l', // TODO
+ 'Aug' => '\\A\\u\\g\\u\\s\\t', // TODO
+ 'Dec' => '\\D\\e\\c\\e\\m\\b\\e\\r', // TODO
+ 'Feb' => '\\F\\e\\b\\r\\u\\a\\r\\y', // TODO
+ 'Jan' => '\\J\\a\\n\\u\\a\\r\\y', // TODO
+ 'Jul' => '\\J\\u\\l\\y', // TODO
+ 'Jun' => '\\J\\u\\n\\e', // TODO
+ 'Mar' => '\\M\\a\\r\\c\\h', // TODO
+ 'May' => '\\M\\a\\y', // TODO
+ 'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r', // TODO
+ 'Oct' => '\\O\\c\\t\\o\\b\\e\\r', // TODO
+ 'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r', // TODO
+ 'apr' => 'Apr.', // TODO
+ 'april' => 'April', // TODO
+ 'aug' => 'Aug.', // TODO
+ 'august' => 'August', // TODO
+ 'before_yesterday' => 'Before yesterday', // TODO
+ 'dec' => 'Dec.', // TODO
+ 'december' => 'December', // TODO
+ 'feb' => 'Feb.', // TODO
+ 'february' => 'February', // TODO
+ 'format_date' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y',
+ 'format_date_hour' => '%s j\\<\\s\\u\\p\\>S\\<\\/\\s\\u\\p\\> Y \\a\\t g\\:i a',
+ 'fri' => 'Fri', // TODO
+ 'jan' => 'Jan.', // TODO
+ 'january' => 'January', // TODO
+ 'jul' => 'July', // TODO
+ 'july' => 'July', // TODO
+ 'jun' => 'June', // TODO
+ 'june' => 'June', // TODO
+ 'last_2_year' => 'Last two years', // TODO
+ 'last_3_month' => 'Last three months', // TODO
+ 'last_3_year' => 'Last three years', // TODO
+ 'last_5_year' => 'Last five years', // TODO
+ 'last_6_month' => 'Last six months', // TODO
+ 'last_month' => 'Last month', // TODO
+ 'last_week' => 'Last week', // TODO
+ 'last_year' => 'Last year', // TODO
+ 'mar' => 'Mar.', // TODO
+ 'march' => 'March', // TODO
+ 'may' => 'May', // TODO
+ 'may_' => 'May', // TODO
+ 'mon' => 'Mon', // TODO
+ 'month' => 'months', // TODO
+ 'nov' => 'Nov.', // TODO
+ 'november' => 'November', // TODO
+ 'oct' => 'Oct.', // TODO
+ 'october' => 'October', // TODO
+ 'sat' => 'Sat', // TODO
+ 'sep' => 'Sept.', // TODO
+ 'september' => 'September', // TODO
+ 'sun' => 'Sun', // TODO
+ 'thu' => 'Thu', // TODO
+ 'today' => 'Today', // TODO
+ 'tue' => 'Tue', // TODO
+ 'wed' => 'Wed', // TODO
+ 'yesterday' => 'Yesterday', // TODO
+ ),
+ 'dir' => 'ltr', // TODO
+ 'freshrss' => array(
+ '_' => 'FreshRSS', // TODO
+ 'about' => 'About FreshRSS', // TODO
+ ),
+ 'js' => array(
+ 'category_empty' => 'Empty category', // TODO
+ 'confirm_action' => 'Are you sure you want to perform this action? It cannot be canceled!',
+ 'confirm_action_feed_cat' => 'Are you sure you want to perform this action? You will lose related favorites and user queries. It cannot be canceled!',
+ 'feedback' => array(
+ 'body_new_articles' => 'There are %%d new articles to read on FreshRSS.', // TODO
+ 'body_unread_articles' => '(unread: %%d)', // TODO
+ 'request_failed' => 'A request has failed, it may have been caused by internet connection problems.', // TODO
+ 'title_new_articles' => 'FreshRSS: new articles!', // TODO
+ ),
+ 'new_article' => 'There are new articles available, click to refresh the page.', // TODO
+ 'should_be_activated' => 'JavaScript must be enabled', // TODO
+ ),
+ 'lang' => array(
+ 'cz' => 'Čeština', // IGNORE
+ 'de' => 'Deutsch', // IGNORE
+ 'en' => 'English', // IGNORE
+ 'en-us' => 'English (United States)', // IGNORE
+ 'es' => 'Español', // IGNORE
+ 'fr' => 'Français', // IGNORE
+ 'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
+ 'it' => 'Italiano', // IGNORE
+ 'ja' => '日本語', // IGNORE
+ 'ko' => '한국어', // IGNORE
+ 'nl' => 'Nederlands', // IGNORE
+ 'oc' => 'Occitan', // IGNORE
+ 'pl' => 'Polski', // IGNORE
+ 'pt-br' => 'Português (Brasil)', // IGNORE
+ 'ru' => 'Русский', // IGNORE
+ 'sk' => 'Slovenčina', // IGNORE
+ 'tr' => 'Türkçe', // IGNORE
+ 'zh-cn' => '简体中文', // IGNORE
+ 'zh-tw' => '正體中文', // IGNORE
+ ),
+ 'menu' => array(
+ 'about' => 'About', // TODO
+ 'account' => 'Account', // TODO
+ 'admin' => 'Administration', // TODO
+ 'archiving' => 'Archiving', // TODO
+ 'authentication' => 'Authentication', // TODO
+ 'check_install' => 'Installation check', // TODO
+ 'configuration' => 'Configuration', // TODO
+ 'display' => 'Display', // TODO
+ 'extensions' => 'Extensions', // TODO
+ 'logs' => 'Logs', // TODO
+ 'queries' => 'User queries', // TODO
+ 'reading' => 'Reading', // TODO
+ 'search' => 'Search words or #tags', // TODO
+ 'sharing' => 'Sharing', // TODO
+ 'shortcuts' => 'Shortcuts', // TODO
+ 'stats' => 'Statistics', // TODO
+ 'system' => 'System configuration', // TODO
+ 'update' => 'Update', // TODO
+ 'user_management' => 'Manage users', // TODO
+ 'user_profile' => 'Profile', // TODO
+ ),
+ 'period' => array(
+ 'days' => 'days', // TODO
+ 'hours' => 'hours', // TODO
+ 'months' => 'months', // TODO
+ 'weeks' => 'weeks', // TODO
+ 'years' => 'years', // TODO
+ ),
+ 'share' => array(
+ 'Known' => 'Known based sites', // TODO
+ 'archivePH' => 'archive.ph', // TODO
+ 'blogotext' => 'Blogotext', // TODO
+ 'clipboard' => 'Clipboard', // TODO
+ 'diaspora' => 'Diaspora*', // TODO
+ 'email' => 'Email', // TODO
+ 'facebook' => 'Facebook', // TODO
+ 'gnusocial' => 'GNU social', // TODO
+ 'jdh' => 'Journal du hacker', // TODO
+ 'lemmy' => 'Lemmy', // TODO
+ 'linkedin' => 'LinkedIn', // TODO
+ 'mastodon' => 'Mastodon', // TODO
+ 'movim' => 'Movim', // TODO
+ 'pinboard' => 'Pinboard', // TODO
+ 'pinterest' => 'Pinterest', // TODO
+ 'pocket' => 'Pocket', // TODO
+ 'print' => 'Print', // TODO
+ 'raindrop' => 'Raindrop.io', // TODO
+ 'reddit' => 'Reddit', // TODO
+ 'shaarli' => 'Shaarli', // TODO
+ 'twitter' => 'Twitter', // TODO
+ 'wallabag' => 'wallabag v1', // TODO
+ 'wallabagv2' => 'wallabag v2', // TODO
+ 'web-sharing-api' => 'System sharing', // TODO
+ 'whatsapp' => 'Whatsapp', // TODO
+ 'xing' => 'Xing', // TODO
+ ),
+ 'short' => array(
+ 'attention' => 'Warning!', // TODO
+ 'blank_to_disable' => 'Leave blank to disable', // TODO
+ 'by_author' => 'By:', // TODO
+ 'by_default' => 'By default', // TODO
+ 'damn' => 'Blast!', // TODO
+ 'default_category' => 'Uncategorized', // TODO
+ 'no' => 'No', // TODO
+ 'not_applicable' => 'Not available', // TODO
+ 'ok' => 'Okay!', // TODO
+ 'or' => 'or', // TODO
+ 'yes' => 'Yes', // TODO
+ ),
+ 'stream' => array(
+ 'load_more' => 'Load more articles', // TODO
+ 'mark_all_read' => 'Mark all as read', // TODO
+ 'nothing_to_load' => 'There are no more articles', // TODO
+ ),
+);
diff --git a/app/i18n/id/index.php b/app/i18n/id/index.php
new file mode 100644
index 000000000..757c469a0
--- /dev/null
+++ b/app/i18n/id/index.php
@@ -0,0 +1,75 @@
+<?php
+
+/******************************************************************************/
+/* Each entry of that file can be associated with a comment to indicate its */
+/* state. When there is no comment, it means the entry is fully translated. */
+/* The recognized comments are (comment matching is case-insensitive): */
+/* + TODO: the entry has never been translated. */
+/* + DIRTY: the entry has been translated but needs to be updated. */
+/* + IGNORE: the entry does not need to be translated. */
+/* When a comment is not recognized, it is discarded. */
+/******************************************************************************/
+
+return array(
+ 'about' => array(
+ '_' => 'About', // TODO
+ 'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>', // TODO
+ 'bugs_reports' => 'Bug reports', // TODO
+ 'credits' => 'Credits', // TODO
+ 'credits_content' => 'Some design elements come from <a href="http://twitter.github.io/bootstrap/">Bootstrap</a> although FreshRSS doesn’t use this framework. <a href="https://gitlab.gnome.org/Archive/gnome-icon-theme-symbolic">Icons</a> come from the <a href="https://www.gnome.org/">GNOME project</a>. <em>Open Sans</em> font police has been created by <a href="https://fonts.google.com/specimen/Open+Sans">Steve Matteson</a>. FreshRSS is based on <a href="https://framagit.org/marienfressinaud/MINZ">Minz</a>, a PHP framework.', // TODO
+ 'freshrss_description' => 'FreshRSS is a self-hostable RSS aggregator and reader. It allows you to read and follow several news websites at a glance without the need to browse from one website to another. FreshRSS is lightweight, configurable, and easy to use.', // TODO
+ 'github' => '<a href="https://github.com/FreshRSS/FreshRSS/issues">on Github</a>', // TODO
+ 'license' => 'License', // TODO
+ 'project_website' => 'Project website', // TODO
+ 'title' => 'About', // TODO
+ 'version' => 'Version', // TODO
+ ),
+ 'feed' => array(
+ 'add' => 'Please add some feeds.', // TODO
+ 'empty' => 'There are no articles to show.', // TODO
+ 'rss_of' => 'RSS feed of %s', // TODO
+ 'title' => 'Main stream', // TODO
+ 'title_fav' => 'Favorites',
+ 'title_global' => 'Global view', // TODO
+ ),
+ 'log' => array(
+ '_' => 'Logs', // TODO
+ 'clear' => 'Clear the logs', // TODO
+ 'empty' => 'Log file is empty', // TODO
+ 'title' => 'Logs', // TODO
+ ),
+ 'menu' => array(
+ 'about' => 'About FreshRSS', // TODO
+ 'before_one_day' => 'Older than one day', // TODO
+ 'before_one_week' => 'Older than one week', // TODO
+ 'bookmark_query' => 'Bookmark current query', // TODO
+ 'favorites' => 'Favorites (%s)',
+ 'global_view' => 'Global view', // TODO
+ 'main_stream' => 'Main stream', // TODO
+ 'mark_all_read' => 'Mark all as read', // TODO
+ 'mark_cat_read' => 'Mark category as read', // TODO
+ 'mark_feed_read' => 'Mark feed as read', // TODO
+ 'mark_selection_unread' => 'Mark selection as unread', // TODO
+ 'newer_first' => 'Newer first', // TODO
+ 'non-starred' => 'Show non-favorites',
+ 'normal_view' => 'Normal view', // TODO
+ 'older_first' => 'Oldest first', // TODO
+ 'queries' => 'User queries', // TODO
+ 'read' => 'Show read', // TODO
+ 'reader_view' => 'Reading view', // TODO
+ 'rss_view' => 'RSS feed', // TODO
+ 'search_short' => 'Search', // TODO
+ 'starred' => 'Show favorites',
+ 'stats' => 'Statistics', // TODO
+ 'subscription' => 'Subscription management', // TODO
+ 'tags' => 'My labels', // TODO
+ 'unread' => 'Show unread', // TODO
+ ),
+ 'share' => 'Share', // TODO
+ 'tag' => array(
+ 'related' => 'Article tags', // TODO
+ ),
+ 'tos' => array(
+ 'title' => 'Terms of Service', // TODO
+ ),
+);
diff --git a/app/i18n/id/install.php b/app/i18n/id/install.php
new file mode 100644
index 000000000..d64384cfc
--- /dev/null
+++ b/app/i18n/id/install.php
@@ -0,0 +1,133 @@
+<?php
+
+/******************************************************************************/
+/* Each entry of that file can be associated with a comment to indicate its */
+/* state. When there is no comment, it means the entry is fully translated. */
+/* The recognized comments are (comment matching is case-insensitive): */
+/* + TODO: the entry has never been translated. */
+/* + DIRTY: the entry has been translated but needs to be updated. */
+/* + IGNORE: the entry does not need to be translated. */
+/* When a comment is not recognized, it is discarded. */
+/******************************************************************************/
+
+return array(
+ 'action' => array(
+ 'finish' => 'Complete installation', // TODO
+ 'fix_errors_before' => 'Please all fix errors before continuing to the next step.', // TODO
+ 'keep_install' => 'Keep previous configuration', // TODO
+ 'next_step' => 'Go to the next step', // TODO
+ 'reinstall' => 'Reinstall FreshRSS', // TODO
+ ),
+ 'auth' => array(
+ 'form' => 'Web form (traditional, requires JavaScript)', // TODO
+ 'http' => 'HTTP (for advanced users with HTTPS)', // TODO
+ 'none' => 'None (dangerous)', // TODO
+ 'password_form' => 'Password<br /><small>(for the Web-form login method)</small>', // TODO
+ 'password_format' => 'At least 7 characters', // TODO
+ 'type' => 'Authentication method', // TODO
+ ),
+ 'bdd' => array(
+ '_' => 'Database', // TODO
+ 'conf' => array(
+ '_' => 'Database configuration', // TODO
+ 'ko' => 'Verify your database configuration.', // TODO
+ 'ok' => 'Database configuration has been saved.', // TODO
+ ),
+ 'host' => 'Host', // TODO
+ 'password' => 'Database password', // TODO
+ 'prefix' => 'Table prefix', // TODO
+ 'type' => 'Type of database', // TODO
+ 'username' => 'Database username', // TODO
+ ),
+ 'check' => array(
+ '_' => 'Checks', // TODO
+ 'already_installed' => 'We have detected that FreshRSS is already installed!', // TODO
+ 'cache' => array(
+ 'nok' => 'Check permissions on the <em>%1$s</em> directory for <em>%2$s</em> user. The HTTP server must have write permissions.',
+ 'ok' => 'Permissions on the cache directory are good.', // TODO
+ ),
+ 'ctype' => array(
+ 'nok' => 'Cannot find the required library for character type checking (php-ctype).', // TODO
+ 'ok' => 'You have the required library for character type checking (ctype).', // TODO
+ ),
+ 'curl' => array(
+ 'nok' => 'Cannot find the cURL library (php-curl package).', // TODO
+ 'ok' => 'You have the cURL library.', // TODO
+ ),
+ 'data' => array(
+ 'nok' => 'Check permissions on the <em>%1$s</em> directory for <em>%2$s</em> user. The HTTP server must have write permissions.',
+ 'ok' => 'Permissions on the data directory are good.', // TODO
+ ),
+ 'dom' => array(
+ 'nok' => 'Cannot find the required library to browse the DOM.', // TODO
+ 'ok' => 'You have the required library to browse the DOM.', // TODO
+ ),
+ 'favicons' => array(
+ 'nok' => 'Check permissions on the <em>%1$s</em> directory for <em>%2$s</em> user. The HTTP server must have write permissions.',
+ 'ok' => 'Permissions on the favicons directory are good.', // TODO
+ ),
+ 'fileinfo' => array(
+ 'nok' => 'Cannot find the PHP fileinfo library (fileinfo package).', // TODO
+ 'ok' => 'You have the fileinfo library.', // TODO
+ ),
+ 'json' => array(
+ 'nok' => 'Cannot find the recommended library to parse JSON.', // TODO
+ 'ok' => 'You have the recommended library to parse JSON.', // TODO
+ ),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', // TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', // TODO
+ ),
+ 'pcre' => array(
+ 'nok' => 'Cannot find the required library for regular expressions (php-pcre).', // TODO
+ 'ok' => 'You have the required library for regular expressions (PCRE).', // TODO
+ ),
+ 'pdo' => array(
+ 'nok' => 'Cannot find PDO or one of the supported drivers (pdo_mysql, pdo_sqlite, pdo_pgsql).', // TODO
+ 'ok' => 'You have PDO and at least one of the supported drivers (pdo_mysql, pdo_sqlite, pdo_pgsql).', // TODO
+ ),
+ 'php' => array(
+ 'nok' => 'Your PHP version is %s, but FreshRSS requires at least version %s.', // TODO
+ 'ok' => 'Your PHP version, %s, is compatible with FreshRSS.', // TODO
+ ),
+ 'reload' => 'Check again', // TODO
+ 'tmp' => array(
+ 'nok' => 'Check permissions on the <em>%1$s</em> directory for <em>%2$s</em> user. The HTTP server must have write permissions.', // TODO
+ 'ok' => 'Permissions on the temp directory are good.', // TODO
+ ),
+ 'unknown_process_username' => 'unknown', // TODO
+ 'users' => array(
+ 'nok' => 'Check permissions on the <em>%1$s</em> directory for <em>%2$s</em> user. The HTTP server must have write permissions.', // TODO
+ 'ok' => 'Permissions on the users directory are good.', // TODO
+ ),
+ 'xml' => array(
+ 'nok' => 'Cannot find the required library to parse XML.', // TODO
+ 'ok' => 'You have the required library to parse XML.', // TODO
+ ),
+ ),
+ 'conf' => array(
+ '_' => 'General configuration', // TODO
+ 'ok' => 'General configuration has been saved.', // TODO
+ ),
+ 'congratulations' => 'Congratulations!', // TODO
+ 'default_user' => 'Username of the default user <small>(maximum 16 alphanumeric characters)</small>', // TODO
+ 'fix_errors_before' => 'Please fix errors before continuing to the next step.', // TODO
+ 'javascript_is_better' => 'FreshRSS is more pleasant with JavaScript enabled', // TODO
+ 'js' => array(
+ 'confirm_reinstall' => 'You will lose your previous configuration by reinstalling FreshRSS. Are you sure you want to continue?', // TODO
+ ),
+ 'language' => array(
+ '_' => 'Language', // TODO
+ 'choose' => 'Choose a language for FreshRSS', // TODO
+ 'defined' => 'Language has been defined.', // TODO
+ ),
+ 'missing_applied_migrations' => 'Something went wrong; you should create an empty file <em>%s</em> manually.', // TODO
+ 'ok' => 'The installation process was successful.', // TODO
+ 'session' => array(
+ 'nok' => 'The web server seems to be incorrectly configured for cookies required for PHP sessions!', // TODO
+ ),
+ 'step' => 'step %d', // TODO
+ 'steps' => 'Steps', // TODO
+ 'this_is_the_end' => 'This is the end', // TODO
+ 'title' => 'Installation · FreshRSS', // TODO
+);
diff --git a/app/i18n/id/sub.php b/app/i18n/id/sub.php
new file mode 100644
index 000000000..7fdf5c024
--- /dev/null
+++ b/app/i18n/id/sub.php
@@ -0,0 +1,213 @@
+<?php
+
+/******************************************************************************/
+/* Each entry of that file can be associated with a comment to indicate its */
+/* state. When there is no comment, it means the entry is fully translated. */
+/* The recognized comments are (comment matching is case-insensitive): */
+/* + TODO: the entry has never been translated. */
+/* + DIRTY: the entry has been translated but needs to be updated. */
+/* + IGNORE: the entry does not need to be translated. */
+/* When a comment is not recognized, it is discarded. */
+/******************************************************************************/
+
+return array(
+ 'api' => array(
+ 'documentation' => 'Copy the following URL to use it within an external tool.', // TODO
+ 'title' => 'API', // TODO
+ ),
+ 'bookmarklet' => array(
+ 'documentation' => 'Drag this button to your bookmarks toolbar or right-click it and choose “Bookmark This Link”. Then click the “Subscribe” button in any page you want to subscribe to.', // TODO
+ 'label' => 'Subscribe', // TODO
+ 'title' => 'Bookmarklet', // TODO
+ ),
+ 'category' => array(
+ '_' => 'Category', // TODO
+ 'add' => 'Add a category', // TODO
+ 'archiving' => 'Archiving', // TODO
+ 'dynamic_opml' => array(
+ '_' => 'Dynamic OPML', // TODO
+ 'help' => 'Provide the URL to an <a href="http://opml.org/" target="_blank">OPML file</a> to dynamically populate this category with feeds', // TODO
+ ),
+ 'empty' => 'Empty category', // TODO
+ 'information' => 'Information', // TODO
+ 'opml_url' => 'OPML URL', // TODO
+ 'position' => 'Display position', // TODO
+ 'position_help' => 'To control category sort order', // TODO
+ 'title' => 'Title', // TODO
+ ),
+ 'feed' => array(
+ 'accept_cookies' => 'Accept cookies', // TODO
+ 'accept_cookies_help' => 'Allow the feed server to set cookies (stored in memory for the duration of the request only)', // TODO
+ 'add' => 'Add an RSS feed', // TODO
+ 'advanced' => 'Advanced', // TODO
+ 'archiving' => 'Archiving', // TODO
+ 'auth' => array(
+ 'configuration' => 'Login', // TODO
+ 'help' => 'Allows access to HTTP protected RSS feeds', // TODO
+ 'http' => 'HTTP Authentication', // TODO
+ 'password' => 'HTTP password', // TODO
+ 'username' => 'HTTP username', // TODO
+ ),
+ 'clear_cache' => 'Always clear cache', // TODO
+ 'content_action' => array(
+ '_' => 'Content action when fetching the article content', // TODO
+ 'append' => 'Add after existing content', // TODO
+ 'prepend' => 'Add before existing content', // TODO
+ 'replace' => 'Replace existing content', // TODO
+ ),
+ 'css_cookie' => 'Use Cookies when fetching the article content', // TODO
+ 'css_cookie_help' => 'Example: <kbd>foo=bar; gdpr_consent=true; cookie=value</kbd>', // TODO
+ 'css_help' => 'Retrieves truncated RSS feeds (caution, requires more time!)', // TODO
+ 'css_path' => 'Article CSS selector on original website', // TODO
+ 'css_path_filter' => array(
+ '_' => 'CSS selector of the elements to remove', // TODO
+ 'help' => 'A CSS selector may be a list such as: <kbd>.footer, .aside</kbd>', // TODO
+ ),
+ 'description' => 'Description', // TODO
+ 'empty' => 'This feed is empty. Please verify that it is still maintained.', // TODO
+ 'error' => 'This feed has encountered a problem. Please verify that it is always reachable then update it.', // TODO
+ 'filteractions' => array(
+ '_' => 'Filter actions', // TODO
+ 'help' => 'Write one search filter per line.', // TODO
+ ),
+ 'information' => 'Information', // TODO
+ 'keep_min' => 'Minimum number of articles to keep', // TODO
+ 'kind' => array(
+ '_' => 'Type of feed source', // TODO
+ 'html_xpath' => array(
+ '_' => 'HTML + XPath (Web scraping)', // TODO
+ 'feed_title' => array(
+ '_' => 'feed title', // TODO
+ 'help' => 'Example: <code>//title</code> or a static string: <code>"My custom feed"</code>', // TODO
+ ),
+ 'help' => '<dfn><a href="https://www.w3.org/TR/xpath-10/" target="_blank">XPath 1.0</a></dfn> is a standard query language for advanced users, and which FreshRSS supports to enable Web scraping.', // TODO
+ 'item' => array(
+ '_' => 'finding news <strong>items</strong><br /><small>(most important)</small>', // TODO
+ 'help' => 'Example: <code>//div[@class="news-item"]</code>', // TODO
+ ),
+ 'item_author' => array(
+ '_' => 'item author', // TODO
+ 'help' => 'Can also be a static string. Example: <code>"Anonymous"</code>', // TODO
+ ),
+ 'item_categories' => 'item tags', // TODO
+ 'item_content' => array(
+ '_' => 'item content', // TODO
+ 'help' => 'Example to take the full item: <code>.</code>', // TODO
+ ),
+ 'item_thumbnail' => array(
+ '_' => 'item thumbnail', // TODO
+ 'help' => 'Example: <code>descendant::img/@src</code>', // TODO
+ ),
+ 'item_timeFormat' => array(
+ '_' => 'Custom date/time format', // TODO
+ 'help' => 'Optional. A format supported by <a href="https://php.net/datetime.createfromformat" target="_blank"><code>DateTime::createFromFormat()</code></a> such as <code>d-m-Y H:i:s</code>', // TODO
+ ),
+ 'item_timestamp' => array(
+ '_' => 'item date', // TODO
+ 'help' => 'The result will be parsed by <a href="https://php.net/strtotime" target="_blank"><code>strtotime()</code></a>', // TODO
+ ),
+ 'item_title' => array(
+ '_' => 'item title', // TODO
+ 'help' => 'Use in particular the <a href="https://developer.mozilla.org/docs/Web/XPath/Axes" target="_blank">XPath axis</a> <code>descendant::</code> like <code>descendant::h2</code>', // TODO
+ ),
+ 'item_uid' => array(
+ '_' => 'item unique ID', // TODO
+ 'help' => 'Optional. Example: <code>descendant::div/@data-uri</code>', // TODO
+ ),
+ 'item_uri' => array(
+ '_' => 'item link (URL)', // TODO
+ 'help' => 'Example: <code>descendant::a/@href</code>', // TODO
+ ),
+ 'relative' => 'XPath (relative to item) for:', // TODO
+ 'xpath' => 'XPath for:', // TODO
+ ),
+ 'rss' => 'RSS / Atom (default)', // TODO
+ ),
+ 'maintenance' => array(
+ 'clear_cache' => 'Clear cache', // TODO
+ 'clear_cache_help' => 'Clear the cache for this feed.', // TODO
+ 'reload_articles' => 'Reload articles', // TODO
+ 'reload_articles_help' => 'Reload that many articles and fetch complete content if a selector is defined.', // TODO
+ 'title' => 'Maintenance', // TODO
+ ),
+ 'max_http_redir' => 'Max HTTP redirects', // TODO
+ 'max_http_redir_help' => 'Set to 0 or leave blank to disable, -1 for unlimited redirects', // TODO
+ 'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.', // TODO
+ 'mute' => 'mute', // TODO
+ 'no_selected' => 'No feed selected.', // TODO
+ 'number_entries' => '%d articles', // TODO
+ 'priority' => array(
+ '_' => 'Visibility', // TODO
+ 'archived' => 'Do not show (archived)', // TODO
+ 'main_stream' => 'Show in main stream', // TODO
+ 'normal' => 'Show in its category', // TODO
+ ),
+ 'proxy' => 'Set a proxy for fetching this feed', // TODO
+ 'proxy_help' => 'Select a protocol (e.g: SOCKS5) and enter the proxy address (e.g: <kbd>127.0.0.1:1080</kbd>)', // TODO
+ 'selector_preview' => array(
+ 'show_raw' => 'Show source code', // TODO
+ 'show_rendered' => 'Show content', // TODO
+ ),
+ 'show' => array(
+ 'all' => 'Show all feeds', // TODO
+ 'error' => 'Show only feeds with errors', // TODO
+ ),
+ 'showing' => array(
+ 'error' => 'Showing only feeds with errors', // TODO
+ ),
+ 'ssl_verify' => 'Verify SSL security', // TODO
+ 'stats' => 'Statistics', // TODO
+ 'think_to_add' => 'You may add some feeds.', // TODO
+ 'timeout' => 'Timeout in seconds', // TODO
+ 'title' => 'Title', // TODO
+ 'title_add' => 'Add an RSS feed', // TODO
+ 'ttl' => 'Do not automatically refresh more often than', // TODO
+ 'url' => 'Feed URL', // TODO
+ 'useragent' => 'Set the user agent for fetching this feed', // TODO
+ 'useragent_help' => 'Example: <kbd>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0)</kbd>', // TODO
+ 'validator' => 'Check the validity of the feed', // TODO
+ 'website' => 'Website URL', // TODO
+ 'websub' => 'Instant notification with WebSub', // TODO
+ ),
+ 'import_export' => array(
+ 'export' => 'Export', // TODO
+ 'export_labelled' => 'Export your labeled articles',
+ 'export_opml' => 'Export list of feeds (OPML)', // TODO
+ 'export_starred' => 'Export your favorites',
+ 'feed_list' => 'List of %s articles', // TODO
+ 'file_to_import' => 'File to import<br />(OPML, JSON or ZIP)', // TODO
+ 'file_to_import_no_zip' => 'File to import<br />(OPML or JSON)', // TODO
+ 'import' => 'Import', // TODO
+ 'starred_list' => 'List of favorite articles',
+ 'title' => 'Import / export', // TODO
+ ),
+ 'menu' => array(
+ 'add' => 'Add a feed or category', // TODO
+ 'import_export' => 'Import / export', // TODO
+ 'label_management' => 'Label management', // TODO
+ 'stats' => array(
+ 'idle' => 'Idle feeds', // TODO
+ 'main' => 'Main statistics', // TODO
+ 'repartition' => 'Articles repartition', // TODO
+ ),
+ 'subscription_management' => 'Subscription management', // TODO
+ 'subscription_tools' => 'Subscription tools', // TODO
+ ),
+ 'tag' => array(
+ 'name' => 'Name', // TODO
+ 'new_name' => 'New name', // TODO
+ 'old_name' => 'Old name', // TODO
+ ),
+ 'title' => array(
+ '_' => 'Subscription management', // TODO
+ 'add' => 'Add a feed or category', // TODO
+ 'add_category' => 'Add a category', // TODO
+ 'add_dynamic_opml' => 'Add dynamic OPML', // TODO
+ 'add_feed' => 'Add a feed', // TODO
+ 'add_label' => 'Add a label', // TODO
+ 'delete_label' => 'Delete a label', // TODO
+ 'feed_management' => 'RSS feeds management', // TODO
+ 'rename_label' => 'Rename a label', // TODO
+ 'subscription_tools' => 'Subscription tools', // TODO
+ ),
+);
diff --git a/app/i18n/id/user.php b/app/i18n/id/user.php
new file mode 100644
index 000000000..31d210e51
--- /dev/null
+++ b/app/i18n/id/user.php
@@ -0,0 +1,54 @@
+<?php
+
+/******************************************************************************/
+/* Each entry of that file can be associated with a comment to indicate its */
+/* state. When there is no comment, it means the entry is fully translated. */
+/* The recognized comments are (comment matching is case-insensitive): */
+/* + TODO: the entry has never been translated. */
+/* + DIRTY: the entry has been translated but needs to be updated. */
+/* + IGNORE: the entry does not need to be translated. */
+/* When a comment is not recognized, it is discarded. */
+/******************************************************************************/
+
+return array(
+ 'email' => array(
+ 'feedback' => array(
+ 'invalid' => 'Alamat email ini tidak valid.',
+ 'required' => 'Diperlukan alamat email.',
+ ),
+ 'validation' => array(
+ 'change_email' => 'Anda dapat mengubah alamat email Anda <a href="%s">di halaman profil</a>.',
+ 'email_sent_to' => 'Kami mengirimi Anda email di <strong>%s</strong>. Harap ikuti instruksinya untuk memvalidasi alamat Anda.',
+ 'feedback' => array(
+ 'email_failed' => 'Kami tidak dapat mengirimi Anda email karena kesalahan konfigurasi server. ',
+ 'email_sent' => 'Email telah dikirim ke alamat Anda.',
+ 'error' => 'Validasi alamat email gagal.',
+ 'ok' => 'Alamat email ini telah divalidasi.',
+ 'unnecessary' => 'Alamat email ini sudah divalidasi.',
+ 'wrong_token' => 'Alamat email ini gagal divalidasi karena token yang salah.',
+ ),
+ 'need_to' => 'Anda perlu memvalidasi alamat email Anda sebelum dapat menggunakan %s.',
+ 'resend_email' => 'Kirim ulang email',
+ 'title' => 'Validasi Alamat Email',
+ ),
+ ),
+ 'mailer' => array(
+ 'email_need_validation' => array(
+ 'body' => 'Anda baru saja mendaftar %s,Tetapi Anda masih perlu memvalidasi alamat email Anda.Untuk itu, ikuti saja tautannya:',
+ 'title' => 'Anda perlu memvalidasi akun Anda',
+ 'welcome' => 'Welcome %s,', // IGNORE
+ ),
+ ),
+ 'password' => array(
+ 'invalid' => 'Kata sandi tidak valid.',
+ ),
+ 'tos' => array(
+ 'feedback' => array(
+ 'invalid' => 'Anda harus menerima ketentuan layanan untuk dapat mendaftar.',
+ ),
+ ),
+ 'username' => array(
+ 'invalid' => 'Nama pengguna ini tidak valid.',
+ 'taken' => 'Nama pengguna ini, %s, telah diambil.',
+ ),
+);
diff --git a/app/i18n/it/gen.php b/app/i18n/it/gen.php
index 8a95ca510..e3cc8a236 100644
--- a/app/i18n/it/gen.php
+++ b/app/i18n/it/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE
diff --git a/app/i18n/ja/gen.php b/app/i18n/ja/gen.php
index 45001836b..19ec66471 100644
--- a/app/i18n/ja/gen.php
+++ b/app/i18n/ja/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE
diff --git a/app/i18n/ko/gen.php b/app/i18n/ko/gen.php
index 24d95d2ff..ead513b2d 100644
--- a/app/i18n/ko/gen.php
+++ b/app/i18n/ko/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE
diff --git a/app/i18n/nl/gen.php b/app/i18n/nl/gen.php
index f09cf5467..0db2066d6 100644
--- a/app/i18n/nl/gen.php
+++ b/app/i18n/nl/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE
diff --git a/app/i18n/oc/gen.php b/app/i18n/oc/gen.php
index c8244026f..e32018214 100644
--- a/app/i18n/oc/gen.php
+++ b/app/i18n/oc/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE
diff --git a/app/i18n/pl/gen.php b/app/i18n/pl/gen.php
index 619567ac1..810e29e32 100644
--- a/app/i18n/pl/gen.php
+++ b/app/i18n/pl/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE
diff --git a/app/i18n/pt-br/gen.php b/app/i18n/pt-br/gen.php
index c1962e80a..882b03be8 100644
--- a/app/i18n/pt-br/gen.php
+++ b/app/i18n/pt-br/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE
diff --git a/app/i18n/ru/gen.php b/app/i18n/ru/gen.php
index 22390efde..6ca27be03 100644
--- a/app/i18n/ru/gen.php
+++ b/app/i18n/ru/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE
diff --git a/app/i18n/sk/gen.php b/app/i18n/sk/gen.php
index b730f17a8..492c5d677 100644
--- a/app/i18n/sk/gen.php
+++ b/app/i18n/sk/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE
diff --git a/app/i18n/tr/gen.php b/app/i18n/tr/gen.php
index a43426990..c8bad9ed2 100644
--- a/app/i18n/tr/gen.php
+++ b/app/i18n/tr/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE
diff --git a/app/i18n/zh-cn/gen.php b/app/i18n/zh-cn/gen.php
index 1157ba73c..80e94257e 100644
--- a/app/i18n/zh-cn/gen.php
+++ b/app/i18n/zh-cn/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE
diff --git a/app/i18n/zh-tw/gen.php b/app/i18n/zh-tw/gen.php
index 7437dc231..77386a61a 100644
--- a/app/i18n/zh-tw/gen.php
+++ b/app/i18n/zh-tw/gen.php
@@ -145,6 +145,7 @@ return array(
'es' => 'Español', // IGNORE
'fr' => 'Français', // IGNORE
'he' => 'עברית', // IGNORE
+ 'id' => 'Bahasa Indonesia', // IGNORE
'it' => 'Italiano', // IGNORE
'ja' => '日本語', // IGNORE
'ko' => '한국어', // IGNORE