Procházet zdrojové kódy

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>
Amrul Izwan před 3 roky
rodič
revize
ca1764f492

+ 1 - 0
.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/",

+ 1 - 0
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

+ 1 - 0
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

+ 20 - 19
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

+ 1 - 0
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

+ 1 - 0
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' => '한국어',

+ 1 - 0
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

+ 1 - 0
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

+ 1 - 0
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

+ 216 - 0
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
+	),
+);

+ 283 - 0
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
+	),
+);

+ 144 - 0
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
+		),
+	),
+);

+ 237 - 0
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
+	),
+);

+ 75 - 0
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
+	),
+);

+ 133 - 0
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
+);

+ 213 - 0
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
+	),
+);

+ 54 - 0
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.',
+	),
+);

+ 1 - 0
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

+ 1 - 0
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

+ 1 - 0
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

+ 1 - 0
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

+ 1 - 0
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

+ 1 - 0
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

+ 1 - 0
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

+ 1 - 0
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

+ 1 - 0
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

+ 1 - 0
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

+ 1 - 0
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

+ 1 - 0
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