This commit is contained in:
Hubcapp
2016-09-02 02:33:20 -05:00
16 changed files with 535 additions and 361 deletions

View File

@@ -1,3 +1,8 @@
v 2.3.0
- dropwizard upgrade 0.9.1
- feed enclosures are hidden if they already displayed in the content
- fix youtube favicons
- various internationalization fixes
v 2.2.0 v 2.2.0
- fix youtube and instagram favicon fetching - fix youtube and instagram favicon fetching
- mark as read filter was lost when a feed was rearranged with drag&drop - mark as read filter was lost when a feed was rearranged with drag&drop

View File

@@ -16,8 +16,8 @@ Browser extensions: [Chrome](https://github.com/Athou/commafeed-chrome) - [Firef
### The very short version (download precompiled package) ### The very short version (download precompiled package)
mkdir commafeed && cd commafeed mkdir commafeed && cd commafeed
wget https://github.com/Athou/commafeed/releases/download/2.2.0/commafeed.jar wget https://github.com/Athou/commafeed/releases/download/2.3.0/commafeed.jar
wget https://raw.githubusercontent.com/Athou/commafeed/2.2.0/config.yml.example -O config.yml wget https://raw.githubusercontent.com/Athou/commafeed/2.3.0/config.yml.example -O config.yml
vi config.yml vi config.yml
java -Djava.net.preferIPv4Stack=true -jar commafeed.jar server config.yml java -Djava.net.preferIPv4Stack=true -jar commafeed.jar server config.yml
@@ -39,7 +39,12 @@ You also need the Java 1.8+ JDK in order to build the application.
To install the required packages to build CommaFeed on Ubuntu, issue the following commands To install the required packages to build CommaFeed on Ubuntu, issue the following commands
# if openjdk-8-jdk is not available on your ubuntu version (14.04 LTS), add the following repo first
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install g++ build-essential openjdk-8-jdk sudo apt-get install g++ build-essential openjdk-8-jdk
# Make sure java8 is the selected java version # Make sure java8 is the selected java version
sudo update-alternatives --config java sudo update-alternatives --config java
sudo update-alternatives --config javac sudo update-alternatives --config javac
@@ -118,7 +123,7 @@ Steps to configuring a development environment for CommaFeed may include, but ma
## Copyright and license ## Copyright and license
Copyright 2013-2015 CommaFeed. Copyright 2013-2016 CommaFeed.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this work except in compliance with the License. you may not use this work except in compliance with the License.

View File

@@ -75,7 +75,7 @@ app:
database: database:
driverClass: org.h2.Driver driverClass: org.h2.Driver
url: jdbc:h2:./target/example;mv_store=false url: jdbc:h2:./target/example
user: sa user: sa
password: sa password: sa
properties: properties:

28
pom.xml
View File

@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.commafeed</groupId> <groupId>com.commafeed</groupId>
<artifactId>commafeed</artifactId> <artifactId>commafeed</artifactId>
<version>2.3.0-SNAPSHOT</version> <version>2.4.0-SNAPSHOT</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>CommaFeed</name> <name>CommaFeed</name>
@@ -15,7 +15,7 @@
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version> <java.version>1.8</java.version>
<dropwizard.version>0.9.0-rc2</dropwizard.version> <dropwizard.version>0.9.1</dropwizard.version>
<guice.version>4.0</guice.version> <guice.version>4.0</guice.version>
<querydsl.version>4.0.2</querydsl.version> <querydsl.version>4.0.2</querydsl.version>
<rome.version>1.5.0</rome.version> <rome.version>1.5.0</rome.version>
@@ -132,7 +132,7 @@
<plugin> <plugin>
<groupId>com.github.kongchen</groupId> <groupId>com.github.kongchen</groupId>
<artifactId>swagger-maven-plugin</artifactId> <artifactId>swagger-maven-plugin</artifactId>
<version>3.1.0</version> <version>3.1.1</version>
<configuration> <configuration>
<apiSources> <apiSources>
<apiSource> <apiSource>
@@ -143,10 +143,9 @@
<title>CommaFeed</title> <title>CommaFeed</title>
<version>${project.version}</version> <version>${project.version}</version>
</info> </info>
<!-- TODO uncomment when 3.1.1 is released --> <typesToSkip>
<!-- <typesToSkip> --> <typeToSkip>com.commafeed.backend.model.User</typeToSkip>
<!-- <typeToSkip>com.commafeed.backend.model.User</typeToSkip> --> </typesToSkip>
<!-- </typesToSkip> -->
</apiSource> </apiSource>
</apiSources> </apiSources>
</configuration> </configuration>
@@ -162,7 +161,7 @@
<plugin> <plugin>
<groupId>com.github.eirslett</groupId> <groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId> <artifactId>frontend-maven-plugin</artifactId>
<version>0.0.24</version> <version>0.0.25</version>
<executions> <executions>
<execution> <execution>
<id>install node and npm</id> <id>install node and npm</id>
@@ -172,7 +171,7 @@
<phase>compile</phase> <phase>compile</phase>
<configuration> <configuration>
<nodeVersion>v0.10.39</nodeVersion> <nodeVersion>v0.10.39</nodeVersion>
<npmVersion>2.12.1</npmVersion> <npmVersion>3.10.6</npmVersion>
</configuration> </configuration>
</execution> </execution>
<execution> <execution>
@@ -181,6 +180,9 @@
<goal>npm</goal> <goal>npm</goal>
</goals> </goals>
<phase>compile</phase> <phase>compile</phase>
<configuration>
<arguments>install</arguments>
</configuration>
</execution> </execution>
<execution> <execution>
<id>bower install</id> <id>bower install</id>
@@ -326,7 +328,7 @@
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId> <artifactId>commons-collections4</artifactId>
<version>4.0</version> <version>4.1</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>commons-codec</groupId> <groupId>commons-codec</groupId>
@@ -415,17 +417,17 @@
<dependency> <dependency>
<groupId>com.h2database</groupId> <groupId>com.h2database</groupId>
<artifactId>h2</artifactId> <artifactId>h2</artifactId>
<version>1.4.187</version> <version>1.3.176</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>mysql</groupId> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version> <version>5.1.37</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.postgresql</groupId> <groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId> <artifactId>postgresql</artifactId>
<version>9.4-1201-jdbc41</version> <version>9.4-1205-jdbc42</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.sourceforge.jtds</groupId> <groupId>net.sourceforge.jtds</groupId>

View File

@@ -7,24 +7,26 @@
"download" : "Descargar", "download" : "Descargar",
"link" : "Enlace", "link" : "Enlace",
"bookmark" : "Marcador", "bookmark" : "Marcador",
"close" : "Close ", "close" : "Cerrar",
"tags" : "Tags " "tags" : "Etiquetas"
}, },
"tree" : { "tree" : {
"subscribe" : "Subscribir", "subscribe" : "Suscribirse",
"import" : "Importar", "import" : "Importar",
"new_category" : "Nueva categoría", "new_category" : "Nueva categoría",
"all" : "Todos", "all" : "Todos",
"starred" : "Destacado" "starred" : "Destacados"
}, },
"subscribe" : { "subscribe" : {
"feed_url" : "URL del Canal", "feed_url" : "URL del canal",
"feed_name" : "Nombre del Canal", "filtering_expression" : "Expresión de filtrado",
"filtering_expression_help" : "Si no está vacía, una expresión se evalúa como 'cierta' o 'falsa'. Si es falsa, las nueva entradas de este canal se marcarán como leídas automáticamente.\nLas variables disponibles son 'title' (título), 'content'(contenido), 'url' (URL), 'author' (autor), y 'categories' (categorías) y sus contenidos son convertidos a minúsculas para facilitar la comparación de strings (cadenas de texto).\nEjemplo: url.contains('youtube') or (author eq 'athou' and title.contains('github').\nLa sintaxis completa está disponible <a href='http://commons.apache.org/proper/commons-jexl/reference/syntax.html' target='_blank'>aquí</a>.",
"feed_name" : "Nombre del canal",
"category" : "Categoría" "category" : "Categoría"
}, },
"import" : { "import" : {
"google_reader_prefix" : "Déjame importar tus canales de tu", "google_reader_prefix" : "Déjame importar tus canales de tu cuenta ",
"google_reader_suffix" : " cuenta.", "google_reader_suffix" : ".",
"google_download" : "También puedes subir tu archivo subscriptions.xml.", "google_download" : "También puedes subir tu archivo subscriptions.xml.",
"google_download_link" : "Descárgalo de aquí.", "google_download_link" : "Descárgalo de aquí.",
"xml_file" : "Archivo OPML" "xml_file" : "Archivo OPML"
@@ -34,147 +36,147 @@
"parent" : "Padre" "parent" : "Padre"
}, },
"toolbar" : { "toolbar" : {
"unread" : "Sin Leer", "unread" : "No leídos",
"all" : "Todos", "all" : "Todos",
"previous_entry" : "Entrada Anterior", "previous_entry" : "Entrada anterior",
"next_entry" : "Próxima Entrada", "next_entry" : "Entrada siguiente",
"refresh" : "Atualizar", "refresh" : "Atualizar",
"refresh_all" : "Force refresh all my feeds ", "refresh_all" : "Forzar la actualización de todos mis canales.",
"sort_by_asc_desc" : "Ordenar por fecha asc/desc", "sort_by_asc_desc" : "Ordenar por fecha asc/desc.",
"titles_only" : "Sólo Títulos", "titles_only" : "Sólo títulos",
"expanded_view" : "Vista Expandida", "expanded_view" : "Vista expandida",
"mark_all_as_read" : "Marcar todos como leído", "mark_all_as_read" : "Marcar todos como leído",
"mark_all_older_12_hours" : "Items older than 12 hours ", "mark_all_older_12_hours" : "Entradas anteriores a 12 horas.",
"mark_all_older_day" : "Artículos anteriores a un día", "mark_all_older_day" : "Entradas anteriores a un día.",
"mark_all_older_week" : "Artículos más de una semana", "mark_all_older_week" : "Entradas anteriores a una semana.",
"mark_all_older_two_weeks" : "Artículos más de does semanas", "mark_all_older_two_weeks" : "Entradas anteriores a 2 semanas.",
"settings" : "Ajustes", "settings" : "Ajustes",
"profile" : "Perfil", "profile" : "Perfil",
"admin" : "Admin", "admin" : "Admin",
"about" : "Acerca de", "about" : "Acerca de...",
"logout" : "Cerrar sesión", "logout" : "Cerrar sesión",
"donate" : "Donar" "donate" : "Donar"
}, },
"view" : { "view" : {
"entry_source" : "from ", "entry_source" : "de ",
"entry_author" : "by ", "entry_author" : "por ",
"error_while_loading_feed" : "Error mientras se cargaba este canal", "error_while_loading_feed" : "Error mientras se cargaba este canal.",
"keep_unread" : "Guardar no leídos", "keep_unread" : "Mantener como no leído.",
"no_unread_items" : "no tiene items sin leer.", "no_unread_items" : "no tiene entradas sin leer.",
"mark_up_to_here" : "Mark as read up to here ", "mark_up_to_here" : "Marcar como leídos hasta aquí.",
"search_for" : "searching for: ", "search_for" : "buscando: ",
"no_search_results" : "No match found for the requested keywords " "no_search_results" : "No se han encontrado resultados para las palabras clave especificadas."
}, },
"feedsearch" : { "feedsearch" : {
"hint" : "Type in a subscription... ", "hint" : "Introduce una suscripción...",
"help" : "Use the return key to select and arrow keys to navigate. ", "help" : "Usa la tecla Intro para seleccionar y las teclas de flecha para navegar.",
"result_prefix" : "Your subscriptions: " "result_prefix" : "Tus suscripciones:"
}, },
"settings" : { "settings" : {
"general" : { "general" : {
"value" : "General", "value" : "General",
"language" : "Lenguaje", "language" : "Idioma",
"language_contribute" : "Contribuye con traducciones", "language_contribute" : "Contribuye con traducciones.",
"show_unread" : "Mostrar canales y categorías sin entradas no leídas.", "show_unread" : "Mostrar canales y categorías sin entradas no leídas.",
"social_buttons" : "Mostrar botones de compartir de redes sociales.", "social_buttons" : "Mostrar botones para compartir de redes sociales.",
"scroll_marks" : "En vista expandida, el desplazamiento por las entradas las marca como leídas" "scroll_marks" : "En vista expandida, el desplazamiento por las entradas las marca como leídas."
}, },
"appearance" : "Appearance ", "appearance" : "Apariencia",
"scroll_speed" : "Scrolling speed when navigating between entries (in milliseconds) ", "scroll_speed" : "Velocidad de desplazamiento al navegar entre entradas (en milisegundos)",
"scroll_speed_help" : "set to 0 to disable ", "scroll_speed_help" : "ponlo a 0 para desactivarlo",
"theme" : "Theme ", "theme" : "Tema",
"submit_your_theme" : "Submit your theme ", "submit_your_theme" : "Envía tu tema ",
"custom_css" : "CSS Personalizado" "custom_css" : "CSS personalizado"
}, },
"details" : { "details" : {
"feed_details" : "Detalles de Canales", "feed_details" : "Detalles del canal",
"url" : "URL", "url" : "URL",
"website" : "Website ", "website" : "Sitio web",
"name" : "Nombre", "name" : "Nombre",
"category" : "Categoría", "category" : "Categoría",
"position" : "Position ", "position" : "Posicióon",
"last_refresh" : "Última actualización", "last_refresh" : "Última actualización",
"message" : "Last refresh message ", "message" : "Último mensaje de actualización",
"next_refresh" : "Next refresh ", "next_refresh" : "Próxima actualización",
"queued_for_refresh" : "Queued for refresh ", "queued_for_refresh" : "En cola para actualizar",
"feed_url" : "URL del Canal", "feed_url" : "URL del canal",
"generate_api_key_first" : "Genera una llave API en tu perfil primero.", "generate_api_key_first" : "Genera una clave API en tu perfil primero.",
"unsubscribe" : "Terminar subscripción", "unsubscribe" : "Terminar suscripción",
"unsubscribe_confirmation" : "Are you sure you want to unsubscribe from this feed? ", "unsubscribe_confirmation" : "¿Estás seguro de querer terminar tu suscripción a este canal?",
"delete_category_confirmation" : "Are you sure you want to delete this category? ", "delete_category_confirmation" : "¿Estás seguro de querer eliminar esta categoría?",
"category_details" : "Detalles de la categoría", "category_details" : "Detalles de la categoría",
"tag_details" : "Tag details ", "tag_details" : "Detalles de las etiuqetas ",
"parent_category" : "Categoría principal" "parent_category" : "Categoría principal"
}, },
"profile" : { "profile" : {
"user_name" : "Nombre de usuario", "user_name" : "Nombre de usuario",
"email" : "Correo", "email" : "Correo electrónico",
"change_password" : "Cambiar contraseña", "change_password" : "Cambiar contraseña",
"confirm_password" : "Confirmar contraseña", "confirm_password" : "Confirmar contraseña",
"minimum_6_chars" : "Mínimo 6 caracteres", "minimum_6_chars" : "Mínimo 6 caracteres",
"passwords_do_not_match" : "Las contraseñas no coinciden", "passwords_do_not_match" : "Las contraseñas no coinciden",
"api_key" : "Llave API", "api_key" : "Clave API",
"api_key_not_generated" : "No generado todavía", "api_key_not_generated" : "No generado todavía",
"generate_new_api_key" : "Generar nueva llave API", "generate_new_api_key" : "Generar nueva clave API",
"generate_new_api_key_info" : "Al cambiar la contraseña se generará una nueva llave API", "generate_new_api_key_info" : "Al cambiar la contraseña se generará una nueva clave API.",
"opml_export" : "Exportación de OPML", "opml_export" : "Exportación de OPML",
"delete_account" : "Eliminar cuenta", "delete_account" : "Eliminar cuenta",
"delete_account_confirmation" : "Delete your acount? There's no turning back! " "delete_account_confirmation" : "¿Eliminar tu cuenta? ¡No habrá vuelta atrás! "
}, },
"about" : { "about" : {
"rest_api" : { "rest_api" : {
"value" : "REST API", "value" : "REST API",
"line1" : "CommaFeed está construido con el uso de JAX-RS y AngularJS. Por eso, un REST API esta disponible.", "line1" : "CommaFeed está construido sobre JAX-RS y AngularJS. Por lo tanto, una REST API está disponible.",
"link_to_documentation" : "Vínculo de la documentación." "link_to_documentation" : "Enlace a la documentación."
}, },
"keyboard_shortcuts" : "Atajos de teclado", "keyboard_shortcuts" : "Atajos de teclado",
"version" : "CommaFeed version ", "version" : "Versión de CommaFeed",
"line1_prefix" : "CommaFeed es un proyecto open-source. El código se encuentra en ", "line1_prefix" : "CommaFeed es un proyecto de código abierto. El código se encuentra en ",
"line1_suffix" : ".", "line1_suffix" : ".",
"line2_prefix" : "Si encuentras un problema, por favor reportalo en la página de problemas de ", "line2_prefix" : "Si encuentras un problema, por favor repórtalo en la página de problemas de ",
"line2_suffix" : " del proyecto.", "line2_suffix" : " del proyecto.",
"line3" : "Si te gusta este proyecto, por favor considera realizar una donacion para apoyar al desarrollador y ayudar a cubrir los costos de mantenimiento.", "line3" : "Si te gusta este proyecto, por favor considera realizar una donación para apoyar al desarrollador y ayudar a cubrir los costes de mantenimiento.",
"line4" : "For those of you who prefer bitcoin, here is the address ", "line4" : "Para aquellos de vosotros que prefieran bitcoin, aquí está la dirección ",
"goodies" : { "goodies" : {
"value" : "Goodies", "value" : "Extras",
"android_app" : "Android app ", "android_app" : "Apps para Android",
"subscribe_url" : "Subscribe URL ", "subscribe_url" : "URL para suscribirse ",
"chrome_extension" : "Extensión de Chrome", "chrome_extension" : "Extensión para Chrome.",
"firefox_extension" : "Extensión de Firefox", "firefox_extension" : "Extensión para Firefox.",
"opera_extension" : "Opera extension ", "opera_extension" : "Extensón para Opera.",
"subscribe_bookmarklet" : "Add subscription bookmarklet (click) ", "subscribe_bookmarklet" : "Añadir marcador de suscripción (clic).",
"subscribe_bookmarklet_asc" : "Oldest first ", "subscribe_bookmarklet_asc" : "Más antiguos primero",
"subscribe_bookmarklet_desc" : "Newest first ", "subscribe_bookmarklet_desc" : "Más recientes primero",
"next_unread_bookmarklet" : "Next unread item bookmarklet (drag to bookmark bar) " "next_unread_bookmarklet" : "Marcador a la siguiente entrada no leída (arástralo a la barra de marcadores) "
}, },
"translation" : { "translation" : {
"value" : "Traducción", "value" : "Traducción",
"message" : "Necesitamos tu ayuda para ayudar a traducir CommaFeed.", "message" : "Necesitamos tu ayuda para ayudar a traducir CommaFeed.",
"link" : "Ver como contribuir con traducciones." "link" : "Ver cómo contribuir con traducciones."
}, },
"announcements" : "Anuncios", "announcements" : "Anuncios",
"shortcuts" : { "shortcuts" : {
"mouse_middleclick" : "ratón botón medio", "mouse_middleclick" : "click medio",
"open_next_entry" : "abrir próxima entrada", "open_next_entry" : "abrir la siguiente entrada",
"open_previous_entry" : "abrir entrada previa", "open_previous_entry" : "abrir la entrada anterior",
"spacebar" : "space/shift+space ", "spacebar" : "espacio/mayúsculas+espacio",
"move_page_down_up" : "moves the page down/up ", "move_page_down_up" : "mueve la página arriba/abajo",
"focus_next_entry" : "Establecer el foco en la próxima entrada sin abrirlo", "focus_next_entry" : "establecer el foco en la siguiente entrada sin abrirla",
"focus_previous_entry" : "Establecer el foco en la entrada anterior sin abrirlo", "focus_previous_entry" : "establecer el foco en la entrada anterior sin abrirla",
"open_next_feed" : "open next feed or category ", "open_next_feed" : "abrir el siguiente canal o categoría",
"open_previous_feed" : "open previous feed or category ", "open_previous_feed" : "abrir el canal o categoría previo",
"open_close_current_entry" : "abrir/cerrar entrada actual", "open_close_current_entry" : "abrir/cerrar la entrada actual",
"open_current_entry_in_new_window" : "abrir entrada actual en una nueva ventana", "open_current_entry_in_new_window" : "abrir la entrada actual en una nueva ventana",
"open_current_entry_in_new_window_background" : "open current entry in a new window in the background ", "open_current_entry_in_new_window_background" : "abrir la entrada actual en una nueva ventana en segundo plano",
"star_unstar" : "marcar/no marcar la entrada actual", "star_unstar" : "destacar la entrada actual",
"mark_current_entry" : "marcar como leída/no la leída entrada actual", "mark_current_entry" : "marcar la entrada actual como leída/no la leída",
"mark_all_as_read" : "marcar todas las entradas como leídas", "mark_all_as_read" : "marcar todas las entradas como leídas",
"open_in_new_tab_mark_as_read" : "abrir entrada en una nueva pestaña y marcar como leída", "open_in_new_tab_mark_as_read" : "abrir entrada en una nueva pestaña y marcar como leída",
"fullscreen" : "toggle full screen mode ", "fullscreen" : "activar/desactivar el modo pantalla completa ",
"font_size" : "increase/decrease font size of the current entry ", "font_size" : "aumentar/reducir el tamaño de la fuente de la entrada actual",
"go_to_all" : "go to the All view ", "go_to_all" : "ver Todos",
"go_to_starred" : "go to the Starred view ", "go_to_starred" : "ver Destacados",
"feed_search" : "navigate to a subscription by entering the subscription name " "feed_search" : "navega a una suscripción al introducir su nombre"
} }
} }
} }

View File

@@ -34,24 +34,24 @@
"parent" : "Parent" "parent" : "Parent"
}, },
"toolbar" : { "toolbar" : {
"unread" : "Non-lus", "unread" : "Non lus",
"all" : "Tous", "all" : "Tous",
"previous_entry" : "Article précédent", "previous_entry" : "Article précédent",
"next_entry" : "Article suivant", "next_entry" : "Article suivant",
"refresh" : "Rafraîchir", "refresh" : "Rafraîchir",
"refresh_all" : "Force refresh all my feeds ", "refresh_all" : "Rafraîchir tous les flux",
"sort_by_asc_desc" : "Trier par date croissante/décroissante", "sort_by_asc_desc" : "Trier par date croissante/décroissante",
"titles_only" : "Titres uniquement", "titles_only" : "Titres uniquement",
"expanded_view" : "Vue étendue", "expanded_view" : "Vue étendue",
"mark_all_as_read" : "Tout marquer comme lu", "mark_all_as_read" : "Tout marquer comme lu",
"mark_all_older_12_hours" : "Items older than 12 hours ", "mark_all_older_12_hours" : "Articles de plus de 12 heures",
"mark_all_older_day" : "Articles de plus d'un jour", "mark_all_older_day" : "Articles de plus d'une journée",
"mark_all_older_week" : "Articles de plus d'une semaine", "mark_all_older_week" : "Articles de plus d'une semaine",
"mark_all_older_two_weeks" : "Articles de plus d'un mois", "mark_all_older_two_weeks" : "Articles de plus d'un mois",
"settings" : "Préférences", "settings" : "Préférences",
"profile" : "Profil", "profile" : "Profil",
"admin" : "Administration", "admin" : "Administration",
"about" : "A propos", "about" : "À propos",
"logout" : "Déconnexion", "logout" : "Déconnexion",
"donate" : "Faire un don" "donate" : "Faire un don"
}, },
@@ -59,16 +59,16 @@
"entry_source" : "sur", "entry_source" : "sur",
"entry_author" : "par ", "entry_author" : "par ",
"error_while_loading_feed" : "Erreur durant le chargement de ce flux", "error_while_loading_feed" : "Erreur durant le chargement de ce flux",
"keep_unread" : "Garder non-lu", "keep_unread" : "Garder non lu",
"no_unread_items" : "n'a pas d'articles non-lus.", "no_unread_items" : "n'a pas d'articles non lus.",
"mark_up_to_here" : "Marquer comme lu jusqu'ici", "mark_up_to_here" : "Marquer comme lu jusqu'ici",
"search_for" : "searching for: ", "search_for" : "recherche : ",
"no_search_results" : "No match found for the requested keywords " "no_search_results" : "Pas de résultats avec le terme indiqué."
}, },
"feedsearch" : { "feedsearch" : {
"hint" : "Tapez un nom de flux", "hint" : "Tapez un nom de flux",
"help" : "Utilisez la touche entrée pour sélectionner et les flèches pour naviguer", "help" : "Utilisez la touche entrée pour sélectionner et les flèches pour naviguer",
"result_prefix" : "Vos flux:" "result_prefix" : "Vos flux :"
}, },
"settings" : { "settings" : {
"general" : { "general" : {
@@ -76,12 +76,12 @@
"language" : "Langue", "language" : "Langue",
"language_contribute" : "Contribuer aux traductions", "language_contribute" : "Contribuer aux traductions",
"show_unread" : "Afficher les flux et les catégories pour lesquels tout est déjà lu", "show_unread" : "Afficher les flux et les catégories pour lesquels tout est déjà lu",
"social_buttons" : "Afficher les boutons de partage sur réseaux sociaux", "social_buttons" : "Afficher les boutons de partage sur les réseaux sociaux",
"scroll_marks" : "En mode de lecture étendu, marquer comme lu les éléments lorsque la fenêtre descend." "scroll_marks" : "En mode de lecture étendu, marquer les éléments comme lus lorsque la fenêtre descend."
}, },
"appearance" : "Apparence", "appearance" : "Apparence",
"scroll_speed" : "Scrolling speed when navigating between entries (in milliseconds) ", "scroll_speed" : "Vitesse de défilement entre les entrées (en millisecondes) ",
"scroll_speed_help" : "set to 0 to disable ", "scroll_speed_help" : "Mettez 0 pour désactiver",
"theme" : "Thème", "theme" : "Thème",
"submit_your_theme" : "Soumettez votre thème.", "submit_your_theme" : "Soumettez votre thème.",
"custom_css" : "CSS personnelle" "custom_css" : "CSS personnelle"
@@ -94,16 +94,16 @@
"category" : "Catégorie", "category" : "Catégorie",
"position" : "Position", "position" : "Position",
"last_refresh" : "Dernière mise à jour", "last_refresh" : "Dernière mise à jour",
"message" : "Last refresh message ", "message" : "Message de la dernière mise à jour ",
"next_refresh" : "Prochaine mise à jour", "next_refresh" : "Prochaine mise à jour",
"queued_for_refresh" : "En file d'attente", "queued_for_refresh" : "En file d'attente",
"feed_url" : "URL du flux", "feed_url" : "URL du flux",
"generate_api_key_first" : "Générez une clé API dans votre profil d'abord.", "generate_api_key_first" : "Générez d'abord une clé API dans votre profil.",
"unsubscribe" : "Se désabonner", "unsubscribe" : "Se désabonner",
"unsubscribe_confirmation" : "Are you sure you want to unsubscribe from this feed? ", "unsubscribe_confirmation" : "Êtes-vous sûr de vouloir vous désabonner de de flux ? ",
"delete_category_confirmation" : "Are you sure you want to delete this category? ", "delete_category_confirmation" : "Êtes-vous sûr de vouloir supprimer cette catégorie ? ",
"category_details" : "Détails de la catégorie", "category_details" : "Détails de la catégorie",
"tag_details" : "Tag details ", "tag_details" : "Détails du tag",
"parent_category" : "Catégorie parente" "parent_category" : "Catégorie parente"
}, },
"profile" : { "profile" : {
@@ -116,15 +116,15 @@
"api_key" : "Clé API", "api_key" : "Clé API",
"api_key_not_generated" : "Pas encore générée", "api_key_not_generated" : "Pas encore générée",
"generate_new_api_key" : "Générer une nouvelle clé API", "generate_new_api_key" : "Générer une nouvelle clé API",
"generate_new_api_key_info" : "Changer de mot de passe va générer une nouvelle clé API", "generate_new_api_key_info" : "Changer de mot de passe générera une nouvelle clé API",
"opml_export" : "Export du fichier OPML", "opml_export" : "Export du fichier OPML",
"delete_account" : "Effacer le compte", "delete_account" : "Effacer le compte",
"delete_account_confirmation" : "Delete your acount? There's no turning back! " "delete_account_confirmation" : "Êtes-vous sûr de vouloir supprimer définitivement votre compte ?"
}, },
"about" : { "about" : {
"rest_api" : { "rest_api" : {
"value" : "API REST", "value" : "API REST",
"line1" : "CommaFeed utilise JAX-RS et AngularJS, donc une API REST est disponible.", "line1" : "CommaFeed utilise JAX-RS et AngularJS, une API REST est donc disponible.",
"link_to_documentation" : "Lien vers la documentation." "link_to_documentation" : "Lien vers la documentation."
}, },
"keyboard_shortcuts" : "Raccourcis clavier", "keyboard_shortcuts" : "Raccourcis clavier",
@@ -145,7 +145,7 @@
"subscribe_bookmarklet" : "Bookmarklet d'ajout d'abonnement", "subscribe_bookmarklet" : "Bookmarklet d'ajout d'abonnement",
"subscribe_bookmarklet_asc" : "Du plus ancien au plus récent", "subscribe_bookmarklet_asc" : "Du plus ancien au plus récent",
"subscribe_bookmarklet_desc" : "Du plus récent au plus ancien", "subscribe_bookmarklet_desc" : "Du plus récent au plus ancien",
"next_unread_bookmarklet" : "Bookmarklet vers le prochain article non-lu" "next_unread_bookmarklet" : "Bookmarklet vers le prochain article non lu"
}, },
"translation" : { "translation" : {
"value" : "Traduction", "value" : "Traduction",
@@ -165,9 +165,9 @@
"open_previous_feed" : "Sélectionner le flux ou la catégorie précédente", "open_previous_feed" : "Sélectionner le flux ou la catégorie précédente",
"open_close_current_entry" : "Ouvrir/fermer l'article courant", "open_close_current_entry" : "Ouvrir/fermer l'article courant",
"open_current_entry_in_new_window" : "Ouvrir l'article courant dans une nouvelle fenêtre", "open_current_entry_in_new_window" : "Ouvrir l'article courant dans une nouvelle fenêtre",
"open_current_entry_in_new_window_background" : "Ouvrir l'article courant dans une nouvelle fenêtre en arrière plan", "open_current_entry_in_new_window_background" : "Ouvrir l'article courant dans une nouvelle fenêtre en arrière-plan",
"star_unstar" : "Ajouter/enlever l'article courant des favoris", "star_unstar" : "Ajouter/enlever l'article courant des favoris",
"mark_current_entry" : "Marquer comme lue/non-lue l'article courant", "mark_current_entry" : "Marquer comme lu/non lu l'article courant",
"mark_all_as_read" : "Marquer tous les articles comme lus", "mark_all_as_read" : "Marquer tous les articles comme lus",
"open_in_new_tab_mark_as_read" : "Ouvrir l'article courant dans une nouvelle fenêtre et marquer comme lu", "open_in_new_tab_mark_as_read" : "Ouvrir l'article courant dans une nouvelle fenêtre et marquer comme lu",
"fullscreen" : "Activer/désactiver le mode plein-écran", "fullscreen" : "Activer/désactiver le mode plein-écran",
@@ -177,4 +177,4 @@
"feed_search" : "Naviguer vers un flux en entrant son nom" "feed_search" : "Naviguer vers un flux en entrant son nom"
} }
} }
} }

182
src/main/app/i18n/id.js Normal file
View File

@@ -0,0 +1,182 @@
{
"global" : {
"save" : "Simpan",
"cancel" : "Batal",
"delete" : "Hapus",
"required" : "Diminta",
"download" : "Unduh",
"link" : "Tautan",
"bookmark" : "Penanda halaman buku",
"close" : "Tutup",
"tags" : "Penanda"
},
"tree" : {
"subscribe" : "Berlangganan",
"import" : "Impor",
"new_category" : "Kategori Baru",
"all" : "Semua",
"starred" : "Diutamakan"
},
"subscribe" : {
"feed_url" : "Umpan URL",
"feed_name" : "Nama Umpan",
"category" : "Kategori"
},
"import" : {
"google_reader_prefix" : "Izinkan saya mengimpor umpan Anda dari kepunyaan Anda ",
"google_reader_suffix" : " akun.",
"google_download" : "Atau, unggah berkas subscriptions.xml Anda.",
"google_download_link" : "Unggah dari sini.",
"xml_file" : "Berkas OPML"
},
"new_category" : {
"name" : "Nama",
"parent" : "Induk"
},
"toolbar" : {
"unread" : "Belum dibaca",
"all" : "Semua",
"previous_entry" : "Catatan sebelumnya",
"next_entry" : "Catatan selanjutnya",
"refresh" : "Segarkan",
"refresh_all" : "Memaksa menyegarkan semua umpan saya",
"sort_by_asc_desc" : "Urutkan menurut tanggal asc/desc",
"titles_only" : "Hanya Judul",
"expanded_view" : "Penglihatan diperluas",
"mark_all_as_read" : "Tandai semua sebagai telah dibaca",
"mark_all_older_12_hours" : "Butir lebih lama 12 jam",
"mark_all_older_day" : "Butir lebih lama sehari",
"mark_all_older_week" : "Butir lebih lama seminggu",
"mark_all_older_two_weeks" : "Butir lebih lama dua minggu",
"settings" : "Pengaturan",
"profile" : "Profil",
"admin" : "Admin",
"about" : "Tentang",
"logout" : "Keluar",
"donate" : "Donasi"
},
"view" : {
"entry_source" : "dari ",
"entry_author" : "oleh ",
"error_while_loading_feed" : "Galat saat memuat umpan ini",
"keep_unread" : "Tetapkan belum dibaca",
"no_unread_items" : "Tidak ada yang butir yang belum dibaca.",
"mark_up_to_here" : "Tandai sebagai dibaca di sini",
"search_for" : "mencari: ",
"no_search_results" : "Tidak ditemukan kata kunci yang sesuai dengan permintaan"
},
"feedsearch" : {
"hint" : "Ketik sebuah langganan...",
"help" : "Gunakan tombol enter untuk memilih dan tombol panah untuk navigasi.",
"result_prefix" : "Langganan Anda:"
},
"settings" : {
"general" : {
"value" : "Umum",
"language" : "Bahasa",
"language_contribute" : "Kontribusi dengan terjemahan",
"show_unread" : "Menampilkan umpan dan kategori tanpa catatan belum dibaca",
"social_buttons" : "Menampilkan tombol sosial berbagi",
"scroll_marks" : "Di penglihatan luas, menggulir melalui catatan menandakan sebagai telah dibaca"
},
"appearance" : "Penampilan",
"scroll_speed" : "Kecepatan menggulir ketika menavigasi antar catatan (dalam milidetik)",
"scroll_speed_help" : "setel ke 0 untuk menonaktifkan",
"theme" : "Tema",
"submit_your_theme" : "Mengajukan tema Anda",
"custom_css" : "Ubah CSS"
},
"details" : {
"feed_details" : "Rincian Umpan",
"url" : "URL",
"website" : "Situs",
"name" : "Nama",
"category" : "Kategori",
"position" : "Posisi",
"last_refresh" : "Penyegaran terakhir",
"message" : "Menyegarkan pesan terakhir",
"next_refresh" : "Penyegaran selanjutnya",
"queued_for_refresh" : "Antri untuk penyegaran",
"feed_url" : "Umpan URL",
"filtering_expression" : "Penyaring ekspresi",
"filtering_expression_help" : "Jika tidak kosong, sebuah ekspresi mengevaluasi ke 'benar' atau 'salah'. Jika salah, catatan baru untuk umpan ini akan ditandai sebagai telah dibaca secara otomatis. \nVariabel yang tersedia adalah 'judul', 'konten', 'url' 'penulis' dan 'kategori' dan konten mereka dikonversi dari huruf kecil ke perbandingan string yang mudah. \nContoh: url.contains('youtube') or (author eq 'athou' and title.contains('github'). \nSintaksis lengkap tersedia di <a href='http://commons.apache.org/proper/commons-jexl/reference/syntax.html' target='_blank'>here</a>.",
"generate_api_key_first" : "Menghasilkan sebuah kunci API di profil Anda terlebih dahulu.",
"unsubscribe" : "Berhenti berlangganan",
"unsubscribe_confirmation" : "Apakah Anda yakin ingin berhenti berlangganan dari umpan ini?",
"delete_category_confirmation" : "Apakah Anda yakin ingin menghapus dari kategori ini?",
"category_details" : "rincian Kategori",
"tag_details" : "rincian Penanda",
"parent_category" : "kategori Induk"
},
"profile" : {
"user_name" : "nama Pengguna",
"email" : "Surel",
"change_password" : "Ganti kata sandi",
"confirm_password" : "Konfirmasi kata sandi",
"minimum_6_chars" : "Minimal 6 karakter",
"passwords_do_not_match" : "Kata sandi tidak sesuai",
"api_key" : "kunci API",
"api_key_not_generated" : "Belum menghasilkan",
"generate_new_api_key" : "Hasilkan kunci API baru",
"generate_new_api_key_info" : "Mengganti kata sandi akan menghasilkan sebuah kunci API baru",
"opml_export" : "ekspor OPML",
"delete_account" : "Hapus akun",
"delete_account_confirmation" : "Hapus akun Anda? Hal ini tidak dapat dikembalikan!"
},
"about" : {
"rest_api" : {
"value" : "REST API",
"line1" : "CommaFeed dibangun di atas JAX-RS dan AngularJS. Dengan demikian, tersedia sebuah REST API.",
"link_to_documentation" : "Tautan menuju dokumentasi."
},
"keyboard_shortcuts" : "pintasan Papanketik",
"version" : "versi CommaFeed",
"line1_prefix" : "CommaFeed adalah suatu proyek open-source. Sumber di ",
"line1_suffix" : ".",
"line2_prefix" : "Jika Anda mengalami sebuah isu, silahkan laporkan pada halaman isu ",
"line2_suffix" : " proyek.",
"line3" : "Jika Anda menyukai proyek ini, silahkan mempertimbangkan suatu donasi untuk mendukung pengembang dan membantu menutupi biaya online situs ini.",
"line4" : "Untuk Anda yang lebih suka bitcoin, alamatnya di sini",
"goodies" : {
"value" : "Bingkisan",
"android_app" : "Android app",
"subscribe_url" : "URL Langganan",
"chrome_extension" : "ekstensi Chrome",
"firefox_extension" : "ekstensi Firefox",
"opera_extension" : "ekstensi Opera",
"subscribe_bookmarklet" : "Tambahkan bookmarklet langganan(klik)",
"subscribe_bookmarklet_asc" : "Terlama dahulu",
"subscribe_bookmarklet_desc" : "Terbaru dahulu",
"next_unread_bookmarklet" : "Butir bookmarklet selanjutnya yang belum dibaca (seret ke batang penanda halaman buku)"
},
"translation" : {
"value" : "Terjemahan",
"message" : "Kami membutuhkan bantuan Anda untuk menterjemahkan CommaFeed.",
"link" : "Lihat bagaimana berkontribusi dengan terjemahan."
},
"announcements" : "Pengumuman",
"shortcuts" : {
"mouse_middleclick" : "klik tengah tetikus",
"open_next_entry" : "buka catatan selanjutnya",
"open_previous_entry" : "buka catatan sebelumnya",
"spacebar" : "spasi/shift+spasi",
"move_page_down_up" : "pindah halaman bawah/atas",
"focus_next_entry" : "setel fokus pada catatan selanjutnya tanpa membukanya",
"focus_previous_entry" : "setel fokus pada catatan sebelumnya tanpa membukanya",
"open_next_feed" : "buka umpan atau kategori selanjutnya",
"open_previous_feed" : "buka umpan atau kategori sebelumnya",
"open_close_current_entry" : "buka/tutup catatan saat ini",
"open_current_entry_in_new_window" : "buka catatan saat ini di sebuah jendela baru",
"open_current_entry_in_new_window_background" : "buka catatan saat ini di sebuah jendela baru pada latar",
"star_unstar" : "tanda bintang/tidak catatan saat ini",
"mark_current_entry" : "tandai sebagai telah dibaca/belum catatan saat ini",
"mark_all_as_read" : "tandai semua catatan sebagai telah dibaca",
"open_in_new_tab_mark_as_read" : "buka catatan di tab baru dan tandai sebagai telah dibaca",
"fullscreen" : "beralih modus layar penuh",
"font_size" : "tingkatkan/turunkan ukuran huruf dari catatan saat ini",
"go_to_all" : "menuju ke lihat Semua",
"go_to_starred" : "menuju ke lihat Tanda Bintang",
"feed_search" : "navigasi ke langganan dengan memasukkan nama langganan"
}
}
}

View File

@@ -1,33 +1,33 @@
{ {
"global" : { "global" : {
"save" : "Salva", "save" : "Salva",
"cancel" : "Cancella", "cancel" : "Annulla",
"delete" : "Elimina", "delete" : "Elimina",
"required" : "Richiesto", "required" : "Richiesto",
"download" : "Download", "download" : "Download",
"link" : "Link", "link" : "Link",
"bookmark" : "Segnalibro", "bookmark" : "Segnalibro",
"close" : "Chiudi", "close" : "Chiudi",
"tags" : "Etichette " "tags" : "Tag"
}, },
"tree" : { "tree" : {
"subscribe" : "Abbonati", "subscribe" : "Iscriviti",
"import" : "Importa", "import" : "Importa",
"new_category" : "Nuova categoria", "new_category" : "Nuova categoria",
"all" : "Tutto", "all" : "Tutti",
"starred" : "Preferiti" "starred" : "Preferiti"
}, },
"subscribe" : { "subscribe" : {
"feed_url" : "Feed URL", "feed_url" : "URL feed",
"feed_name" : "Nome feed", "feed_name" : "Nome feed",
"category" : "Categoria" "category" : "Categoria"
}, },
"import" : { "import" : {
"google_reader_prefix" : "Permettimi di importare i tuoi feed dal tuo ", "google_reader_prefix" : "Permettimi di importare i feed dal tuo account ",
"google_reader_suffix" : " account.", "google_reader_suffix" : ".",
"google_download" : "Oppure, carica il tuo file subscriptions.xml.", "google_download" : "Oppure carica il tuo file subscriptions.xml.",
"google_download_link" : "Scaricalo da qui.", "google_download_link" : "Puoi scaricalo da qui.",
"xml_file" : "OPML File" "xml_file" : "File OPML"
}, },
"new_category" : { "new_category" : {
"name" : "Nome", "name" : "Nome",
@@ -38,12 +38,12 @@
"all" : "Tutti", "all" : "Tutti",
"previous_entry" : "Precedente", "previous_entry" : "Precedente",
"next_entry" : "Successivo", "next_entry" : "Successivo",
"refresh" : "Ricarica", "refresh" : "Aggiorna",
"refresh_all" : "Forza l'aggiornamento di tutte i miei feed", "refresh_all" : "Forza l'aggiornamento di tutti i feed",
"sort_by_asc_desc" : "Ordina per data ascendente/decrescente", "sort_by_asc_desc" : "Ordina per data crescente/decrescente",
"titles_only" : "Solo i titoli", "titles_only" : "Solo i titoli",
"expanded_view" : "Espandi", "expanded_view" : "Espandi",
"mark_all_as_read" : "Segna tutto come già letto", "mark_all_as_read" : "Segna tutti come già letti",
"mark_all_older_12_hours" : "Elementi più vecchi di 12 ore", "mark_all_older_12_hours" : "Elementi più vecchi di 12 ore",
"mark_all_older_day" : "Elementi più vecchi di un giorno", "mark_all_older_day" : "Elementi più vecchi di un giorno",
"mark_all_older_week" : "Elementi più vecchi di una settimana", "mark_all_older_week" : "Elementi più vecchi di una settimana",
@@ -56,56 +56,56 @@
"donate" : "Dona" "donate" : "Dona"
}, },
"view" : { "view" : {
"entry_source" : "da ", "entry_source" : "da",
"entry_author" : "di ", "entry_author" : "di",
"error_while_loading_feed" : "Si è verificato un errore durante il caricamento di questo feed", "error_while_loading_feed" : "Si è verificato un errore durante il caricamento del feed",
"keep_unread" : "Mantiene come non leggere", "keep_unread" : "Mantieni come da leggere",
"no_unread_items" : "Non ci sono elementi da leggere.", "no_unread_items" : "non contiene elementi da leggere",
"mark_up_to_here" : "Segna come letto fino qui", "mark_up_to_here" : "Segna come letto fin qui",
"search_for" : "cercando: ", "search_for" : "Cerca: ",
"no_search_results" : "Nessun risultato trovato per le parole chiave cercate" "no_search_results" : "Nessun risultato per le parole chiave cercate"
}, },
"feedsearch" : { "feedsearch" : {
"hint" : "Digita in una sottoscrizione... ", "hint" : "Digita il nome di una sottoscrizione... ",
"help" : "Usa il tasto invio per selezionare e le frecce per navigare.", "help" : "Usa il tasto Invio per selezionare e le frecce per navigare.",
"result_prefix" : "Le tue sottoscrizioni:" "result_prefix" : "Le tue sottoscrizioni:"
}, },
"settings" : { "settings" : {
"general" : { "general" : {
"value" : "Generali", "value" : "Generali",
"language" : "Lingua", "language" : "Lingua",
"language_contribute" : "Contribuisci nelle traduzioni", "language_contribute" : "Contribuisci alle traduzioni",
"show_unread" : "Mostra i feed e le categorie con elementi non letti", "show_unread" : "Mostra i feed e le categorie con voci non lette",
"social_buttons" : "Mostra i pulsanti social network di condivisione", "social_buttons" : "Mostra i pulsanti di condivisione social",
"scroll_marks" : "In modalità estesa, segna come letto le voci quando scorri" "scroll_marks" : "In vista estesa, segna come lette le voci che scorri"
}, },
"appearance" : "Aspetto", "appearance" : "Aspetto",
"scroll_speed" : "Velocità dello scorrimento durante la navigazione tra i feed (in millisecondi) ", "scroll_speed" : "Velocità di scorrimento quando navighi tra i feed (in millisecondi)",
"scroll_speed_help" : "Imposta 0 per disabilitare", "scroll_speed_help" : "Imposta su 0 per disabilitare",
"theme" : "Tema", "theme" : "Tema",
"submit_your_theme" : "Proponi il tuo tema", "submit_your_theme" : "Sottoponi il tuo tema",
"custom_css" : "CSS personalizzato" "custom_css" : "CSS personalizzato"
}, },
"details" : { "details" : {
"feed_details" : "Dettagli feed", "feed_details" : "Dettagli feed",
"url" : "URL ", "url" : "URL",
"website" : "Sito Web", "website" : "Sito web",
"name" : "Nome", "name" : "Nome",
"category" : "Categoria", "category" : "Categoria",
"position" : "Posizione", "position" : "Posizione",
"last_refresh" : "Ultimo aggiornamento", "last_refresh" : "Ultimo aggiornamento",
"message" : "Ultimo messaggio di aggiornamento", "message" : "Ultimo messaggio di aggiornamento",
"next_refresh" : "Prossimo aggiornamento", "next_refresh" : "Prossimo aggiornamento",
"queued_for_refresh" : "In attesa per l'aggiornamento", "queued_for_refresh" : "In coda per l'aggiornamento",
"feed_url" : "URL del feed ", "feed_url" : "URL feed",
"filtering_expression" : "Espressione del filtro", "filtering_expression" : "Espressione filtro",
"filtering_expression_help" : "Se non è vuoto, una espressione viene misurata in 'true' o 'false'. Se falsa, i nuovi elementi di questo feed verranno segnati automaticamente come letti.\nLe variabili accettate sono 'title', 'content', 'url' 'author' e 'categories' e il loro contenuto è convertito in minuscolo per una facile confronto di stringhe.\Esempio: url.contains('youtube') o (author eq 'athou' and title.contains('github').\nLa sintassi completa è disponibile <a href='http://commons.apache.org/proper/commons-jexl/reference/syntax.html' target='_blank'>qui</a>.", "filtering_expression_help" : "Quando non è vuota, l'espressione viene applicata a ogni nuovo elemento e valutata come 'vera' o 'falsa'. Se falsa, l'elemento verrà segnato automaticamente come letto.\nLe variabili accettate sono 'title' (titolo), 'content' (contenuto), 'url', 'author' (autore) e 'categories' (categorie); il loro contenuto è convertito in minuscolo per facilitarne il confronto.\nEsempio: url.contains('youtube') or (author eq 'athou' and title.contains('github')).\nLa sintassi completa è disponibile <a href='http://commons.apache.org/proper/commons-jexl/reference/syntax.html' target='_blank'>qui</a> (in inglese).",
"generate_api_key_first" : "Genera prima una chiave API nelle impostazioni del tuo profilo.", "generate_api_key_first" : "Genera prima una chiave API nelle impostazioni del tuo profilo.",
"unsubscribe" : "Annulla la sottoscrizione", "unsubscribe" : "Disiscriviti",
"unsubscribe_confirmation" : "Sei sicuro di voler annullare la sottoscrizione da questo feed?", "unsubscribe_confirmation" : "Sei sicuro di voler annullare la sottoscrizione al feed?",
"delete_category_confirmation" : "Sei sicuro di voler eliminare questa categoria?", "delete_category_confirmation" : "Sei sicuro di voler eliminare questa categoria?",
"category_details" : "Dettagli categoria", "category_details" : "Dettagli categoria",
"tag_details" : "Dettagli etichette ", "tag_details" : "Dettagli tag",
"parent_category" : "Categoria principale" "parent_category" : "Categoria principale"
}, },
"profile" : { "profile" : {
@@ -117,66 +117,66 @@
"passwords_do_not_match" : "Le password non corrispondono", "passwords_do_not_match" : "Le password non corrispondono",
"api_key" : "chiave API", "api_key" : "chiave API",
"api_key_not_generated" : "Non ancora generata", "api_key_not_generated" : "Non ancora generata",
"generate_new_api_key" : "Genera una nuova chiave API ", "generate_new_api_key" : "Genera una nuova chiave API",
"generate_new_api_key_info" : "Cambiando la password sarà generata una nuova chiave API ì", "generate_new_api_key_info" : "Cambiando la password sarà generata una nuova chiave API",
"opml_export" : "Esporta OPML", "opml_export" : "Esporta OPML",
"delete_account" : "Elimina il profilo", "delete_account" : "Elimina account",
"delete_account_confirmation" : "Eliminare il tuo profilo? Non si può tornare indietro!" "delete_account_confirmation" : "Vuoi eliminare il tuo account? Non si può tornare indietro!"
}, },
"about" : { "about" : {
"rest_api" : { "rest_api" : {
"value" : "REST API", "value" : "REST API",
"line1" : "CommaFeed è costruito sopra JAX-RS e AngularJS. Ed ovviamente, una REST API è disponibile.", "line1" : "CommaFeed è basato su JAX-RS e AngularJS. Pertanto è disponibile una REST API.",
"link_to_documentation" : "Collegamento alla documentazione." "link_to_documentation" : "Link alla documentazione."
}, },
"keyboard_shortcuts" : "Scorciatoie da tastiera", "keyboard_shortcuts" : "Scorciatoie da tastiera",
"version" : "Versione di CommaFeed", "version" : "Versione di CommaFeed",
"line1_prefix" : "CommaFeed è un progetto open source. I codici sono ospitati su ", "line1_prefix" : "CommaFeed è un progetto open source. Trovi i sorgenti su ",
"line1_suffix" : ".", "line1_suffix" : ".",
"line2_prefix" : "Se hai qualche problema, segnalalo sulla pagina del ", "line2_prefix" : "Se hai qualche problema, segnalalo sulla pagina del progetto ",
"line2_suffix" : " progetto.", "line2_suffix" : ".",
"line3" : "Se ti piace il progetto, considera una donazione per supportare lo sviluppatore ed a aiutare per coprire i costi di mantenenimento di questo sito online.", "line3" : "Se ti piace questo progetto, considera una donazione per supportare lo sviluppatore e aiutare a coprire i costi di manutenzione di questo sito.",
"line4" : "Se preferisci i Bitcoin, questo è l'indirizzo", "line4" : "Se preferisci Bitcoin, questo è l'indirizzo",
"goodies" : { "goodies" : {
"value" : "Goodies", "value" : "Cose che potrebbero interessarti",
"android_app" : "Applicazione Android", "android_app" : "Applicazione Android",
"subscribe_url" : "Sottoscrivi URL", "subscribe_url" : "Sottoscrivi URL",
"chrome_extension" : "Estensione per Chrome", "chrome_extension" : "Estensione per Chrome",
"firefox_extension" : "Estensione per Firefox", "firefox_extension" : "Estensione per Firefox",
"opera_extension" : "Estensione per Opera", "opera_extension" : "Estensione per Opera",
"subscribe_bookmarklet" : "Aggiungi la sottoscrizione ai segnalibri (clicca)", "subscribe_bookmarklet" : "Aggiungi la sottoscrizione ai segnalibri (clicca)",
"subscribe_bookmarklet_asc" : "I più vecchi prima", "subscribe_bookmarklet_asc" : "Prima i vecchi",
"subscribe_bookmarklet_desc" : "I più nuovi prima", "subscribe_bookmarklet_desc" : "Prima i recenti",
"next_unread_bookmarklet" : "Prossimo elemento non letto nei segnalibri (trascinali nella barra dei segnalibri)" "next_unread_bookmarklet" : "Bookmarklet al prossimo elemento da leggere (trascinalo nella barra dei segnalibri)"
}, },
"translation" : { "translation" : {
"value" : "Traduzioni", "value" : "Traduzioni",
"message" : "Abbiamo bisogno del tuo aiuto per tradurre CommaFeed.", "message" : "Abbiamo bisogno del tuo aiuto per tradurre CommaFeed.",
"link" : "Vedi come aiutarci nella traduzioni." "link" : "Scopri come aiutarci nella traduzioni."
}, },
"announcements" : "Annunci", "announcements" : "Annunci",
"shortcuts" : { "shortcuts" : {
"mouse_middleclick" : "click centrale del mouse", "mouse_middleclick" : "click centrale del mouse",
"open_next_entry" : "apri l'elemento successivo", "open_next_entry" : "apri successivo",
"open_previous_entry" : "apri l'elemento precedente", "open_previous_entry" : "apri precedente",
"spacebar" : "spazio/shift+spazio", "spacebar" : "SPAZIO/MAIUSC+SPAZIO",
"move_page_down_up" : "muovi la pagina sopra/sotto", "move_page_down_up" : "muove la pagina in su/giù",
"focus_next_entry" : "imposta il fuoco sull'elemento successivo senza aprirlo", "focus_next_entry" : "metti a fuoco l'elemento successivo senza aprirlo",
"focus_previous_entry" : "imposta il fuoco sull'elemento precedente senza aprirlo", "focus_previous_entry" : "metti a fuoco l'elemento precedente senza aprirlo",
"open_next_feed" : "apri il feed successivo od una categoria", "open_next_feed" : "apri il prossimo feed o categoria",
"open_previous_feed" : "apri il feed precedente od una categoria", "open_previous_feed" : "apri il feed o la categoria precedente",
"open_close_current_entry" : "apri/chiusi la categoria corrente", "open_close_current_entry" : "apri/chiudi la voce corrente",
"open_current_entry_in_new_window" : "apri il corrente elemento in una nuova finestra", "open_current_entry_in_new_window" : "apri la voce corrente in una nuova finestra",
"open_current_entry_in_new_window_background" : "apri il corrente elemento in una nuova finestra in secondo piano", "open_current_entry_in_new_window_background" : "apri la voce corrente in una nuova finestra in secondo piano",
"star_unstar" : "segna/togli il segno all'elemento corrente", "star_unstar" : "metti/togli la tua preferenza alla voce corrente",
"mark_current_entry" : "segna come letto/non letto l'elemento corrente", "mark_current_entry" : "segna la voce corrente come letta/non letta",
"mark_all_as_read" : "segna come letti tutti gli elementi", "mark_all_as_read" : "segna tutte le voci come lette",
"open_in_new_tab_mark_as_read" : "apri l'elemento in una nuova finestra e segnala come letta", "open_in_new_tab_mark_as_read" : "apri voce in un nuovo tab e segna come letta",
"fullscreen" : "alterna la modalità a schermo intero", "fullscreen" : "commuta la modalità a schermo intero",
"font_size" : "aumenta/decrementa la grandezza del font dell'elemento corrente", "font_size" : "aumenta/decrementa la dimensione del font per la voce corrente",
"go_to_all" : "vai nella visione totale", "go_to_all" : "vai alla vista Tutti",
"go_to_starred" : "vai nella visione dei preferiti", "go_to_starred" : "vai alla vista Preferiti",
"feed_search" : "naviga in una sottoscrizione scrivendo il suo nome" "feed_search" : "raggiungi una sottoscrizione scrivendo il suo nome"
} }
} }
} }

View File

@@ -4,23 +4,23 @@
"cancel" : "취소", "cancel" : "취소",
"delete" : "삭제", "delete" : "삭제",
"required" : "필수", "required" : "필수",
"download" : "Download ", "download" : "다운로드",
"link" : "Link ", "link" : "링크",
"bookmark" : "Bookmark ", "bookmark" : "북마크",
"close" : "Close ", "close" : "닫기 ",
"tags" : "Tags " "tags" : "태그 "
}, },
"tree" : { "tree" : {
"subscribe" : "구독", "subscribe" : "구독",
"import" : "임포트", "import" : "가져오기",
"new_category" : "새로운 카테고리", "new_category" : "새로운 카테고리",
"all" : "전체", "all" : "전체",
"starred" : "스타" "starred" : "중요 표시됨"
}, },
"subscribe" : { "subscribe" : {
"feed_url" : "피드 URL", "feed_url" : "피드 URL",
"feed_name" : "피드 이름", "feed_name" : "피드 이름",
"category" : "카테로기" "category" : "카테고리"
}, },
"import" : { "import" : {
"google_reader_prefix" : "당신의 Google Reader", "google_reader_prefix" : "당신의 Google Reader",
@@ -31,23 +31,23 @@
}, },
"new_category" : { "new_category" : {
"name" : "이름", "name" : "이름",
"parent" : "카테고리 주소로 가기" "parent" : "부모 카테고리"
}, },
"toolbar" : { "toolbar" : {
"unread" : "읽음", "unread" : "읽지 않음",
"all" : "전체", "all" : "전체",
"previous_entry" : "Previous entry ", "previous_entry" : "이전 항목",
"next_entry" : "Next entry ", "next_entry" : "다음 항목",
"refresh" : "리프래쉬", "refresh" : "새로고침",
"refresh_all" : "Force refresh all my feeds ", "refresh_all" : "모든 피드를 강제로 새로고침",
"sort_by_asc_desc" : "Sort by date asc/desc ", "sort_by_asc_desc" : "날짜별 오름차/내림차순 정렬",
"titles_only" : "Titles only ", "titles_only" : "제목만 표시하기",
"expanded_view" : "Expanded view ", "expanded_view" : "Expanded View",
"mark_all_as_read" : "읽음표시", "mark_all_as_read" : "읽음으로 표시",
"mark_all_older_12_hours" : "Items older than 12 hours ", "mark_all_older_12_hours" : "12시간보다 오래된 항목",
"mark_all_older_day" : "Items older than a day ", "mark_all_older_day" : "1일보다 오래된 항목",
"mark_all_older_week" : "Items older than a week ", "mark_all_older_week" : "1주일보다 오래된 항목",
"mark_all_older_two_weeks" : "Items older than two weeks ", "mark_all_older_two_weeks" : "2주일보다 오래된 항목",
"settings" : "설정", "settings" : "설정",
"profile" : "프로필", "profile" : "프로필",
"admin" : "괸리자", "admin" : "괸리자",
@@ -57,124 +57,124 @@
}, },
"view" : { "view" : {
"entry_source" : "from ", "entry_source" : "from ",
"entry_author" : "by ", "entry_author" : "by ",
"error_while_loading_feed" : "피드로딩중 에러", "error_while_loading_feed" : "피드 로딩중 에러",
"keep_unread" : "안읽은것 저장", "keep_unread" : "항상 읽지 않음으로 표시",
"no_unread_items" : " 읽지않은 항목이 없니다.", "no_unread_items" : " 읽지 않은 항목이 없니다.",
"mark_up_to_here" : "Mark as read up to here ", "mark_up_to_here" : "이 위로 읽음으로 표시",
"search_for" : "searching for: ", "search_for" : "검색: ",
"no_search_results" : "No match found for the requested keywords " "no_search_results" : "검색 결과 없음"
}, },
"feedsearch" : { "feedsearch" : {
"hint" : "Type in a subscription... ", "hint" : "구독 이름을 입력하세요",
"help" : "Use the return key to select and arrow keys to navigate. ", "help" : "화살표 키로 이동하고 엔터 키로 선택하세요.",
"result_prefix" : "Your subscriptions: " "result_prefix" : "검색 결과:"
}, },
"settings" : { "settings" : {
"general" : { "general" : {
"value" : "일반", "value" : "일반",
"language" : "일반 언어", "language" : "언어",
"language_contribute" : "번역 도움하기", "language_contribute" : "번역에 기여하기",
"show_unread" : "안읽은 항목들이 있는 피드와 카테고리 보여주기", "show_unread" : "안 읽은 항목들이 있는 피드와 카테고리 보여주기",
"social_buttons" : "소셜미디아 버튼들 보여주기", "social_buttons" : "공유 버튼 표시하기",
"scroll_marks" : "Expanded View에서 스크롤하면 항목들을 읽음으로 저장하기" "scroll_marks" : "Expanded View에서 스크롤하면 항목들을 읽음으로 표시하기"
}, },
"appearance" : "Appearance ", "appearance" : "외관",
"scroll_speed" : "Scrolling speed when navigating between entries (in milliseconds) ", "scroll_speed" : "항목 사이를 이동할 때 스크롤 속도 (밀리초로 설정)",
"scroll_speed_help" : "set to 0 to disable ", "scroll_speed_help" : "비활성화하려면 0으로 설정하세요",
"theme" : "Theme ", "theme" : "테마",
"submit_your_theme" : "Submit your theme ", "submit_your_theme" : "새 테마 업로드",
"custom_css" : "커스 CSS" "custom_css" : "커스 CSS"
}, },
"details" : { "details" : {
"feed_details" : "피드 세", "feed_details" : "피드 세",
"url" : "유알엘", "url" : "URL",
"website" : "Website ", "website" : "웹사이트",
"name" : "이름", "name" : "이름",
"category" : "카테고리", "category" : "카테고리",
"position" : "Position ", "position" : "위치",
"last_refresh" : "마지막 리프래쉬", "last_refresh" : "마지막 새로고침",
"message" : "Last refresh message ", "message" : "마지막 새로고침 메시지",
"next_refresh" : "Next refresh ", "next_refresh" : "다음 새로고침",
"queued_for_refresh" : "Queued for refresh ", "queued_for_refresh" : "새로고침 대기중",
"feed_url" : "피드 유알엘", "feed_url" : "피드 URL",
"generate_api_key_first" : "당신의 프로필을 위해 API Key를 먼저 생성하세요.", "generate_api_key_first" : "당신의 프로필을 위해 API Key를 먼저 생성하세요.",
"unsubscribe" : "주소 삭제", "unsubscribe" : "구독 해제",
"unsubscribe_confirmation" : "Are you sure you want to unsubscribe from this feed? ", "unsubscribe_confirmation" : "정말 이 피드를 구독 해제하시겠습니까?",
"delete_category_confirmation" : "Are you sure you want to delete this category? ", "delete_category_confirmation" : "정말 이 카테고리를 삭제하시겠습니까?",
"category_details" : "카테고리 세", "category_details" : "카테고리 세",
"tag_details" : "Tag details ", "tag_details" : "태그 상세",
"parent_category" : "부모 카테고리" "parent_category" : "부모 카테고리"
}, },
"profile" : { "profile" : {
"user_name" : "사용자 이름", "user_name" : "사용자 이름",
"email" : "이메일", "email" : "이메일",
"change_password" : "비밀번호변경", "change_password" : "비밀번호 변경",
"confirm_password" : "비밀번호확인", "confirm_password" : "비밀번호 확인",
"minimum_6_chars" : "최소 6문자가 필요합니다.", "minimum_6_chars" : "최소 6개의 문자가 필요합니다.",
"passwords_do_not_match" : "비밀번호가 일치하지 않습니다.", "passwords_do_not_match" : "비밀번호가 일치하지 않습니다.",
"api_key" : "API key", "api_key" : "API key",
"api_key_not_generated" : "아직 API Key가 생성되지 않았습니다.", "api_key_not_generated" : "아직 API Key가 생성되지 않았습니다.",
"generate_new_api_key" : "API Key 생성하기", "generate_new_api_key" : "API Key 생성하기",
"generate_new_api_key_info" : "비밀번호를 변경하면 새로운 API Key가 생성됩니다.", "generate_new_api_key_info" : "비밀번호를 변경하면 새로운 API Key가 생성됩니다.",
"opml_export" : "OPML export ", "opml_export" : "OPML 내보내기",
"delete_account" : "프로필삭제", "delete_account" : "계정 삭제하기",
"delete_account_confirmation" : "Delete your acount? There's no turning back! " "delete_account_confirmation" : "계정을 삭제하시겠습니까? 되돌릴 수 없어요!"
}, },
"about" : { "about" : {
"rest_api" : { "rest_api" : {
"value" : "REST API", "value" : "REST API",
"line1" : "CommaFeed는 JAX-RS하고 AngularJS를 이용해 만들었습니다. 그렇기 때문에 REST API를 사용할수있습니다.", "line1" : "CommaFeed는 JAX-RS AngularJS를 이용해 만들었습니다. 그렇기 때문에 REST API를 사용할수있습니다.",
"link_to_documentation" : "문서 링크." "link_to_documentation" : "문서 링크."
}, },
"keyboard_shortcuts" : "단축", "keyboard_shortcuts" : "단축",
"version" : "CommaFeed version ", "version" : "CommaFeed 버전",
"line1_prefix" : "CommaFeed는 오픈 소스프로젝트입니다. 소스는", "line1_prefix" : "CommaFeed는 오픈 소스 프로젝트입니다. 소스는",
"line1_suffix" : "에 있습니다.", "line1_suffix" : "에 있습니다.",
"line2_prefix" : "문제가 발생하는 경우", "line2_prefix" : "문제가 발생하는 경우",
"line2_suffix" : " 프로젝트 문제페이지에 보고하십시.", "line2_suffix" : " 프로젝트 문제 페이지에 보고하십시.",
"line3" : "이 프로젝트를 좋아하시면 개발자를 지원하고 웹사이트 유지용비를 충당하는 데 도움이되는 기부금을 고려하시기 바랍니다.", "line3" : "이 프로젝트를 좋아하시면 개발자를 지원하고 웹사이트 유지비용을 충당하는 데 도움이 되는 기부금을 고려하시기 바랍니다.",
"line4" : "For those of you who prefer bitcoin, here is the address ", "line4" : "비트코인으로 기부하기",
"goodies" : { "goodies" : {
"value" : "Goodies", "value" : "Goodies",
"android_app" : "Android app ", "android_app" : "안드로이드 앱",
"subscribe_url" : "Subscribe URL ", "subscribe_url" : "구독 URL",
"chrome_extension" : "Chrome extension ", "chrome_extension" : "Chrome 확장 프로그램",
"firefox_extension" : "Firefox extension ", "firefox_extension" : "Firefox 확장 기능",
"opera_extension" : "Opera extension ", "opera_extension" : "Opera 확장 기능",
"subscribe_bookmarklet" : "Add subscription bookmarklet (click) ", "subscribe_bookmarklet" : "구독 북마크 추가 (클릭)",
"subscribe_bookmarklet_asc" : "Oldest first ", "subscribe_bookmarklet_asc" : "오래된 것 먼저",
"subscribe_bookmarklet_desc" : "Newest first ", "subscribe_bookmarklet_desc" : "새로운 것 먼저",
"next_unread_bookmarklet" : "Next unread item bookmarklet (drag to bookmark bar) " "next_unread_bookmarklet" : "안 읽은 항목 북마크 (북마크바에 끌기) "
}, },
"translation" : { "translation" : {
"value" : "번역", "value" : "번역",
"message" : "CommaFeed를 번역할려면 당신의 도움이 필요합니다.", "message" : "CommaFeed를 번역하는데 당신의 도움이 필요합니다.",
"link" : "번역에 기여하기" "link" : "번역에 기여하기"
}, },
"announcements" : "공지", "announcements" : "공지",
"shortcuts" : { "shortcuts" : {
"mouse_middleclick" : "마우 미들클릭", "mouse_middleclick" : "마우 미들클릭",
"open_next_entry" : "다음 항목 열기", "open_next_entry" : "다음 항목 열기",
"open_previous_entry" : "이전 항목 열기", "open_previous_entry" : "이전 항목 열기",
"spacebar" : "space/shift+space ", "spacebar" : "space/shift+space ",
"move_page_down_up" : "moves the page down/up ", "move_page_down_up" : "페이지 아래/위로 이동 ",
"focus_next_entry" : "set focus on next entry without opening it ", "focus_next_entry" : "열지 않고 다음 항목 보기",
"focus_previous_entry" : "set focus on previous entry without opening it ", "focus_previous_entry" : "열지 않고 이전 항목 보기",
"open_next_feed" : "open next feed or category ", "open_next_feed" : "다음 피드나 카테고리 열기",
"open_previous_feed" : "open previous feed or category ", "open_previous_feed" : "이전 피드나 카테고리 열기",
"open_close_current_entry" : "현재 항목 열기/닫기", "open_close_current_entry" : "현재 항목 열기/닫기",
"open_current_entry_in_new_window" : "새 창에서 현재 항목열기", "open_current_entry_in_new_window" : "새 창으로 현재 항목 열기",
"open_current_entry_in_new_window_background" : "open current entry in a new window in the background ", "open_current_entry_in_new_window_background" : "백그라운드에 새 창으로 현재 항목 열기",
"star_unstar" : "현재 항목 스타/스타제거", "star_unstar" : "현재 항목 중요 표시/중요 표시 제거",
"mark_current_entry" : "현재 항목 읽음/안읽음 표시", "mark_current_entry" : "현재 항목 읽음/안읽음 표시",
"mark_all_as_read" : "모든 항목 읽음으로 표시", "mark_all_as_read" : "모든 항목 읽음으로 표시",
"open_in_new_tab_mark_as_read" : "읽음으로 표시하고 새로운 탭에서 열기", "open_in_new_tab_mark_as_read" : "읽음으로 표시하고 새로운 탭에서 열기",
"fullscreen" : "toggle full screen mode ", "fullscreen" : "전체화면 켜기/끄기",
"font_size" : "increase/decrease font size of the current entry ", "font_size" : "현재 항목의 글꼴 크기를 크게/작게",
"go_to_all" : "go to the All view ", "go_to_all" : "모든 항목 보기",
"go_to_starred" : "go to the Starred view ", "go_to_starred" : "중요 표시한 항목 보기",
"feed_search" : "navigate to a subscription by entering the subscription name " "feed_search" : "구독 이름으로 구독 찾기"
} }
} }
} }

View File

@@ -12,6 +12,7 @@ module.service('LangService', [function() {
'gl': 'Galician', 'gl': 'Galician',
'glk': 'گیلکی', 'glk': 'گیلکی',
'hu': 'Magyar', 'hu': 'Magyar',
'id': 'Indonesian',
'ja': '日本語', 'ja': '日本語',
'ko': '한국어', 'ko': '한국어',
'nl': 'Nederlands', 'nl': 'Nederlands',
@@ -19,7 +20,7 @@ module.service('LangService', [function() {
'nn': 'Norsk (nynorsk)', 'nn': 'Norsk (nynorsk)',
'pt': 'Português', 'pt': 'Português',
'pl': 'Polski', 'pl': 'Polski',
'ru': 'русский', 'ru': 'Русский',
'fi': 'Suomi', 'fi': 'Suomi',
'sv': 'Svenska', 'sv': 'Svenska',
'zh': '简体中文', 'zh': '简体中文',
@@ -31,4 +32,4 @@ module.service('LangService', [function() {
'cs': 'Čeština', 'cs': 'Čeština',
'ms': 'Bahasa Malaysian' 'ms': 'Bahasa Malaysian'
} }
}]); }]);

View File

@@ -6,14 +6,14 @@
</button> </button>
</div> </div>
<div class="btn-group"> <div class="btn-group" id="toolbar-nav">
<a type="button" class="btn btn-default" ng-click="previousEntry()" title="{{ 'toolbar.previous_entry' | translate }}"> <a type="button" class="btn btn-default" ng-click="previousEntry()" title="{{ 'toolbar.previous_entry' | translate }}">
<i class="icon-chevron-up"></i> <i class="icon-chevron-up"></i>
</a> </a>
<a type="button" class="btn btn-default" ng-click="nextEntry()" title="{{ 'toolbar.next_entry' | translate }}"> <a type="button" class="btn btn-default" ng-click="nextEntry()" title="{{ 'toolbar.next_entry' | translate }}">
<i class="icon-chevron-down"></i> <i class="icon-chevron-down"></i>
</a> </a>
<div class="btn-group"> <div class="btn-group" id="toolbar-refresh">
<a type="button" class="btn btn-default" ng-click="refresh()" title="{{ 'toolbar.refresh' | translate }}"> <a type="button" class="btn btn-default" ng-click="refresh()" title="{{ 'toolbar.refresh' | translate }}">
<i class="icon-refresh"></i> <i class="icon-refresh"></i>
</a> </a>
@@ -28,7 +28,7 @@
</div> </div>
</div> </div>
<div class="btn-group"> <div class="btn-group" id="toolbar-mark-read">
<a type="button" class="btn btn-default" ng-click="markAllAsRead()" title="{{ 'toolbar.mark_all_as_read' | translate }}"> <a type="button" class="btn btn-default" ng-click="markAllAsRead()" title="{{ 'toolbar.mark_all_as_read' | translate }}">
<i class="icon-ok"></i> <i class="icon-ok"></i>
</a> </a>
@@ -57,7 +57,7 @@
</button> </button>
</div> </div>
<div class="actions btn-group"> <div class="actions btn-group" id="toolbar-read-mode">
<div ng-if="!MobileService.mobile || MobileService.rightMenu"> <div ng-if="!MobileService.mobile || MobileService.rightMenu">
<div class="btn-group read-mode"> <div class="btn-group read-mode">
<button type="button" class="btn btn-default" ng-click="settingsService.settings.readingMode = 'unread'" <button type="button" class="btn btn-default" ng-click="settingsService.settings.readingMode = 'unread'"
@@ -66,14 +66,14 @@
ng-class="{'active': settingsService.settings.readingMode == 'all'}">{{ 'toolbar.all' | translate }}</button> ng-class="{'active': settingsService.settings.readingMode == 'all'}">{{ 'toolbar.all' | translate }}</button>
</div> </div>
<div class="btn-group"> <div class="btn-group" id="toolbar-read-order">
<a type="button" class="btn btn-default" ng-click="toggleOrder()" title="{{ 'toolbar.sort_by_asc_desc' | translate }}"> <a type="button" class="btn btn-default" ng-click="toggleOrder()" title="{{ 'toolbar.sort_by_asc_desc' | translate }}">
<i <i
ng-class="{'icon-arrow-up' : settingsService.settings.readingOrder == 'asc', 'icon-arrow-down': settingsService.settings.readingOrder == 'desc'}"></i> ng-class="{'icon-arrow-up' : settingsService.settings.readingOrder == 'asc', 'icon-arrow-down': settingsService.settings.readingOrder == 'desc'}"></i>
</a> </a>
</div> </div>
<div class="btn-group"> <div class="btn-group" id="toolbar-read-view-settings">
<a type="button" class="btn btn-default" ng-click="settingsService.settings.viewMode = 'title'" <a type="button" class="btn btn-default" ng-click="settingsService.settings.viewMode = 'title'"
ng-class="{'active': settingsService.settings.viewMode == 'title'}" title="{{ 'toolbar.titles_only' | translate }}"> ng-class="{'active': settingsService.settings.viewMode == 'title'}" title="{{ 'toolbar.titles_only' | translate }}">
<i class="icon-list"></i> <i class="icon-list"></i>
@@ -84,7 +84,7 @@
</a> </a>
</div> </div>
<div class="btn-group"> <div class="btn-group" id="toolbar-settings">
<a class="btn btn-default" ng-click="toSettings()" title="{{ 'toolbar.settings' | translate }}"> <a class="btn btn-default" ng-click="toSettings()" title="{{ 'toolbar.settings' | translate }}">
<i class="icon-cog"></i> <i class="icon-cog"></i>
</a> </a>
@@ -133,4 +133,4 @@
</div> </div>
<span ng-if="!MobileService.mobile" ng-bind-html="ServerService.announcement | trustHtml"></span> <span ng-if="!MobileService.mobile" ng-bind-html="ServerService.announcement | trustHtml"></span>
</div> </div>
</div> </div>

View File

@@ -6,7 +6,7 @@
<span ng-switch-when="starred">{{ 'tree.starred' | translate }}</span> <span ng-switch-when="starred">{{ 'tree.starred' | translate }}</span>
<span ng-switch-default> <span ng-switch-default>
<span ng-hide="feedLink">{{name}}</span> <span ng-hide="feedLink">{{name}}</span>
<a ng-show="feedLink" href="{{feedLink}}" target="_blank">{{name}}</a> <a ng-show="feedLink" href="{{feedLink}}" target="_blank" rel="noreferrer">{{name}}</a>
</span> </span>
</span> </span>
<span ng-show="name"> &#187;</span> <span ng-show="name"> &#187;</span>
@@ -20,7 +20,7 @@
<div ng-repeat="entry in entries" class="entry entry-font-size-{{font_size}}" id="entry_{{entry.id}}" <div ng-repeat="entry in entries" class="entry entry-font-size-{{font_size}}" id="entry_{{entry.id}}"
ng-class="{unread: entry.read == false, current: current==entry, open: isOpen, closed: !isOpen }"> ng-class="{unread: entry.read == false, current: current==entry, open: isOpen, closed: !isOpen }">
<div class="entry-heading" ng-swipe-right="mark(entry, !entry.read)"> <div class="entry-heading" ng-swipe-right="mark(entry, !entry.read)">
<a href="{{entry.url}}" target="_blank" class="entry-heading-link" ng-click="noop($event)" ng-mouseup="entryClicked(entry, $event)"> <a href="{{entry.url}}" target="_blank" rel="noreferrer" class="entry-heading-link" ng-click="noop($event)" ng-mouseup="entryClicked(entry, $event)">
<span class="feed-name"> <span class="feed-name">
<span class="star" ng-mouseup="star(entry, !entry.starred, $event)"> <span class="star" ng-mouseup="star(entry, !entry.starred, $event)">
<i ng-class="{'icon-star icon-star-yellow': entry.starred, 'icon-star-empty': !entry.starred}" class="pointer"></i> <i ng-class="{'icon-star icon-star-yellow': entry.starred, 'icon-star-empty': !entry.starred}" class="pointer"></i>
@@ -93,7 +93,7 @@
title="Gmail" popup ng-if="settingsService.settings.gmail"> title="Gmail" popup ng-if="settingsService.settings.gmail">
<i class="icon-gmail"></i> <i class="icon-gmail"></i>
</a> </a>
<a href="http://www.facebook.com/sharer.php?u=={{entry.url|escape}}" title="Facebook" popup ng-if="settingsService.settings.facebook"> <a href="http://www.facebook.com/sharer.php?u={{entry.url|escape}}" title="Facebook" popup ng-if="settingsService.settings.facebook">
<i class="icon-facebook"></i> <i class="icon-facebook"></i>
</a> </a>
<a href="http://twitter.com/share?text={{entry.title|escape}}&url={{entry.url|escape}}" title="Twitter" popup <a href="http://twitter.com/share?text={{entry.title|escape}}&url={{entry.url|escape}}" title="Twitter" popup

View File

@@ -70,7 +70,7 @@ public class HttpGetter {
@Inject @Inject
public HttpGetter(CommaFeedConfiguration config) { public HttpGetter(CommaFeedConfiguration config) {
this.userAgent = String.format("CommaFeed/%s (https://www.commafeed.com)", config.getVersion()); this.userAgent = String.format("CommaFeed/%s (https://github.com/Athou/commafeed)", config.getVersion());
} }
public HttpResult getBinary(String url, int timeout) throws ClientProtocolException, IOException, NotModifiedException { public HttpResult getBinary(String url, int timeout) throws ClientProtocolException, IOException, NotModifiedException {

View File

@@ -86,12 +86,13 @@ public class FeedUtils {
whitelist.addAttributes("th", "border", "bordercolor", "abbr", "axis", "colspan", "rowspan", "scope", "width"); whitelist.addAttributes("th", "border", "bordercolor", "abbr", "axis", "colspan", "rowspan", "scope", "width");
whitelist.addAttributes("ul", "type"); whitelist.addAttributes("ul", "type");
whitelist.addProtocols("a", "href", "ftp", "http", "https", "mailto"); whitelist.addProtocols("a", "href", "ftp", "http", "https", "magnet", "mailto");
whitelist.addProtocols("blockquote", "cite", "http", "https"); whitelist.addProtocols("blockquote", "cite", "http", "https");
whitelist.addProtocols("img", "src", "http", "https"); whitelist.addProtocols("img", "src", "http", "https");
whitelist.addProtocols("q", "cite", "http", "https"); whitelist.addProtocols("q", "cite", "http", "https");
whitelist.addEnforcedAttribute("a", "target", "_blank"); whitelist.addEnforcedAttribute("a", "target", "_blank");
whitelist.addEnforcedAttribute("a", "rel", "noreferrer");
return whitelist; return whitelist;
} }
@@ -494,8 +495,8 @@ public class FeedUtils {
Entry entry = it.next(); Entry entry = it.next();
boolean keep = true; boolean keep = true;
for (FeedEntryKeyword keyword : keywords) { for (FeedEntryKeyword keyword : keywords) {
String title = Jsoup.parse(entry.getTitle()).text(); String title = entry.getTitle() == null ? null : Jsoup.parse(entry.getTitle()).text();
String content = Jsoup.parse(entry.getContent()).text(); String content = entry.getContent() == null ? null : Jsoup.parse(entry.getContent()).text();
boolean condition = !StringUtils.containsIgnoreCase(content, keyword.getKeyword()) boolean condition = !StringUtils.containsIgnoreCase(content, keyword.getKeyword())
&& !StringUtils.containsIgnoreCase(title, keyword.getKeyword()); && !StringUtils.containsIgnoreCase(title, keyword.getKeyword());
if (keyword.getMode() == Mode.EXCLUDE) { if (keyword.getMode() == Mode.EXCLUDE) {

View File

@@ -1,16 +1,12 @@
package com.commafeed.backend.service; package com.commafeed.backend.service;
import java.sql.Connection;
import java.util.Arrays; import java.util.Arrays;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import javax.sql.DataSource;
import org.hibernate.Session;
import org.hibernate.SessionFactory; import org.hibernate.SessionFactory;
import org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl;
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.internal.SessionFactoryImpl;
import com.commafeed.CommaFeedApplication; import com.commafeed.CommaFeedApplication;
import com.commafeed.CommaFeedConfiguration; import com.commafeed.CommaFeedConfiguration;
@@ -31,7 +27,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
@RequiredArgsConstructor(onConstructor = @__({ @Inject }) ) @RequiredArgsConstructor(onConstructor = @__({ @Inject }))
@Singleton @Singleton
public class StartupService implements Managed { public class StartupService implements Managed {
@@ -50,17 +46,10 @@ public class StartupService implements Managed {
} }
private void updateSchema() { private void updateSchema() {
try { Session session = sessionFactory.openSession();
Connection connection = null; session.doWork(connection -> {
try { try {
Thread currentThread = Thread.currentThread();
ClassLoader classLoader = currentThread.getContextClassLoader();
ResourceAccessor accessor = new ClassLoaderResourceAccessor(classLoader);
DataSource dataSource = getDataSource(sessionFactory);
connection = dataSource.getConnection();
JdbcConnection jdbcConnection = new JdbcConnection(connection); JdbcConnection jdbcConnection = new JdbcConnection(connection);
Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(jdbcConnection); Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(jdbcConnection);
if (database instanceof PostgresDatabase) { if (database instanceof PostgresDatabase) {
@@ -73,17 +62,14 @@ public class StartupService implements Managed {
database.setConnection(jdbcConnection); database.setConnection(jdbcConnection);
} }
ResourceAccessor accessor = new ClassLoaderResourceAccessor(Thread.currentThread().getContextClassLoader());
Liquibase liq = new Liquibase("migrations.xml", accessor, database); Liquibase liq = new Liquibase("migrations.xml", accessor, database);
liq.update("prod"); liq.update("prod");
} finally { } catch (Exception e) {
if (connection != null) { throw new RuntimeException(e);
connection.close();
}
} }
});
} catch (Exception e) { session.close();
throw new RuntimeException(e);
}
} }
private void initialData() { private void initialData() {
@@ -103,15 +89,4 @@ public class StartupService implements Managed {
public void stop() throws Exception { public void stop() throws Exception {
} }
private static DataSource getDataSource(SessionFactory sessionFactory) {
if (sessionFactory instanceof SessionFactoryImpl) {
ConnectionProvider cp = ((SessionFactoryImpl) sessionFactory).getConnectionProvider();
if (cp instanceof DatasourceConnectionProviderImpl) {
return ((DatasourceConnectionProviderImpl) cp).getDataSource();
}
}
return null;
}
} }

View File

@@ -208,6 +208,7 @@ public class UserREST {
return Response.status(Status.FORBIDDEN).build(); return Response.status(Status.FORBIDDEN).build();
} }
user = userDAO.findById(user.getId());
user.setEmail(StringUtils.trimToNull(request.getEmail())); user.setEmail(StringUtils.trimToNull(request.getEmail()));
if (StringUtils.isNotBlank(request.getPassword())) { if (StringUtils.isNotBlank(request.getPassword())) {
byte[] password = encryptionService.getEncryptedPassword(request.getPassword(), user.getSalt()); byte[] password = encryptionService.getEncryptedPassword(request.getPassword(), user.getSalt());