Fix Russian plurals. https://redmine.stoutner.com/issues/291
authorSoren Stoutner <soren@stoutner.com>
Mon, 30 Jul 2018 20:32:06 +0000 (13:32 -0700)
committerSoren Stoutner <soren@stoutner.com>
Mon, 30 Jul 2018 20:32:06 +0000 (13:32 -0700)
app/src/main/assets/es/guide_requests_dark.html
app/src/main/assets/es/guide_requests_light.html
app/src/main/assets/ru/guide_requests_dark.html
app/src/main/assets/ru/guide_requests_light.html
app/src/main/java/com/stoutner/privacybrowser/activities/BookmarksActivity.java
app/src/main/res/values-de/strings.xml
app/src/main/res/values-es/strings.xml
app/src/main/res/values-it/strings.xml
app/src/main/res/values-ru/strings.xml
app/src/main/res/values/strings.xml

index cdab059..4f940c6 100644 (file)
@@ -34,7 +34,7 @@
 
         <p><img class="center21" src="images/request_details.png"></p>
 
-        <p>Navegador Privado incluye cuatro <a href="https://easylist.to/">listas de bloqueo</a> basadas en la <a href="https://adblockplus.org/filters">sintaxis de Adblock</a>:
+        <p>Navegador Privado incluye cuatro <a href="https://easylist.to/">listas de bloqueo comunes</a> basadas en la <a href="https://adblockplus.org/filters">sintaxis de Adblock</a>:
             EasyList, EasyPrivacy, Lista molesta de Fanboy y Lista de bloqueo social de Fanboy.
             Estas listas de bloqueo son procesadas por Navegador Privado en las siguientes 22 sublistas, que verifican las solicitudes de recursos en el orden listado.</p>
 
@@ -73,8 +73,9 @@
             Esto puede conducir a veces a falsos positivos, en los que los recursos se permiten o bloquean de formas que no estaban previstas en la entrada original.
             Una descripción más detallada de cómo se procesan las entradas de la lista de bloqueo está disponible en <a href="https://www.stoutner.com/privacy-browser/blocklists/">stoutner.com</a>.</p>
 
-        <p>Navegador Privado tiene una quinta lista de bloqueo que bloquea todas las solicitudes de terceras partes.
-            Una solicitud sólo se considera de terceras partes si el dominio base de la solicitud es diferente del dominio base de la URL.
+        <p>Navegador Privado tiene 2 listas de bloqueo adicionales,
+            una llamada <a href="https://www.stoutner.com/privacy-browser/blocklists/ultraprivacy/">Ultra Privacidad</a> que bloquea rastreadores que permite EasyPrivacy,
+            y otra que bloquea todas las solicitudes de terceras partes. Una solicitud sólo se considera de terceras partes si el dominio base de la solicitud es diferente del dominio base de la URL.
             Por ejemplo, si <code>www.website.com</code> carga una imagen de <code>images.website.com</code>,
             esto no se bloquea como petición de una tercera parte porque ambos comparten el mismo dominio base de <code>website.com</code>.
             El bloqueo de todas las solicitudes de terceras partes aumenta la privacidad, pero esta lista de bloqueo está desactivada por defecto porque rompe un gran número de páginas web.</p>
index b162ed1..cbca21f 100644 (file)
@@ -34,7 +34,7 @@
 
         <p><img class="center21" src="images/request_details.png"></p>
 
-        <p>Navegador Privado incluye cuatro <a href="https://easylist.to/">listas de bloqueo</a> basadas en la <a href="https://adblockplus.org/filters">sintaxis de Adblock</a>:
+        <p>Navegador Privado incluye cuatro <a href="https://easylist.to/">listas de bloqueo comunes</a> basadas en la <a href="https://adblockplus.org/filters">sintaxis de Adblock</a>:
             EasyList, EasyPrivacy, Lista molesta de Fanboy y Lista de bloqueo social de Fanboy.
             Estas listas de bloqueo son procesadas por Navegador Privado en las siguientes 22 sublistas, que verifican las solicitudes de recursos en el orden listado.</p>
 
@@ -73,8 +73,9 @@
             Esto puede conducir a veces a falsos positivos, en los que los recursos se permiten o bloquean de formas que no estaban previstas en la entrada original.
             Una descripción más detallada de cómo se procesan las entradas de la lista de bloqueo está disponible en <a href="https://www.stoutner.com/privacy-browser/blocklists/">stoutner.com</a>.</p>
 
-        <p>Navegador Privado tiene una quinta lista de bloqueo que bloquea todas las solicitudes de terceras partes.
-            Una solicitud sólo se considera de terceras partes si el dominio base de la solicitud es diferente del dominio base de la URL.
+        <p>Navegador Privado tiene 2 listas de bloqueo adicionales,
+            una llamada <a href="https://www.stoutner.com/privacy-browser/blocklists/ultraprivacy/">Ultra Privacidad</a> que bloquea rastreadores que permite EasyPrivacy,
+            y otra que bloquea todas las solicitudes de terceras partes. Una solicitud sólo se considera de terceras partes si el dominio base de la solicitud es diferente del dominio base de la URL.
             Por ejemplo, si <code>www.website.com</code> carga una imagen de <code>images.website.com</code>,
             esto no se bloquea como petición de una tercera parte porque ambos comparten el mismo dominio base de <code>website.com</code>.
             El bloqueo de todas las solicitudes de terceras partes aumenta la privacidad, pero esta lista de bloqueo está desactivada por defecto porque rompe un gran número de páginas web.</p>
index 09ac13c..6cb8bc2 100644 (file)
@@ -32,7 +32,7 @@
 
         <p><img class="center21" src="images/request_details.png"></p>
 
-        <p>Privacy Browser включает в себя четыре <a href="https://easylist.to/">списка блокировки</a>, основанных на <a href="https://adblockplus.org/filters">синтаксисе Adblock</a>:
+        <p>Privacy Browser Ð²ÐºÐ»Ñ\8eÑ\87аеÑ\82 Ð² Ñ\81ебÑ\8f Ñ\87еÑ\82Ñ\8bÑ\80е <a href="https://easylist.to/">Ñ\80аÑ\81пÑ\80оÑ\81Ñ\82Ñ\80аненнÑ\8bÑ\85 Ñ\81пиÑ\81ка Ð±Ð»Ð¾ÐºÐ¸Ñ\80овки</a>, Ð¾Ñ\81нованнÑ\8bÑ\85 Ð½Ð° <a href="https://adblockplus.org/filters">Ñ\81инÑ\82акÑ\81иÑ\81е Adblock</a>:
             EasyList, EasyPrivacy, Fanboy’s Annoyance List, и Fanboy’s Social Blocking List.
             Эти списки блокировки обрабатываются Privacy Browser в следующих 22 подсписках, которые проверяют запросы ресурсов в указанном порядке.</p>
 
@@ -71,7 +71,8 @@
             Иногда это может привести к ложным срабатываниям, когда ресурсы разрешаются или блокируются способами, которые не были предназначены для исходной записи.
             Более подробное описание способа обработки записей списка блокировки доступно на <a href="https://www.stoutner.com/privacy-browser/blocklists/">stoutner.com</a>.</p>
 
-        <p>Privacy Browser имеет пятый список блокировки, блокирующий все сторонние запросы. Запрос считается сторонним, только если базовый домен запроса отличается от базового домена URL-адреса.
+        <p>Privacy Browser имеет два дополнительных списка блокировки, один из которых <a href="https://www.stoutner.com/privacy-browser/blocklists/ultraprivacy/">UltraPrivacy</a>,
+            предназначеный для блокировки трекеров, которые EasyPrivacy разрешает, а другой блокирует все сторонние запросы.
             Например, если <code>www.website.com</code> загружает изображение с сайта <code>images.website.com</code>,
             запрос не будет считаться сторонним и не будет заблокирован, так как они оба используют один и тот же базовый домен <code>website.com</code>.
             Блокировка всех сторонних запросов увеличивает конфиденциальность, но этот список блокировки по умолчанию отключен, поскольку он ломает большое количество веб-сайтов.</p>
index 542377b..56af535 100644 (file)
@@ -32,7 +32,7 @@
 
         <p><img class="center21" src="images/request_details.png"></p>
 
-        <p>Privacy Browser включает в себя четыре <a href="https://easylist.to/">списка блокировки</a>, основанных на <a href="https://adblockplus.org/filters">синтаксисе Adblock</a>:
+        <p>Privacy Browser Ð²ÐºÐ»Ñ\8eÑ\87аеÑ\82 Ð² Ñ\81ебÑ\8f Ñ\87еÑ\82Ñ\8bÑ\80е <a href="https://easylist.to/">Ñ\80аÑ\81пÑ\80оÑ\81Ñ\82Ñ\80аненнÑ\8bÑ\85 Ñ\81пиÑ\81ка Ð±Ð»Ð¾ÐºÐ¸Ñ\80овки</a>, Ð¾Ñ\81нованнÑ\8bÑ\85 Ð½Ð° <a href="https://adblockplus.org/filters">Ñ\81инÑ\82акÑ\81иÑ\81е Adblock</a>:
             EasyList, EasyPrivacy, Fanboy’s Annoyance List, и Fanboy’s Social Blocking List.
             Эти списки блокировки обрабатываются Privacy Browser в следующих 22 подсписках, которые проверяют запросы ресурсов в указанном порядке.</p>
 
@@ -71,7 +71,8 @@
             Иногда это может привести к ложным срабатываниям, когда ресурсы разрешаются или блокируются способами, которые не были предназначены для исходной записи.
             Более подробное описание способа обработки записей списка блокировки доступно на <a href="https://www.stoutner.com/privacy-browser/blocklists/">stoutner.com</a>.</p>
 
-        <p>Privacy Browser имеет пятый список блокировки, блокирующий все сторонние запросы. Запрос считается сторонним, только если базовый домен запроса отличается от базового домена URL-адреса.
+        <p>Privacy Browser имеет два дополнительных списка блокировки, один из которых <a href="https://www.stoutner.com/privacy-browser/blocklists/ultraprivacy/">UltraPrivacy</a>,
+            предназначеный для блокировки трекеров, которые EasyPrivacy разрешает, а другой блокирует все сторонние запросы.
             Например, если <code>www.website.com</code> загружает изображение с сайта <code>images.website.com</code>,
             запрос не будет считаться сторонним и не будет заблокирован, так как они оба используют один и тот же базовый домен <code>website.com</code>.
             Блокировка всех сторонних запросов увеличивает конфиденциальность, но этот список блокировки по умолчанию отключен, поскольку он ломает большое количество веб-сайтов.</p>
index 9f4231a..c822e0e 100644 (file)
@@ -270,8 +270,24 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                     // Update the enabled status of the move icons.
                     updateMoveIcons();
                 } else {  // More than one bookmark is selected.
-                    // List the number of selected bookmarks in the subtitle.
-                    mode.setSubtitle(numberOfSelectedBookmarks + " " + getString(R.string.selected));
+                    // List the number of selected bookmarks according to the language.
+                    if (getString(R.string.android_asset_path).equals("ru")) {  // The Russian translation is used.
+                        // Convert the number of selected bookmarks to a string.
+                        String numberOfSelectedBookmarksString = String.valueOf(numberOfSelectedBookmarks);
+
+                        // Russian follows rule #7 at <https://developer.mozilla.org/en-US/docs/Mozilla/Localization/Localization_and_Plurals>.
+                        if (numberOfSelectedBookmarksString.endsWith("1") && !numberOfSelectedBookmarksString.equals("11")) {  //  Ends in 1.
+                            mode.setSubtitle(numberOfSelectedBookmarks + " " + getString(R.string.selected_russian_ends_in_1));
+                        } else if ((numberOfSelectedBookmarksString.endsWith("2") || numberOfSelectedBookmarksString.endsWith("3") || numberOfSelectedBookmarksString.endsWith("4")) &&
+                                !numberOfSelectedBookmarksString.equals("12") && !numberOfSelectedBookmarksString.equals("13") && !numberOfSelectedBookmarksString.equals("14")) {  // Ends in 2-4.
+                            mode.setSubtitle(numberOfSelectedBookmarks + " " + getString(R.string.selected_russian_ends_in_2));
+                        } else {  // Everything else.
+                            mode.setSubtitle(numberOfSelectedBookmarks + " " + getString(R.string.selected_russian_everything_else));
+                        }
+                    } else {  // Another language is used.
+                        // List the number of selected bookmarks in the subtitle.
+                        mode.setSubtitle(numberOfSelectedBookmarks + " " + getString(R.string.selected));
+                    }
 
                     // Hide non-applicable `MenuItems`.
                     moveBookmarkUpMenuItem.setVisible(false);
@@ -447,11 +463,27 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                         // Instantiate `snackbarMessage`.
                         String snackbarMessage;
 
-                        // Determine how many items are in the array and prepare an appropriate `Snackbar` message.
+                        // Determine how many items are in the array and prepare an appropriate snackbar message.
                         if (selectedBookmarksIdsLongArray.length == 1) {
                             snackbarMessage = getString(R.string.one_bookmark_deleted);
                         } else {
-                            snackbarMessage = selectedBookmarksIdsLongArray.length + " " + getString(R.string.bookmarks_deleted);
+                            // Prepare a snackbar according to the language.
+                            if (getString(R.string.android_asset_path).equals("ru")) {  // The Russian translation is used.
+                                // Convert the number of selected bookmarks to a string.
+                                String numberOfBookmarksString = String.valueOf(selectedBookmarksIdsLongArray.length);
+
+                                // Russian follows rule #7 at <https://developer.mozilla.org/en-US/docs/Mozilla/Localization/Localization_and_Plurals>.
+                                if (numberOfBookmarksString.endsWith("1") && !numberOfBookmarksString.equals("11")) {  //  Ends in 1.
+                                    snackbarMessage = numberOfBookmarksString + " " + getString(R.string.bookmarks_deleted_russian_ends_in_1);
+                                } else if ((numberOfBookmarksString.endsWith("2") || numberOfBookmarksString.endsWith("3") || numberOfBookmarksString.endsWith("4")) &&
+                                        !numberOfBookmarksString.equals("12") && !numberOfBookmarksString.equals("13") && !numberOfBookmarksString.equals("14")) {  // Ends in 2-4.
+                                    snackbarMessage = numberOfBookmarksString + " " + getString(R.string.bookmarks_deleted_russian_ends_in_2);
+                                } else {  // Everything else.
+                                    snackbarMessage = numberOfBookmarksString + " " + getString(R.string.bookmarks_deleted_russian_everything_else);
+                                }
+                            } else {  // Another language is used.
+                                snackbarMessage = selectedBookmarksIdsLongArray.length + " " + getString(R.string.bookmarks_deleted);
+                            }
                         }
 
                         // Show a SnackBar.
index 655387a..03ccd1f 100644 (file)
     <!-- Bookmarks Contextual App Bar. -->
     <string name="one_selected">1 Ausgewählt</string>
     <string name="selected">Ausgewählt</string>  <!--This is a plural adjective.-->
+    <string name="selected_russian_ends_in_1">выбрана</string>
+    <string name="selected_russian_ends_in_2">выбраны</string>
+    <string name="selected_russian_everything_else">выбрано</string>
     <string name="move_up">Nach oben verschieben</string>
     <string name="move_down">Nach unten verschieben</string>
     <string name="edit">Bearbeiten</string>
     <string name="select_all">Alle auswählen</string>
     <string name="one_bookmark_deleted">1 Lesezeichen gelöscht</string>
     <string name="bookmarks_deleted">Lesezeichen gelöscht</string>
+    <string name="bookmarks_deleted_russian_ends_in_1">закладка удалена</string>
+    <string name="bookmarks_deleted_russian_ends_in_2">закладки удалены</string>
+    <string name="bookmarks_deleted_russian_everything_else">акладок удалено</string>
     <string name="undo">Rückgängig</string>
 
     <!-- Bookmarks Database View. -->
index 6acb8b3..7620f05 100644 (file)
     <!-- Bookmarks Contextual App Bar. -->
     <string name="one_selected">1 seleccionado</string>
     <string name="selected">seleccionados</string>  <!--This is a plural adjective.-->
+    <string name="selected_russian_ends_in_1">выбрана</string>
+    <string name="selected_russian_ends_in_2">выбраны</string>
+    <string name="selected_russian_everything_else">выбрано</string>
     <string name="move_up">Subir</string>
     <string name="move_down">Bajar</string>
     <string name="edit">Editar</string>
     <string name="select_all">Selectionar todo</string>
     <string name="one_bookmark_deleted">1 favorito borrado</string>
     <string name="bookmarks_deleted">favoritos borrados</string>
+    <string name="bookmarks_deleted_russian_ends_in_1">закладка удалена</string>
+    <string name="bookmarks_deleted_russian_ends_in_2">закладки удалены</string>
+    <string name="bookmarks_deleted_russian_everything_else">акладок удалено</string>
     <string name="undo">Deshacer</string>
 
     <!-- Bookmarks Database View. -->
index 1b7f3b7..6c061ed 100644 (file)
     <!-- Bookmarks Contextual App Bar. -->
     <string name="one_selected">1 Selezionato</string>
     <string name="selected">Selezionato</string>  <!--This is a plural adjective.-->
+    <string name="selected_russian_ends_in_1">выбрана</string>
+    <string name="selected_russian_ends_in_2">выбраны</string>
+    <string name="selected_russian_everything_else">выбрано</string>
     <string name="move_up">Sposta sopra</string>
     <string name="move_down">Sposta sotto</string>
     <string name="edit">Modifica</string>
     <string name="select_all">Seleziona tutto</string>
     <string name="one_bookmark_deleted">1 Segnalibro eliminato</string>
     <string name="bookmarks_deleted">Segnalibri eliminati</string>
+    <string name="bookmarks_deleted_russian_ends_in_1">закладка удалена</string>
+    <string name="bookmarks_deleted_russian_ends_in_2">закладки удалены</string>
+    <string name="bookmarks_deleted_russian_everything_else">акладок удалено</string>
     <string name="undo">Annulla</string>
 
     <!-- Bookmarks Database View. -->
index f92f45a..1b48b26 100644 (file)
     <!-- Bookmarks Contextual App Bar. -->
     <string name="one_selected">1 выбрана</string>
     <string name="selected">выбраны</string>  <!--This is a plural adjective.-->
+    <string name="selected_russian_ends_in_1">выбрана</string>
+    <string name="selected_russian_ends_in_2">выбраны</string>
+    <string name="selected_russian_everything_else">выбрано</string>
     <string name="move_up">Вверх</string>
     <string name="move_down">Вниз</string>
     <string name="edit">Изменить</string>
     <string name="select_all">Выбрать все</string>
     <string name="one_bookmark_deleted">1 закладка удалена</string>
     <string name="bookmarks_deleted">закладок удалены</string>
+    <string name="bookmarks_deleted_russian_ends_in_1">закладка удалена</string>
+    <string name="bookmarks_deleted_russian_ends_in_2">закладки удалены</string>
+    <string name="bookmarks_deleted_russian_everything_else">акладок удалено</string>
     <string name="undo">Вернуть</string>
 
     <!-- Bookmarks Database View. -->
index a317123..d250185 100644 (file)
     <!-- Bookmarks Contextual App Bar. -->
     <string name="one_selected">1 Selected</string>
     <string name="selected">Selected</string>  <!--This is a plural adjective.-->
+    <string name="selected_russian_ends_in_1">выбрана</string>
+    <string name="selected_russian_ends_in_2">выбраны</string>
+    <string name="selected_russian_everything_else">выбрано</string>
     <string name="move_up">Move Up</string>
     <string name="move_down">Move Down</string>
     <string name="edit">Edit</string>
     <string name="select_all">Select All</string>
     <string name="one_bookmark_deleted">1 Bookmark Deleted</string>
     <string name="bookmarks_deleted">Bookmarks Deleted</string>
+    <string name="bookmarks_deleted_russian_ends_in_1">закладка удалена</string>
+    <string name="bookmarks_deleted_russian_ends_in_2">закладки удалены</string>
+    <string name="bookmarks_deleted_russian_everything_else">акладок удалено</string>
     <string name="undo">Undo</string>
 
     <!-- Bookmarks Database View. -->