Merge remote-tracking branch 'muff1nman/spring-3-update' into biconou_spring-3-update_PR

master
remi 8 years ago
commit c9bdff4dff
  1. 4
      .gitignore
  2. 15
      .travis.yml
  3. 34
      BUILD.md
  4. 14
      CHANGELOG.md
  5. 2
      INSTALL.md
  6. 36
      MIGRATE.md
  7. 6
      documentation/FreeBSD-FreeNAS-Install.md
  8. 2
      documentation/INSTALL.md
  9. 2
      libresonic-assembly/pom.xml
  10. 2
      libresonic-booter/pom.xml
  11. 2
      libresonic-booter/src/main/resources/applicationContext-agent.xml
  12. 2
      libresonic-booter/src/main/resources/applicationContext-deployer.xml
  13. 2
      libresonic-booter/src/main/resources/applicationContext-mac.xml
  14. 2
      libresonic-installer-debian/pom.xml
  15. 2
      libresonic-installer-debian/src/DEBIAN/control
  16. 2
      libresonic-installer-mac/pom.xml
  17. 2
      libresonic-installer-rpm/pom.xml
  18. 2
      libresonic-installer-windows/pom.xml
  19. 105
      libresonic-main/libresonic-main.iml
  20. 14
      libresonic-main/pom.xml
  21. 9
      libresonic-main/src/main/java/org/libresonic/player/command/PersonalSettingsCommand.java
  22. 9
      libresonic-main/src/main/java/org/libresonic/player/command/PlayerSettingsCommand.java
  23. 3
      libresonic-main/src/main/java/org/libresonic/player/controller/HomeController.java
  24. 6
      libresonic-main/src/main/java/org/libresonic/player/controller/M3UController.java
  25. 1
      libresonic-main/src/main/java/org/libresonic/player/controller/MultiController.java
  26. 2
      libresonic-main/src/main/java/org/libresonic/player/controller/PersonalSettingsController.java
  27. 2
      libresonic-main/src/main/java/org/libresonic/player/controller/PlayerSettingsController.java
  28. 5
      libresonic-main/src/main/java/org/libresonic/player/dao/HsqlDaoHelper.java
  29. 8
      libresonic-main/src/main/java/org/libresonic/player/dao/PlayerDao.java
  30. 5
      libresonic-main/src/main/java/org/libresonic/player/dao/UserDao.java
  31. 48
      libresonic-main/src/main/java/org/libresonic/player/dao/schema/hsql/Schema61.java
  32. 48
      libresonic-main/src/main/java/org/libresonic/player/dao/schema/hsql/Schema62.java
  33. 3
      libresonic-main/src/main/java/org/libresonic/player/domain/PlayQueue.java
  34. 19
      libresonic-main/src/main/java/org/libresonic/player/domain/Player.java
  35. 9
      libresonic-main/src/main/java/org/libresonic/player/domain/UserSettings.java
  36. 1
      libresonic-main/src/main/java/org/libresonic/player/service/SettingsService.java
  37. 4
      libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_en.properties
  38. 586
      libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_zh_TW.properties
  39. 2
      libresonic-main/src/main/webapp/WEB-INF/applicationContext-cache.xml
  40. 2
      libresonic-main/src/main/webapp/WEB-INF/applicationContext-service.xml
  41. 2
      libresonic-main/src/main/webapp/WEB-INF/applicationContext-sonos.xml
  42. 1
      libresonic-main/src/main/webapp/WEB-INF/jsp/albumMain.jsp
  43. 1
      libresonic-main/src/main/webapp/WEB-INF/jsp/artistMain.jsp
  44. 3
      libresonic-main/src/main/webapp/WEB-INF/jsp/coverArt.jsp
  45. 5
      libresonic-main/src/main/webapp/WEB-INF/jsp/home.jsp
  46. 7
      libresonic-main/src/main/webapp/WEB-INF/jsp/personalSettings.jsp
  47. 8
      libresonic-main/src/main/webapp/WEB-INF/jsp/playerSettings.jsp
  48. 1
      libresonic-main/src/main/webapp/WEB-INF/jsp/starred.jsp
  49. 2
      libresonic-main/src/main/webapp/WEB-INF/libresonic-servlet.xml
  50. 13
      libresonic-rest-api/libresonic-rest-api.iml
  51. 2
      libresonic-rest-api/pom.xml
  52. 13
      libresonic-sonos-api/libresonic-sonos-api.iml
  53. 2
      libresonic-sonos-api/pom.xml
  54. 12
      libresonic.iml
  55. 6
      pom.xml

4
.gitignore vendored

@ -110,6 +110,10 @@ local.properties
# Eclipse Core
.project
# Intellij
*.iml
.idea
# External tool builders
.externalToolBuilders/

@ -0,0 +1,15 @@
language: java
sudo: required
jdk:
- oraclejdk8
cache:
directories:
- $HOME/.m2
install:
- sudo apt-get -qq update
- sudo apt-get -y install lintian fakeroot rpm python-rpm
- git clone https://github.com/rpm-software-management/rpmlint -o rpmlint-1.9
- sudo make -C rpmlint install
script:
- mvn -Pfull,rpm package install
- mvn -Pfull -pl libresonic-assembly assembly:single

@ -8,6 +8,7 @@ Requirements
* Recent version of [Maven](http://maven.apache.org/).
* A JDK installation. 1.8.x series of OpenJDK or Oracle JDK 8+ should work.
* Optional: lintian and fakeroot, for .deb package
* Optional: rpm and rpmlint, for .rpm package
* Test as follows:
```
@ -53,14 +54,39 @@ $
Packaged .deb
-------------
You can furthermore go ahead to create a .deb suitable for installation on Debian or Ubuntu. These instructions should similarly work with rpm(for RedHat/CentOS or Fedora), but it is has not been tested.
You can furthermore go ahead to create a .deb suitable for installation on
Debian or Ubuntu.
```
$ mvn -P full -pl libresonic-booter -am install
$ mvn -P full -pl libresonic-installer-debian/ -am install
$ mvn -P full -pl libresonic-installer-debian -am install
$ sudo dpkg -i ./libresonic-installer-debian/target/libresonic-*.deb
$
```
Good luck!
Packaged RPM
------------
Building a RPM package is very similar :
```
$ mvn -P full -pl libresonic-booter -am install
$ mvn -P full,rpm -pl libresonic-installer-rpm -am install
$ sudo rpm -ivh libresonic-installer-rpm/target/libresonic-*.rpm
```
Additional release archives
---------------------------
Additional release archives can be built using the following commands :
```
$ mvn -Pfull -pl libresonic-assembly assembly:single
```
These archives are built in `libresonic-assembly/targets` and include :
* The source distribution
* The standalone archive (for use without a WAR container)
* The WAR archive (for WAR containers)
Good luck!

@ -3,6 +3,20 @@
# Libresonic/libresonic
# -->
v6.1.beta2
--------
* Metaproject: Jenkins builds!
* More documentation
* Translation updates
* Improve shuffling behaviour
* Lots of small fixes, many more to come
v6.1.beta1
----------
* Meant as a release candidate; failed to make it past the Primary election.
v6.1-alpha1
-----------

@ -23,7 +23,7 @@ Daily WAR files are built by Jenkins and available [here](https://jenkins.zifnab
1. Download the latest war file:
wget https://jenkins.zifnab.net/job/libresonic/lastSuccessfulBuild/artifact/.repository/org/libresonic/player/libresonic-main/6.1.beta1/libresonic-main-6.1.beta1.war -O /var/lib/tomcat8/webapps/libresonic.war
wget https://jenkins.zifnab.net/job/libresonic/lastSuccessfulBuild/artifact/.repository/org/libresonic/player/libresonic-main/6.1.beta2/libresonic-main-6.1.beta2.war -O /var/lib/tomcat8/webapps/libresonic.war
Note that this command copies the war file directly to the Tomcat webapps directory, and renames it to `libresonic.war`.

@ -0,0 +1,36 @@
Upgrade to Libresonic from Subsonic
================
This guide helps you to migrate your data from Subsonic to Libresonic. It has been tested with Subsonic 5 to Libresonic 6.
Install Libresonic as described in INSTALL.md. The author of this guide used the standalone solution without Java Tomcat.
After installation of Libresonic, the database needs to be migrated. In preperation for that, stop the Libresonic service
sudo service libresonic stop
If you ran Subsonic before, your data will be (by default) stored in `/var/subsonic`. Assuming you did not use Libresonic before, we will delete all data from Libresonic
sudo rm -r /var/libresonic # WARNING: DELETES all Libresonic data (Subsonic data will be kept)
We then copy Subsonic data to Libresonic location. Be aware that a couple of files need to be renamed:
sudo cp -a /var/subsonic /var/libresonic
sudo mv /var/libresonic/subsonic_sh.log libresonic_sh.log
sudo mv /var/libresonic/subsonic.log libresonic.log
sudo mv /var/libresonic/subsonic.properties libresonic.properties
sudo mv /var/libresonic/db/subsonic.backup /var/libresonic/db/libresonic.backup
sudo mv /var/libresonic/db/subsonic.data /var/libresonic/db/libresonic.data
sudo mv /var/libresonic/db/subsonic.lck /var/libresonic/db/libresonic.lck
sudo mv /var/libresonic/db/subsonic.log /var/libresonic/db/libresonic.log
sudo mv /var/libresonic/db/subsonic.properties /var/libresonic/db/libresonic.properties
sudo mv /var/libresonic/db/subsonic.script /var/libresonic/db/libresonic.script
Then start Libresonic service again.
sudo service libresonic start
Your old settings will be there. If you wish, you can delete subsonic data
sudo rm -r /var/subsonic # Optional, THIS WILL DELETE SUBSONIC DATA

@ -66,15 +66,15 @@ Open a web browser and enter your servers IP address in the url bar followed by
You should be greeted by the Apache Tomcat page. Click on the Manager App button on the right of the page and enter the username and password used in step 3. Default was username: admin and password: admin
Scroll down to Deploy and the subheading "WAR file to deploy" hit choose file and select the libresonic.war downloaded in the preamble. After selecting press the deploy button. Scroll up and press start. When the page refreshes a message "OK - Started application at context path /libresonic-v6.1.beta1" should be visible.
Scroll down to Deploy and the subheading "WAR file to deploy" hit choose file and select the libresonic.war downloaded in the preamble. After selecting press the deploy button. Scroll up and press start. When the page refreshes a message "OK - Started application at context path /libresonic-v6.1.beta2" should be visible.
### 6. Navigate to Libresonic
In a browser. Take your server IP address and port and append the the context path from above
ie if the War deployed was called libresonic-v6.1.beta1.war navigate to:
ie if the War deployed was called libresonic-v6.1.beta2.war navigate to:
10.0.0.10:8080/libresonic-v6.1.beta1/
10.0.0.10:8080/libresonic-v6.1.beta2/
### 7. Log into Libresonic

@ -23,7 +23,7 @@ Daily WAR files are built by Jenkins and available [here](https://jenkins.zifnab
1. Download the latest war file:
wget https://jenkins.zifnab.net/job/libresonic/lastSuccessfulBuild/artifact/.repository/org/libresonic/player/libresonic-main/6.1.beta1/libresonic-main-6.1.beta1.war -O /var/lib/tomcat8/webapps/libresonic.war
wget https://jenkins.zifnab.net/job/libresonic/lastSuccessfulBuild/artifact/.repository/org/libresonic/player/libresonic-main/6.1.beta2/libresonic-main-6.1.beta2.war -O /var/lib/tomcat8/webapps/libresonic.war
Note that this command copies the war file directly to the Tomcat webapps directory, and renames it to `libresonic.war`.

@ -9,7 +9,7 @@
<parent>
<groupId>org.libresonic.player</groupId>
<artifactId>libresonic</artifactId>
<version>6.1.beta1</version>
<version>6.1.beta2</version>
</parent>
<dependencies>

@ -8,7 +8,7 @@
<parent>
<groupId>org.libresonic.player</groupId>
<artifactId>libresonic</artifactId>
<version>6.1.beta1</version>
<version>6.1.beta2</version>
</parent>
<dependencies>

@ -2,7 +2,7 @@
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="service" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://localhost:9412/LibresonicDeployerService"/>

@ -2,7 +2,7 @@
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="service" class="org.libresonic.player.booter.deployer.LibresonicDeployer"/>

@ -2,7 +2,7 @@
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="deployer" class="org.libresonic.player.booter.deployer.LibresonicDeployer"/>

@ -9,7 +9,7 @@
<parent>
<groupId>org.libresonic.player</groupId>
<artifactId>libresonic</artifactId>
<version>6.1.beta1</version>
<version>6.1.beta2</version>
</parent>
<profiles>

@ -4,7 +4,7 @@ Section: Multimedia
Priority: optional
Recommends: ffmpeg
Architecture: all
Maintainer: Sindre Mehus <sindre@activeobjects.no>
Maintainer: Eugene E. Kashpureff Jr <eugene@kashpureff.org>
Description: A web-based music streamer, jukebox and Podcast receiver
Libresonic is a web-based music streamer, jukebox and Podcast receiver,
providing access to your music collection wherever you are. Use it

@ -9,7 +9,7 @@
<parent>
<groupId>org.libresonic.player</groupId>
<artifactId>libresonic</artifactId>
<version>6.1.beta1</version>
<version>6.1.beta2</version>
</parent>
<dependencies>

@ -9,7 +9,7 @@
<parent>
<groupId>org.libresonic.player</groupId>
<artifactId>libresonic</artifactId>
<version>6.1.beta1</version>
<version>6.1.beta2</version>
</parent>
<profiles>

@ -9,7 +9,7 @@
<parent>
<groupId>org.libresonic.player</groupId>
<artifactId>libresonic</artifactId>
<version>6.1.beta1</version>
<version>6.1.beta2</version>
</parent>
<properties>

@ -1,105 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="web" name="Web">
<configuration>
<descriptors>
<deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/src/main/webapp/WEB-INF/web.xml" />
</descriptors>
<webroots>
<root url="file://$MODULE_DIR$/src/main/webapp" relative="/" />
</webroots>
<sourceRoots>
<root url="file://$MODULE_DIR$/src/main/java" />
<root url="file://$MODULE_DIR$/src/main/resources" />
</sourceRoots>
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="libresonic-rest-api" />
<orderEntry type="module" module-name="libresonic-sonos-api" />
<orderEntry type="library" name="Maven: org.springframework:spring:2.5.6" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.1.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:2.5.6" level="project" />
<orderEntry type="library" name="Maven: org.acegisecurity:acegi-security:1.0.5" level="project" />
<orderEntry type="library" name="Maven: oro:oro:2.0.8" level="project" />
<orderEntry type="library" name="Maven: commons-collections:commons-collections:3.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.lucene:lucene-core:3.0.3" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: cglib:cglib:2.1_3" level="project" />
<orderEntry type="library" name="Maven: asm:asm:1.5.3" level="project" />
<orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.2" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.2" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:1.3.1" level="project" />
<orderEntry type="library" name="Maven: commons-lang:commons-lang:2.1" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava-base:r03" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava-annotations:r03" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava-collections:r03" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava-primitives:r03" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.2.4" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.2.4" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: hsqldb:hsqldb:1.8.0.7" level="project" />
<orderEntry type="library" name="Maven: radeox:radeox:1.0-b2" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: log4j:log4j:1.2.16" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.slf4j:slf4j-log4j12:1.6.1" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.6.1" level="project" />
<orderEntry type="library" name="Maven: org.directwebremoting:dwr:3.0.rc1" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: com.yahoo.platform.yui:yuicompressor:2.3.6" level="project" />
<orderEntry type="library" name="Maven: ant-zip:ant-zip:1.6.2" level="project" />
<orderEntry type="library" name="Maven: org:jaudiotagger:2.0.3" level="project" />
<orderEntry type="library" name="Maven: jfree:jfreechart:1.0.11" level="project" />
<orderEntry type="library" name="Maven: jfree:jcommon:1.0.14" level="project" />
<orderEntry type="library" name="Maven: jdom:jdom:1.0" level="project" />
<orderEntry type="library" name="Maven: net.sf.ehcache:ehcache-core:2.5.0" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.persistence:org.eclipse.persistence.moxy:2.5.1" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.persistence:org.eclipse.persistence.core:2.5.1" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.persistence:org.eclipse.persistence.asm:2.5.1" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.persistence:org.eclipse.persistence.antlr:2.5.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: javax.servlet:servlet-api:2.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: javax.servlet:jsp-api:2.0" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: javax.servlet:jstl:1.1.2" level="project" />
<orderEntry type="library" name="Maven: taglibs:standard:1.1.2" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: taglibs:string:1.1.0" level="project" />
<orderEntry type="library" name="Maven: com.hoodcomputing:natpmp:0.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.1" level="project" />
<orderEntry type="library" name="Maven: org.fourthline.cling:cling-core:2.0.1" level="project" />
<orderEntry type="library" name="Maven: org.seamless:seamless-http:1.1.0" level="project" />
<orderEntry type="library" name="Maven: org.seamless:seamless-xml:1.1.0" level="project" />
<orderEntry type="library" name="Maven: org.fourthline.cling:cling-support:2.0.1" level="project" />
<orderEntry type="library" name="Maven: org.seamless:seamless-swing:1.1.0" level="project" />
<orderEntry type="library" name="Maven: org.seamless:seamless-util:1.0-alpha2" level="project" />
<orderEntry type="library" name="Maven: net.tanesha.recaptcha4j:recaptcha4j:0.0.8" level="project" />
<orderEntry type="library" name="Maven: de.u-mass:lastfm-java:0.1.2" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.cxf:cxf-rt-transports-http:2.4.2" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.cxf:cxf-rt-transports-common:2.4.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.cxf:cxf-rt-core:2.4.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.geronimo.specs:geronimo-javamail_1.4_spec:1.7.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.cxf:cxf-rt-frontend-jaxws:2.4.2" level="project" />
<orderEntry type="library" name="Maven: xml-resolver:xml-resolver:1.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.cxf:cxf-rt-bindings-xml:2.4.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.cxf:cxf-rt-frontend-simple:2.4.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.cxf:cxf-rt-ws-addr:2.4.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.cxf:cxf-rt-bindings-soap:2.4.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.cxf:cxf-tools-common:2.4.2" level="project" />
<orderEntry type="library" name="Maven: wsdl4j:wsdl4j:1.6.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.cxf:cxf-rt-databinding-jaxb:2.4.2" level="project" />
<orderEntry type="library" name="Maven: com.sun.xml.bind:jaxb-impl:2.1.13" level="project" />
<orderEntry type="library" name="Maven: com.sun.xml.bind:jaxb-xjc:2.1.13" level="project" />
<orderEntry type="library" name="Maven: org.apache.cxf:cxf-api:2.4.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.ws.xmlschema:xmlschema-core:2.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.neethi:neethi:3.0.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.cxf:cxf-common-utilities:2.4.2" level="project" />
<orderEntry type="library" name="Maven: org.codehaus.woodstox:woodstox-core-asl:4.1.1" level="project" />
<orderEntry type="library" name="Maven: org.codehaus.woodstox:stax2-api:3.1.1" level="project" />
</component>
</module>

@ -9,7 +9,7 @@
<parent>
<groupId>org.libresonic.player</groupId>
<artifactId>libresonic</artifactId>
<version>6.1.beta1</version>
<version>6.1.beta2</version>
</parent>
<dependencies>
@ -246,12 +246,6 @@
<version>1.5.5</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.5</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
@ -291,12 +285,6 @@
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.seamless</groupId>
<artifactId>seamless-http</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.seamless</groupId>
<artifactId>seamless-util</artifactId>

@ -57,6 +57,7 @@ public class PersonalSettingsCommand {
private boolean songNotificationEnabled;
private boolean queueFollowingSongs;
private boolean lastFmEnabled;
private int listReloadDelay;
private String lastFmUsername;
private String lastFmPassword;
private boolean isReloadNeeded;
@ -237,6 +238,14 @@ public class PersonalSettingsCommand {
this.lastFmEnabled = lastFmEnabled;
}
public int getListReloadDelay() {
return listReloadDelay;
}
public void setListReloadDelay(int listReloadDelay) {
this.listReloadDelay = listReloadDelay;
}
public String getLastFmUsername() {
return lastFmUsername;
}

@ -41,6 +41,7 @@ public class PlayerSettingsCommand {
private Date lastSeen;
private boolean isDynamicIp;
private boolean isAutoControlEnabled;
private boolean isM3uBomEnabled;
private String technologyName;
private String transcodeSchemeName;
private boolean transcodingSupported;
@ -109,6 +110,14 @@ public class PlayerSettingsCommand {
isAutoControlEnabled = autoControlEnabled;
}
public boolean isM3uBomEnabled() {
return isM3uBomEnabled;
}
public void setM3uBomEnabled(boolean m3uBomEnabled) {
isM3uBomEnabled = m3uBomEnabled;
}
public String getTranscodeSchemeName() {
return transcodeSchemeName;
}

@ -76,8 +76,8 @@ public class HomeController extends ParameterizableViewController {
}
int listOffset = getIntParameter(request, "listOffset", 0);
AlbumListType listType = AlbumListType.fromId(getStringParameter(request, "listType"));
UserSettings userSettings = settingsService.getUserSettings(user.getUsername());
if (listType == null) {
UserSettings userSettings = settingsService.getUserSettings(user.getUsername());
listType = userSettings.getDefaultAlbumList();
}
@ -140,6 +140,7 @@ public class HomeController extends ParameterizableViewController {
map.put("coverArtSize", CoverArtScheme.MEDIUM.getSize());
map.put("listOffset", listOffset);
map.put("musicFolder", selectedMusicFolder);
map.put("listReloadDelay", userSettings.getListReloadDelay());
ModelAndView result = super.handleRequestInternal(request, response);
result.addObject("model", map);

@ -74,6 +74,9 @@ public class M3UController implements Controller {
}
private void createClientSidePlaylist(PrintWriter out, Player player, String url) throws Exception {
if (player.isM3uBomEnabled()) {
out.print("\ufeff");
}
out.println("#EXTM3U");
List<MediaFile> result;
synchronized (player.getPlayQueue()) {
@ -99,6 +102,9 @@ public class M3UController implements Controller {
url += "&suffix=." + suffix;
}
if (player.isM3uBomEnabled()) {
out.print("\ufeff");
}
out.println("#EXTM3U");
out.println("#EXTINF:-1,Libresonic");
out.println(url);

@ -237,6 +237,7 @@ public class MultiController extends MultiActionController {
Map<String, Object> map = new HashMap<String, Object>();
map.put("showRight", userSettings.isShowNowPlayingEnabled() || userSettings.isShowChatEnabled());
map.put("autoHidePlayQueue", userSettings.isAutoHidePlayQueue());
map.put("listReloadDelay", userSettings.getListReloadDelay());
map.put("showSideBar", userSettings.isShowSideBar());
map.put("brand", settingsService.getBrand());
return new ModelAndView("index", "model", map);

@ -73,6 +73,7 @@ public class PersonalSettingsController extends SimpleFormController {
command.setBetaVersionNotificationEnabled(userSettings.isBetaVersionNotificationEnabled());
command.setSongNotificationEnabled(userSettings.isSongNotificationEnabled());
command.setAutoHidePlayQueue(userSettings.isAutoHidePlayQueue());
command.setListReloadDelay(userSettings.getListReloadDelay());
command.setLastFmEnabled(userSettings.isLastFmEnabled());
command.setLastFmUsername(userSettings.getLastFmUsername());
command.setLastFmPassword(userSettings.getLastFmPassword());
@ -135,6 +136,7 @@ public class PersonalSettingsController extends SimpleFormController {
settings.setBetaVersionNotificationEnabled(command.isBetaVersionNotificationEnabled());
settings.setSongNotificationEnabled(command.isSongNotificationEnabled());
settings.setAutoHidePlayQueue(command.isAutoHidePlayQueue());
settings.setListReloadDelay(command.getListReloadDelay());
settings.setLastFmEnabled(command.isLastFmEnabled());
settings.setLastFmUsername(command.getLastFmUsername());
settings.setSystemAvatarId(getSystemAvatarId(command));

@ -72,6 +72,7 @@ public class PlayerSettingsController extends SimpleFormController {
command.setLastSeen(player.getLastSeen());
command.setDynamicIp(player.isDynamicIp());
command.setAutoControlEnabled(player.isAutoControlEnabled());
command.setM3uBomEnabled(player.isM3uBomEnabled());
command.setTranscodeSchemeName(player.getTranscodeScheme().name());
command.setTechnologyName(player.getTechnology().name());
command.setAllTranscodings(transcodingService.getAllTranscodings());
@ -99,6 +100,7 @@ public class PlayerSettingsController extends SimpleFormController {
Player player = playerService.getPlayerById(command.getPlayerId());
player.setAutoControlEnabled(command.isAutoControlEnabled());
player.setM3uBomEnabled(command.isM3uBomEnabled());
player.setDynamicIp(command.isDynamicIp());
player.setName(StringUtils.trimToNull(command.getName()));
player.setTranscodeScheme(TranscodeScheme.valueOf(command.getTranscodeSchemeName()));

@ -52,6 +52,8 @@ import org.libresonic.player.dao.schema.hsql.Schema50;
import org.libresonic.player.dao.schema.hsql.Schema51;
import org.libresonic.player.dao.schema.hsql.Schema52;
import org.libresonic.player.dao.schema.hsql.Schema53;
import org.libresonic.player.dao.schema.hsql.Schema61;
import org.libresonic.player.dao.schema.hsql.Schema62;
import org.libresonic.player.service.SettingsService;
/**
@ -67,7 +69,8 @@ public class HsqlDaoHelper implements DaoHelper {
new Schema30(), new Schema31(), new Schema32(), new Schema33(), new Schema34(),
new Schema35(), new Schema36(), new Schema37(), new Schema38(), new Schema40(),
new Schema43(), new Schema45(), new Schema46(), new Schema47(), new Schema49(),
new Schema50(), new Schema51(), new Schema52(), new Schema53()};
new Schema50(), new Schema51(), new Schema52(), new Schema53(), new Schema61(),
new Schema62()};
private DataSource dataSource;
private static boolean shutdownHookAdded;

@ -35,7 +35,7 @@ import java.util.*;
public class PlayerDao extends AbstractDao {
private static final Logger LOG = Logger.getLogger(PlayerDao.class);
private static final String COLUMNS = "id, name, type, username, ip_address, auto_control_enabled, " +
private static final String COLUMNS = "id, name, type, username, ip_address, auto_control_enabled, m3u_bom_enabled, " +
"last_seen, cover_art_scheme, transcode_scheme, dynamic_ip, technology, client_id";
private PlayerRowMapper rowMapper = new PlayerRowMapper();
@ -94,7 +94,7 @@ public class PlayerDao extends AbstractDao {
player.setId(String.valueOf(id));
String sql = "insert into player (" + COLUMNS + ") values (" + questionMarks(COLUMNS) + ")";
update(sql, player.getId(), player.getName(), player.getType(), player.getUsername(),
player.getIpAddress(), player.isAutoControlEnabled(),
player.getIpAddress(), player.isAutoControlEnabled(), player.isM3uBomEnabled(),
player.getLastSeen(), CoverArtScheme.MEDIUM.name(),
player.getTranscodeScheme().name(), player.isDynamicIp(),
player.getTechnology().name(), player.getClientId());
@ -143,6 +143,7 @@ public class PlayerDao extends AbstractDao {
"username = ?," +
"ip_address = ?," +
"auto_control_enabled = ?," +
"m3u_bom_enabled = ?," +
"last_seen = ?," +
"transcode_scheme = ?, " +
"dynamic_ip = ?, " +
@ -150,7 +151,7 @@ public class PlayerDao extends AbstractDao {
"client_id = ? " +
"where id = ?";
update(sql, player.getName(), player.getType(), player.getUsername(),
player.getIpAddress(), player.isAutoControlEnabled(),
player.getIpAddress(), player.isAutoControlEnabled(), player.isM3uBomEnabled(),
player.getLastSeen(), player.getTranscodeScheme().name(), player.isDynamicIp(),
player.getTechnology(), player.getClientId(), player.getId());
}
@ -174,6 +175,7 @@ public class PlayerDao extends AbstractDao {
player.setUsername(rs.getString(col++));
player.setIpAddress(rs.getString(col++));
player.setAutoControlEnabled(rs.getBoolean(col++));
player.setM3uBomEnabled(rs.getBoolean(col++));
player.setLastSeen(rs.getTimestamp(col++));
col++; // Ignore cover art scheme.
player.setTranscodeScheme(TranscodeScheme.valueOf(rs.getString(col++)));

@ -44,7 +44,7 @@ public class UserDao extends AbstractDao {
"playlist_year, playlist_bit_rate, playlist_duration, playlist_format, playlist_file_size, " +
"last_fm_enabled, last_fm_username, last_fm_password, transcode_scheme, show_now_playing, selected_music_folder_id, " +
"party_mode_enabled, now_playing_allowed, avatar_scheme, system_avatar_id, changed, show_chat, show_artist_info, auto_hide_play_queue, " +
"view_as_list, default_album_list, queue_following_songs, show_side_bar";
"view_as_list, default_album_list, queue_following_songs, show_side_bar, list_reload_delay";
private static final Integer ROLE_ID_ADMIN = 1;
private static final Integer ROLE_ID_DOWNLOAD = 2;
@ -188,7 +188,7 @@ public class UserDao extends AbstractDao {
settings.getAvatarScheme().name(), settings.getSystemAvatarId(), settings.getChanged(),
settings.isShowChatEnabled(), settings.isShowArtistInfoEnabled(), settings.isAutoHidePlayQueue(),
settings.isViewAsList(), settings.getDefaultAlbumList().getId(), settings.isQueueFollowingSongs(),
settings.isShowSideBar()});
settings.isShowSideBar(), settings.getListReloadDelay()});
}
private static String encrypt(String s) {
@ -349,6 +349,7 @@ public class UserDao extends AbstractDao {
settings.setDefaultAlbumList(AlbumListType.fromId(rs.getString(col++)));
settings.setQueueFollowingSongs(rs.getBoolean(col++));
settings.setShowSideBar(rs.getBoolean(col++));
settings.setListReloadDelay((Integer) rs.getObject(col++));
return settings;
}

@ -0,0 +1,48 @@
/*
* This file is part of Libresonic.
*
* Libresonic is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Libresonic is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Libresonic. If not, see <http://www.gnu.org/licenses/>.
*/
package org.libresonic.player.dao.schema.hsql;
import org.springframework.jdbc.core.JdbcTemplate;
import org.libresonic.player.Logger;
import org.libresonic.player.dao.schema.Schema;
/**
* Used for creating and evolving the database schema.
* This class implements the database schema for Libresonic version 6.1.
*
* @author François-Xavier Thomas
*/
public class Schema61 extends Schema {
private static final Logger LOG = Logger.getLogger(Schema61.class);
@Override
public void execute(JdbcTemplate template) {
if (template.queryForInt("select count(*) from version where version = 26") == 0) {
LOG.info("Updating database schema to version 26.");
template.execute("insert into version values (26)");
}
if (!columnExists(template, "list_reload_delay", "user_settings")) {
LOG.info("Database column 'user_settings.list_reload_delay' not found. Creating it.");
template.execute("alter table user_settings add list_reload_delay int default 60 not null");
LOG.info("Database column 'user_settings.list_reload_delay' was added successfully.");
}
}
}

@ -0,0 +1,48 @@
/*
* This file is part of Libresonic.
*
* Libresonic is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Libresonic is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Libresonic. If not, see <http://www.gnu.org/licenses/>.
*/
package org.libresonic.player.dao.schema.hsql;
import org.springframework.jdbc.core.JdbcTemplate;
import org.libresonic.player.Logger;
import org.libresonic.player.dao.schema.Schema;
/**
* Used for creating and evolving the database schema.
* This class implements the database schema for Libresonic version 6.1.
*
* @author Shen-Ta Hsieh
*/
public class Schema62 extends Schema {
private static final Logger LOG = Logger.getLogger(Schema62.class);
@Override
public void execute(JdbcTemplate template) {
if (template.queryForInt("select count(*) from version where version = 27") == 0) {
LOG.info("Updating database schema to version 27.");
template.execute("insert into version values (27)");
}
if (!columnExists(template, "player", "m3u_bom_enabled")) {
LOG.info("Database column 'player.m3u_bom_enabled' not found. Creating it.");
template.execute("alter table player add m3u_bom_enabled boolean default false not null");
LOG.info("Database column 'player.m3u_bom_enabled' was added successfully.");
}
}
}

@ -241,7 +241,8 @@ public class PlayQueue {
MediaFile currentFile = getCurrentFile();
Collections.shuffle(files);
if (currentFile != null) {
index = files.indexOf(currentFile);
Collections.swap(files, files.indexOf(currentFile), 0);
index = 0;
}
}

@ -40,6 +40,7 @@ public class Player {
private String ipAddress;
private boolean isDynamicIp = true;
private boolean isAutoControlEnabled = true;
private boolean isM3uBomEnabled = true;
private Date lastSeen;
private TranscodeScheme transcodeScheme = TranscodeScheme.OFF;
private PlayQueue playQueue;
@ -188,6 +189,24 @@ public class Player {
this.isAutoControlEnabled = isAutoControlEnabled;
}
/**
* Returns whether apply BOM mark when generating a M3U file.
*
* @return Whether apply BOM mark when generating a M3U file.
*/
public boolean isM3uBomEnabled() {
return isM3uBomEnabled;
}
/**
* Sets whether apply BOM mark when generating a M3U file.
*
* @param isM3uBomEnabled Whether apply BOM mark when generating a M3U file.
*/
public void setM3uBomEnabled(boolean isM3uBomEnabled) {
this.isM3uBomEnabled = isM3uBomEnabled;
}
/**
* Returns the time when the player was last seen.
*

@ -46,6 +46,7 @@ public class UserSettings {
private Visibility mainVisibility = new Visibility();
private Visibility playlistVisibility = new Visibility();
private boolean lastFmEnabled;
private int listReloadDelay;
private String lastFmUsername;
private String lastFmPassword;
private TranscodeScheme transcodeScheme = TranscodeScheme.OFF;
@ -156,6 +157,14 @@ public class UserSettings {
this.lastFmEnabled = lastFmEnabled;
}
public int getListReloadDelay() {
return listReloadDelay;
}
public void setListReloadDelay(int listReloadDelay) {
this.listReloadDelay = listReloadDelay;
}
public String getLastFmUsername() {
return lastFmUsername;
}

@ -1270,6 +1270,7 @@ public class SettingsService {
settings.setQueueFollowingSongs(true);
settings.setDefaultAlbumList(AlbumListType.RANDOM);
settings.setLastFmEnabled(false);
settings.setListReloadDelay(60);
settings.setLastFmUsername(null);
settings.setLastFmPassword(null);
settings.setChanged(new Date());

@ -378,6 +378,7 @@ personalsettings.autohideplayqueue = Auto-hide play queue
personalsettings.finalversionnotification = Notify me about new versions
personalsettings.betaversionnotification = Notify me about new beta versions
personalsettings.songnotification = Notify me when new songs are played (not supported by all browsers)
personalsettings.listreloaddelay = Album list reload delay (in seconds, 0 disables)
personalsettings.lastfmenabled = Register what I'm playing at <a href="http://last.fm/" target="_blank">Last.fm</a>
personalsettings.lastfmusername = Last.fm username
personalsettings.lastfmpassword = Last.fm password
@ -511,6 +512,7 @@ playersettings.name = Player name
playersettings.maxbitrate = Max bitrate
playersettings.notranscoder = <em>Notice:</em> Transcoders does not appear to be installed.<br>Click Help button for more information.
playersettings.autocontrol = Control player automatically
playersettings.m3ubom = Apply BOM signature in the generated M3U file
playersettings.dynamicip = Player has dynamic IP address
playersettings.transcodings = Active transcodings
playersettings.ok = Save
@ -817,6 +819,8 @@ helppopup.playername.text = <p>Allows you to specify an easy-to-remember name fo
helppopup.autocontrol.title = Control player automatically
helppopup.autocontrol.text = <p>With this option selected, {0} will automatically start the player when you click "Play" \
in the playlist. Otherwise, you must start and connect the player yourself.</p>
helppopup.m3ubom.title = Apply BOM in M3U file
helppopup.m3ubom.text = <p>Apply a BOM mark in generated M3U playlists for Unicode compatibility.</p>
helppopup.dynamicip.title = Dynamic IP address
helppopup.dynamicip.text = <p>Turn off this option if the player uses a static IP address.</p>
helppopup.smtpServer.title = SMTP Server

@ -1,44 +1,71 @@
#
# Taiwan localization.
# Traditional Chinese (Taiwan) localization.
# Author: Cheng Jen Li
# chengjen.li@gmail.com
# Author: Shen-Ta Hsieh
# ibmibmibm.tw@gmail.com
#
common.home = \u9996\u9801
common.back = \u56DE\u5FA9
common.help = \u5354\u52A9
common.back = \u4E0A\u4E00\u9801
common.help = \u8AAA\u660E
common.play = \u64AD\u653E
common.add = \u65B0\u589E
common.download = \u4E0B\u8F09
common.close = \u95DC\u9589
common.refresh = \u5237\u65B0
common.next = \u4E0B\u9801
common.previous = \u4E0A\u9801
common.refresh = \u91CD\u65B0\u6574\u7406
common.next = \u4E0B\u4E00\u9801
common.previous = \u4E0A\u4E00\u9801
common.more = \u66F4\u591A
common.ok = \u78BA\u5B9A
common.cancel = \u53D6\u6D88
common.save = \u5132\u5B58
common.create = \u5EFA\u7ACB
common.delete = \u522A\u9664
common.edit = \u7DE8\u8F2F
common.confirm = \u8ACB\u78BA\u8A8D
common.unknown = (\u672A\u77E5)
common.default = (\u9810\u8A2D\u503C)
common.settingssaved = \u8A2D\u5B9A\u5DF2\u5132\u5B58\u3002
common.trialexpired = \u8A66\u7528\u7248\u5C07\u65BC {0} \u5230\u671F\u3002\u53D6\u5F97<b><a href="premiumSettings.view?">Subsonic Premium</a></b>\u4F86\u4F7F\u7528\u9019\u500B\u529F\u80FD\u3002
common.trialnotexpired = \u9019\u500B\u529F\u80FD\u5728 {0} \u4E4B\u524D\u90FD\u53EF\u4F7F\u7528\u3002\u4E4B\u5F8C\u60A8\u5FC5\u9808\u53D6\u5F97<b><a href="premiumSettings.view?">Subsonic Premium</a></b>\u624D\u80FD\u4F7F\u7528\u3002
# login.jsp
login.username = \u5E33\u865F
login.password = \u5BC6\u78BC
login.login = \u767B\u5165
login.remember = \u8A18\u5F97\u6211
login.logout = \u60A8\u5DF2\u7D93\u767B\u51FA.
login.error = \u5E33\u865F\u6216\u662F\u5BC6\u78BC\u932F\u8AA4.
login.insecure = {0} \u672A\u53D7\u4FDD\u8B77. \u8ACB\u5148\u4EE5\u4F7F\u7528\u8005\u53CA\u5BC6\u78BC "admin"\u767B\u5165, \u6216\u9EDE\u64CA <a href="login.view?user=admin&amp;password=admin">\u9019\u88E1</a>. \u4E26\u4E14\u7ACB\u523B\u8B8A\u66F4\u60A8\u7684\u5BC6\u78BC.
login.logout = \u60A8\u5DF2\u7D93\u767B\u51FA\u3002
login.error = \u5E33\u865F\u6216\u662F\u5BC6\u78BC\u932F\u8AA4\u3002
login.insecure = {0} \u672A\u53D7\u4FDD\u8B77\u3002\u8ACB\u5148\u4EE5\u4F7F\u7528\u8005\u53CA\u5BC6\u78BC "admin"\u767B\u5165\uFF0C\u6216\u9EDE\u9078 <a href="login.view?user=admin&amp;password=admin">\u9019\u88E1</a>\uFF0C\u4E26\u4E14\u7ACB\u523B\u8B8A\u66F4\u60A8\u7684\u5BC6\u78BC\u3002
login.recover = \u5FD8\u8A18\u5BC6\u78BC\uFF1F
# recover.jsp
recover.title = \u5FD8\u8A18\u5BC6\u78BC\uFF1F
recover.text = \u8981\u91CD\u8A2D\u5BC6\u78BC\uFF0C\u8ACB\u5728\u4E0B\u65B9\u8F38\u5165\u60A8\u7684<b>\u5E33\u865F</b>\u6216\u662F<b>Email\u4F4D\u5740</b>\u3002
recover.username = \u5E33\u865F\u6216Email\u4F4D\u5740
recover.send = \u91CD\u8A2D\u5BC6\u78BC\u4E26\u5BC4\u7D66\u6211
recover.success = \u60A8\u7684\u5BC6\u78BC\u5DF2\u91CD\u8A2D\u4E26\u5BC4\u5230\u4E86 {0} \u3002
recover.error.usernotfound = \u62B1\u6B49\uFF0C\u672A\u627E\u5230\u4F7F\u7528\u8005\u3002
recover.error.noemail = \u62B1\u6B49\uFF0C\u8A72\u4F7F\u7528\u8005\u672A\u8A3B\u518A\u4FE1\u7BB1\u3002
recover.error.sendfailed = Email\u5BC4\u9001\u5931\u6557\uFF0C\u8ACB\u7A0D\u5F8C\u518D\u8A66\u3002
recover.error.invalidcaptcha = \u62B1\u6B49\uFF0C\u8F38\u5165\u7684CAPTCHA\u6587\u5B57\u6709\u8AA4\uFF0C\u8ACB\u518D\u8A66\u4E00\u6B21\u3002
# accessDenied.jsp
accessDenied.title = \u62D2\u7D55\u5B58\u53D6
accessDenied.text = \u62B1\u6B49\uFF0C\u60A8\u7121\u6B0A\u57F7\u884C\u6240\u8ACB\u6C42\u7684\u64CD\u4F5C.
accessDenied.text = \u62B1\u6B49\uFF0C\u60A8\u7121\u6B0A\u57F7\u884C\u6240\u8ACB\u6C42\u7684\u64CD\u4F5C\u3002
# notFound.jsp
notFound.title = \u627E\u4E0D\u5230
notFound.text = <p>Sorry, we could not find what you were looking for.</p><p>Try reloading the web page. If that doesn't help, \
try scanning the media folders again.</p>
notFound.reload = \u91CD\u65B0\u6574\u7406\u9801\u9762
notFound.scan = Media folders settings
# top.jsp
top.home = \u9996\u9801
top.now_playing = \u64AD\u653E
top.starred = Starred
top.settings = \u8A2D\u5B9A
top.status = \u72C0\u614B
top.podcast = \u64AD\u5BA2
@ -46,32 +73,40 @@ top.more = \u5176\u4ED6
top.help = \u95DC\u65BC
top.search = \u641C\u5C0B
top.upgrade = \u6709\u65B0\u7248\u672C\u63D0\u4F9B. \u4E0B\u8F09 {0} {1} \
<a href\="\#" onclick\="window.open(''http\://libresonic.org/'')">\u9019\u88E1</a>.
top.missing = \u627E\u4E0D\u5230\u97F3\u6A02\u593E\uFF0C\u8ACB\u91CD\u65B0\u8A2D\u5B9A.
<a href\="\#" onclick\="window.open(''http\://libresonic.org/'')">\u9019\u88E1</a>\u3002
top.missing = \u627E\u4E0D\u5230\u97F3\u6A02\u8CC7\u6599\u593E\uFF0C\u8ACB\u91CD\u65B0\u8A2D\u5B9A\u3002
top.logout =\u767B\u51FA{0}
top.getpremium = \u53D6\u5F97 Subsonic Premium
top.gotpremium = Subsonic Premium
top.trialdaysleft = \u5269\u4E0B {0} \u5929\u9AD4\u9A57\u6642\u9593
# left.jsp
left.statistics = \u97F3\u6A02\u76D2\u6709 \
{0}&nbsp;\u4F4D\u6B4C\u624B<br>\
left.scanning = \u6383\u63CF\u97F3\u6A02\u8CC7\u6599\u593E\u4E2D\u2026
left.statistics = {0}&nbsp;\u4F4D\u6B4C\u624B<br>\
{1}&nbsp;\u5F35\u5C08\u8F2F<br>\
{2}&nbsp;\u9996\u6B4C\u66F2<br>\
{3} (\u7D04 {4} \u5C0F\u6642)
{3}<br>\
{4}&nbsp;\u5C0F\u6642
left.shortcut = \u6377\u5F91
left.playlists = \u64AD\u653E\u6E05\u55AE
left.radio = \u7DDA\u4E0A\u96FB\u8996/\u6536\u97F3\u6A5F
left.allfolders = \u5168\u90E8
left.showallplaylists = \u986F\u793A\u5168\u90E8
left.createplaylist = \u5EFA\u7ACB\u65B0\u7684\u64AD\u653E\u6E05\u55AE
left.importplaylist = \u532F\u5165\u64AD\u653E\u6E05\u55AE
# playlist.jsp
# playQueue.jsp
playlist.stop = \u505C\u6B62
playlist.start = \u64AD\u653E
playlist.confirmclear = \u78BA\u5B9A\u522A\u9664\u9EDE\u64AD\u6E05\u55AE?
playlist.confirmclear = \u78BA\u5B9A\u522A\u9664\u64AD\u653E\u6E05\u55AE?
playlist.clear = \u6E05\u9664
playlist.shuffle = \u96A8\u8208\u64AD\u653E
playlist.repeat_on = \u91CD\u64AD
playlist.repeat_off = \u4E0D\u91CD\u64AD
playlist.undo = \u53D6\u6D88
playlist.settings = \u8A2D\u5B9A
playlist.more = \u5176\u4ED6...
playlist.more.playlist = \u9EDE\u64AD\u6E05\u55AE
playlist.more = \u5176\u4ED6\u2026
playlist.more.playlist = \u64AD\u653E\u6E05\u55AE
playlist.more.sortbytrack = \u97F3\u8ECC\u6392\u5E8F
playlist.more.sortbyartist = \u6B4C\u624B\u6392\u5E8F
playlist.more.sortbyalbum = \u5C08\u8F2F\u6392\u5E8F
@ -79,12 +114,41 @@ playlist.more.selection = \u9078\u6B4C
playlist.more.selectall = \u5168\u9078
playlist.more.selectnone = \u5168\u4E0D\u9078
playlist.getflash = \u53D6\u5F97Flash\u64A5\u653E\u5668
playlist.saveplayqueue = \u5132\u5B58\u64AD\u653E\u4F47\u5217
playlist.loadplayqueue = \u8F09\u5165\u64AD\u653E\u4F47\u5217
playlist.save = \u5132\u5B58
playlist.append = \u52A0\u5165\u6E05\u55AE
playlist.remove = \u79FB\u9664
playlist.up = \u4E0A
playlist.down = \u4E0B
playlist.empty = \u7A7A\u7684\u9EDE\u64AD\u6E05\u55AE
playlist.empty = \u7A7A\u7684\u64AD\u653E\u6E05\u55AE
playlist.toast.appendtoplaylist = \u64AD\u653E\u6E05\u55AE\u5DF2\u66F4\u65B0\u3002
playlist.toast.saveasplaylist = \u64AD\u653E\u6E05\u55AE\u5DF2\u5132\u5B58\u3002
playlist.toast.saveplayqueue = \u64AD\u653E\u4F47\u5217\u5DF2\u5132\u5B58\u3002
playlist.missing = \u907A\u5931
# playlist.jsp
playlist2.noplaylists = \u60A8\u9084\u672A\u5EFA\u7ACB\u4EFB\u4F55\u6E05\u55AE\u3002
playlist2.created = \u7531 {0} \u5EFA\u7ACB\u7684 {1}
playlist2.songs = \u6B4C\u66F2
playlist2.shared = \u5176\u4ED6\u4EBA\u4E5F\u53EF\u770B\u898B
playlist2.notshared = \u5176\u4ED6\u4EBA\u7121\u6CD5\u770B\u898B
playlist2.name = \u64AD\u653E\u6E05\u55AE\u540D\u7A31
playlist2.comment = \u64AD\u653E\u6E05\u55AE\u8A3B\u89E3
playlist2.public = \u4F7F\u6B64\u64AD\u653E\u6E05\u55AE\u53EF\u88AB\u5176\u4ED6\u4EBA\u4F7F\u7528\u3002
playlist2.confirmdelete = \u60A8\u78BA\u5B9A\u8981\u522A\u9664\u6B64\u64AD\u653E\u6E05\u55AE\u55CE\uFF1F
playlist2.empty = \u64AD\u653E\u6E05\u55AE\u70BA\u7A7A
playlist2.export = \u532F\u51FA
# importPlaylist.jsp
importPlaylist.title = Import playlist
importPlaylist.text = Select playlist to import (m3u, pls, xspf)
importPlaylist.success = Successfully imported playlist "{0}".
importPlaylist.error = Failed to import playlist. {0}
# videoPlayer.jsp
videoPlayer.getflash = Please install Flash Player
videoPlayer.getpremium = Get <b><a href='premiumSettings.view?' target='main'>Subsonic Premium</a></b> to play on Chromecast.
# status.jsp
status.title = \u72C0\u614B
@ -98,46 +162,67 @@ status.current = \u76EE\u524D\u64AD\u653E
status.transmitted = \u50B3\u8F38
status.bitrate = Bitrate (Kbps)
# starred.jsp
starred.title = My starred items
starred.empty = Click the star icons to mark your favorite artist, albums and songs.
# search.jsp
search.title = \u641C\u5C0B
search.query = \u6B4C\u624B\u3001\u5C08\u8F2F\u6216\u6B4C\u66F2\u6A19\u984C\u3002
search.search = \u641C\u5C0B
search.index = \u6B63\u5728\u5EFA\u7ACB\u7D22\u5F15\uFF0C\u8ACB\u7A0D\u5F8C\u518D\u8A66!
search.hits.none = \u627E\u4E0D\u5230.
search.index = \u6B63\u5728\u5EFA\u7ACB\u7D22\u5F15\uFF0C\u8ACB\u7A0D\u5F8C\u518D\u8A66\uFF01
search.hits.none = \u627E\u4E0D\u5230\u3002
search.hits.more = \u66F4\u591A
search.hits.artists = \u6B4C\u624B
search.hits.albums = \u5C08\u8F2F
search.hits.songs = \u6B4C\u66F2
search.hits.videos = \u5F71\u50CF
# gettingStarted.jsp
gettingStarted.title = \u521D\u6B21\u4F7F\u7528
gettingStarted.text = <p>\u6B61\u8FCE\u4F7F\u7528Libresonic!<br>\u8ACB\u4F9D\u7167\u4E0B\u9762\u7684\u6B65\u9A5F\u8A2D\u5B9A.<br> \
\u9EDE\u64CA\u5DE5\u5177\u5217\u4E0A\u7684"\u9996\u9801"\uFF0C\u5C31\u80FD\u96A8\u6642\u56DE\u4F86\u9019\u88E1\uFF01.</p> \
gettingStarted.text = <p>\u6B61\u8FCE\u4F7F\u7528Libresonic\uFF01<br>\u8ACB\u4F9D\u7167\u4E0B\u9762\u7684\u6B65\u9A5F\u8A2D\u5B9A\u3002<br> \
\u9EDE\u64CA\u5DE5\u5177\u5217\u4E0A\u7684"\u9996\u9801"\uFF0C\u5C31\u80FD\u96A8\u6642\u56DE\u4F86\u9019\u88E1\u3002</p> \
<p>\u9700\u8981\u66F4\u591A\u8A0A\u606F\u8ACB\u53C3\u8003<a href="http://libresonic.org/pages/getting-started.jsp" target="_blank"><b>\u5165\u9580\u6307\u5357</b></a></p>
gettingStarted.step1.title = \u8B8A\u66F4\u7BA1\u7406\u54E1\u7684\u5BC6\u78BC.
gettingStarted.root = \u8B66\u544A\uFF01Libresonic\u7A0B\u5F0F\u6B63\u4EE5 root \u4F7F\u7528\u8005\u57F7\u884C\u3002\u8ACB\u8003\u616E \
<a href="http://libresonic.org/pages/installation.jsp" target="_blank">\u5225\u7684\u65B9\u5F0F</a>\u3002
gettingStarted.step1.title = \u8B8A\u66F4\u7BA1\u7406\u54E1\u7684\u5BC6\u78BC\u3002
gettingStarted.step1.text = \u8ACB\u4FEE\u6539\u9810\u8A2D\u7684\u7BA1\u7406\u54E1\u5BC6\u78BC\uFF0C\u4EE5\u78BA\u4FDD\u4F3A\u670D\u5668\u7684\u5B89\u5168\u3002\
\u4E5F\u53EF\u4EE5\u5EFA\u7ACB\u65B0\u7684\u4F7F\u7528\u8005\u4E26\u7D66\u4E88\u4E0D\u540C\u7684\u6B0A\u9650
gettingStarted.step2.title = \u8A2D\u5B9A\u97F3\u6A02\u593E.
\u4E5F\u53EF\u4EE5\u5EFA\u7ACB\u65B0\u7684\u4F7F\u7528\u8005\u4E26\u7D66\u4E88\u4E0D\u540C\u7684\u6B0A\u9650\u3002
gettingStarted.step2.title = \u8A2D\u5B9A\u97F3\u6A02\u8CC7\u6599\u593E\u3002
gettingStarted.step2.text = \u8A2D\u5B9A\u60A8\u97F3\u6A02\u6240\u653E\u7F6E\u7684\u8CC7\u6599\u593E\u3002
gettingStarted.step3.title = \u914D\u7F6E\u7DB2\u8DEF\u8A2D\u5B9A.
gettingStarted.step3.title = \u914D\u7F6E\u7DB2\u8DEF\u8A2D\u5B9A\u3002
gettingStarted.step3.text = \u5982\u679C\u60A8\u8981\u900F\u904E\u7DB2\u969B\u7DB2\u8DEF\u6216\u662F\u8207\u60A8\u7684\u670B\u53CB\u3001\u5BB6\u4EBA\u5206\u4EAB\u3002\
\u4E26\u53D6\u5F97\u60A8\u7684\u5C08\u5C6C\u7DB2\u5740\u50CF\u662F<em>yourname</em>.libresonic.org.
\u4E26\u53D6\u5F97\u60A8\u7684\u5C08\u5C6C\u7DB2\u5740\u50CF\u662F<em>yourname</em>.libresonic.org\u3002
gettingStarted.hide = \u4E0B\u6B21\u4E0D\u986F\u793A\u672C\u9801\uFF01
gettingStarted.hidealert = \u5982\u679C\u4E0B\u6B21\u9084\u9700\u8981\u986F\u793A\u63D0\u793A,\u8ACB\u5F9E \u8A2D\u5B9A->\u4E00\u822C \u4E2D\u52FE\u9078.
gettingStarted.hidealert = \u5982\u679C\u4E0B\u6B21\u9084\u9700\u8981\u986F\u793A\u63D0\u793A\uFF0C\u8ACB\u5F9E \u8A2D\u5B9A\u2192\u4E00\u822C \u4E2D\u52FE\u9078\u3002
# home.jsp
home.random.title = \u96A8\u8208\u64AD\u653E
home.alphabetical.title = \u5168\u90E8
home.newest.title = \u6700\u65B0\u97F3\u6A02
home.starred.title = \u661F\u865F\u6A19\u8A18
home.highest.title = \u559C\u597D\u7A0B\u5EA6
home.frequent.title = \u9EDE\u64AD\u7387
home.recent.title = \u6700\u8FD1\u64AD\u653E
home.decade.title = \u7531\u5E74\u4EFD
home.genre.title = \u7531\u66F2\u98A8
home.users.title = \u4F7F\u7528\u8005
home.random.text = \u96A8\u8208\u9078\u64AD\u5C08\u8F2F
home.alphabetical.text = \u6240\u6709\u5C08\u8F2F
home.newest.text = \u6700\u65B0\u5C08\u8F2F
home.starred.text = \u60A8\u6A19\u8A18\u661F\u865F\u7684\u5C08\u8F2F
home.highest.text = \u8A55\u50F9\u9AD8\u7684\u5C08\u8F2F
home.frequent.text = \u6700\u591A\u9EDE\u64AD\u5C08\u8F2F
home.recent.text =\u6700\u8FD1\u64AD\u653E\u5C08\u8F2F
home.decade.text = \u5E74\u4EFD
home.genre.text = \u66F2\u98A8
home.users.text = \u4F7F\u7528\u8005\u7D71\u8A08
home.scan = \u97F3\u6A02\u593E\u5DF2\u7D93\u6383\u63CF. \u6240\u6709\u529F\u80FD\u5C1A\u672A\u958B\u653E.
home.scan = \u6B63\u5728\u6383\u63CF\u97F3\u6A02\u8CC7\u6599\u593E\u3002\u90E8\u4EFD\u529F\u80FD\u5C07\u7121\u6CD5\u4F7F\u7528\u3002
home.albums = \u5C08\u8F2F {0} - {1}
home.playcount = \u64AD\u653E\u4E86 {0} \u9996\u6B4C
home.lastplayed = \u64AD\u653E {0}
home.created = \u5EFA\u7ACB {0}
home.shuffle = \u96A8\u6A5F\u64AD\u653E
home.chart.total = \u7E3D\u8A08 (MB)
home.chart.stream = \u4E32\u6D41 (MB)
home.chart.download = \u5DF2\u4E0B\u8F09(MB)
@ -148,70 +233,79 @@ more.title = \u5176\u4ED6
more.random.title = \u96A8\u8208\u64AD\u653E
more.random.text = \u5EFA\u7ACB\u96A8\u8208\u6E05\u55AE
more.random.songs = {0} \u9996
more.random.auto = \u7576\u9EDE\u64AD\u6E05\u55AE\u64AD\u653E\u5B8C\u7562\u6642\u7E7C\u7E8C\u64AD\u653E\u66F4\u591A\u7684\u96A8\u8208\u6B4C\u66F2 .
more.random.auto = \u7576\u64AD\u653E\u6E05\u55AE\u64AD\u653E\u5B8C\u7562\u6642\u7E7C\u7E8C\u96A8\u6A5F\u64AD\u653E\u6B4C\u66F2\u3002
more.random.ok = \u78BA\u5B9A
more.random.genre = \u66F2\u98A8
more.random.anygenre = \u4EFB\u610F
more.random.year = \u5E74\u4EFD
more.random.anyyear = \u4EFB\u610F
more.random.folder = \u97F3\u6A02\u593E
more.random.folder = \u97F3\u6A02\u8CC7\u6599\u593E
more.random.anyfolder = \u4EFB\u610F
more.apps.title = Libresonic Apps
more.apps.text = <p>\u652F\u63F4 <b>iPhone</b>, \
<b>Android</b> \u548C <b>AIR</b>\u7684<a href="http://libresonic.org/pages/apps.jsp" target="_blank">Libresonic apps</a>.</p>
<b>Android</b> \u548C <b>AIR</b>\u7684<a href="http://libresonic.org/pages/apps.jsp" target="_blank">Libresonic apps</a>\u3002</p>
more.jamstash.title = JamStash
more.jamstash.text = <p>Jamstash \u662F Libresonic \u7684 HTML5 \u64AD\u653E\u5668\u3002<a href="{0}" target="_blank">\u9EDE\u9078\u9019\u88E1</a> \u4F86\u555F\u52D5\u3002 \
\u4E5F\u53EF\u4EE5\u5728 <a href="https://chrome.google.com/webstore/detail/jamstash/jccdpflnecheidefpofmlblgebobbloc" target="_blank">Chrome App</a> \u5167\u53D6\u5F97\u3002</p>
more.status.title = \u7DB2\u8DEF\u72C0\u614B
more.status.text = <a href="status.view">\u76E3\u63A7</a>\u6240\u6709\u7DB2\u8DEF\u4E32\u6D41\u7684\u5373\u6642\u72C0\u614B\u3002
more.mobile.title = \u79FB\u52D5\u8A2D\u5099
more.mobile.text = <p>\u53EF\u4EE5\u7531WAP\u96FB\u8A71\u6216PDA\u4F7F\u7528 {0} .<br> \
more.mobile.text = <p>\u53EF\u4EE5\u7531 WAP \u96FB\u8A71\u6216 PDA \u4F7F\u7528 {0} \u3002<br> \
\u7D93\u7531\u624B\u6A5F\u8F38\u5165\u9019\u6A23\u7684\u7DB2\u5740 <b>http://yourhostname/wap</b></p> \
<p>\u7576\u7136\u60A8\u624B\u6A5F\u5FC5\u9808\u8981\u6709\u4E0A\u7DB2\u529F\u80FD!.</p>
<p>\u9019\u9700\u8981\u60A8\u7684\u4F3A\u670D\u5668\u53EF\u4EE5\u900F\u904E\u7DB2\u969B\u7DB2\u8DEF\u5B58\u53D6\u3002</p>
more.podcast.title = \u64AD\u5BA2
more.podcast.text = <p>\u5132\u5B58\u9EDE\u64AD\u6E05\u55AE\u7576\u6210\u64AD\u5BA2.<br>\
\u7D93\u7531\u9019\u500B\u7DB2\u5740\u53EF\u4EE5\u6536\u807D: <b>http://yourhostname/podcast</b>, \
\u6216\u662F <b><a href="podcast.view?suffix=.rss">\u9EDE\u6211</a>.</b></p>
more.podcast.text = <p>\u5132\u5B58\u64AD\u653E\u6E05\u55AE\u7576\u6210\u64AD\u5BA2\u3002<br>\
\u7D93\u7531\u9019\u500B\u7DB2\u5740\u53EF\u4EE5\u6536\u807D\uFF1A <b>http://yourhostname/podcast</b>\uFF0C\
\u6216\u662F <b><a href="podcast.view?suffix=.rss">\u9EDE\u6211</a>\u3002</b></p>
more.upload.title = \u4E0A\u50B3\u6A94\u6848
more.upload.source = \u9078\u64C7\u6A94\u6848
more.upload.target = \u4E0A\u50B3\u5230
more.upload.browse = \u9078\u64C7
more.upload.ok = \u4E0A\u50B3
more.upload.unzip = \u81EA\u52D5\u89E3\u58D3\u7E2Ezip\u6A94.
more.upload.progress = % \u5B8C\u6210. \u8ACB\u7A0D\u5019...
more.upload.unzip = \u81EA\u52D5\u89E3\u58D3\u7E2Ezip\u6A94\u3002
more.upload.progress = % \u5B8C\u6210\u3002\u8ACB\u7A0D\u5019\u2026
# upload.jsp
upload.title = \u6A94\u6848\u4E0A\u50B3\u4E2D......
upload.title = \u6A94\u6848\u4E0A\u50B3\u4E2D
upload.success = \u4E0A\u50B3\u6210\u529F <b>{0}</b>
upload.empty = \u6C92\u6709\u4E0A\u50B3\u7684\u6A94\u6848\u5594.
upload.failed = \u6A94\u6848\u4E0A\u50B3\u5931\u6557\u56E0\u70BA:<br><b>"{0}"</b>
upload.empty = \u6C92\u6709\u53EF\u4E0A\u50B3\u7684\u6A94\u6848\u3002
upload.failed = \u6A94\u6848\u4E0A\u50B3\u6642\u767C\u751F\u932F\u8AA4\uFF1A<br><b>"{0}"</b>
upload.unzipped = \u89E3\u58D3\u7E2E {0}
# help.jsp
help.title = \u95DC\u65BC {0}
help.upgrade = <b>\u6CE8\u610F!</b> \u5DF2\u7D93\u6709\u65B0\u7684\u7248\u672C\u4E86\uFF0C\u4E0B\u8F09\u65B0\u7248 {0} {1} \
<a href="#" onclick="window.open(''http://libresonic.org/'')">\u5728\u9019</a>.
help.upgrade = <b>\u6CE8\u610F\uFF01</b> \u6709\u65B0\u7248\u672C\u53EF\u7528\u3002\u4E0B\u8F09 {0} {1} \
<a href="#" onclick="window.open(''http://libresonic.org/'')">\u8ACB\u9EDE\u9078\u9019\u88E1</a>\u3002
help.premium.title = \u6388\u6B0A
help.premium.expires = (\u904E\u671F {0})
help.premium.upgrade = \u5347\u7D1A\u5230 <a href="premiumSettings.view">Subsonic Premium</a> \u4F86\u4F7F\u7528 <a href="premiumSettings.view">\u66F4\u591A\u529F\u80FD</a>\uFF01
help.premium.expired = (\u6388\u6B0A\u904E\u671F\u65BC {0})
help.version.title = \u7248\u672C
help.builddate.title = \u65E5\u671F
help.server.title = \u4F3A\u670D\u5668
help.license.title = \u6388\u6B0A
help.license.text = {0} \u662F\u4EE5 <a href="http://www.gnu.org/copyleft/gpl.html" target="_blank">GPL</a> \u578B\u5F0F\u767C\u4F48\u6388\u6B0A\u7684\u81EA\u7531\u8EDF\u9AD4. <br>\
{0} \u4F7F\u7528 <a href="http://libresonic.org/pages/libraries.jsp" target="_blank">\u7B2C\u4E09\u65B9\u6388\u6B0A</a>.
help.license.text = {0} \u662F\u4EE5 <a href="http://www.gnu.org/copyleft/gpl.html" target="_blank">GPL</a> \u578B\u5F0F\u767C\u4F48\u6388\u6B0A\u7684\u81EA\u7531\u8EDF\u9AD4\u3002<br>{0} \u4F7F\u7528 <a href="http://libresonic.org/pages/libraries.jsp" target="_blank">\u7B2C\u4E09\u65B9\u6388\u6B0A</a>\u3002
help.homepage.title = \u9996\u9801
help.forum.title = \u8AD6\u58C7
help.shop.title = \u5546\u54C1
help.contact.title = \u806F\u7E6B
help.contact.text = {0} \u7531 Sindre Mehus \u958B\u767C\u53CA\u7DAD\u8B77 \
(<a href="mailto:sindre@activeobjects.no">sindre@activeobjects.no</a>). \
\u5982\u679C\u60A8\u6709\u4EFB\u4F55\u7591\u554F\uFF0C\u610F\u898B\u6216\u5EFA\u8B70\u6539\u5584\uFF0C\u8ACB\u5230 \
<a href="https://www.reddit.com/r/libresonic" target="_blank">Libresonic\u8AD6\u58C7</a>.
help.contact.text = {0} \u7531 Sindre Mehus \u958B\u767C\u53CA\u7DAD\u8B77(<a href="mailto:sindre@activeobjects.no">sindre@activeobjects.no</a>)\u3002\u5982\u679C\u60A8\u6709\u4EFB\u4F55\u7591\u554F\uFF0C\u610F\u898B\u6216\u5EFA\u8B70\u6539\u5584\uFF0C\u8ACB\u5230<a href="https://www.reddit.com/r/libresonic" target="_blank">Libresonic\u8AD6\u58C7</a>\u3002
help.log = \u8A18\u9304
help.logfile = \u5B8C\u6574\u7684\u7D00\u9304\u5B58\u653E\u5728 {0}.
help.logfile = \u5B8C\u6574\u7684\u7D00\u9304\u5B58\u653E\u5728 {0}\u3002
# settingsHeader.jsp
settingsheader.title = \u8A2D\u5B9A
settingsheader.general = \u4E00\u822C
settingsheader.advanced = \u9032\u968E
settingsheader.personal = \u500B\u4EBA\u5316
settingsheader.musicFolder = \u97F3\u6A02\u593E
settingsheader.musicFolder = \u97F3\u6A02\u8CC7\u6599\u593E
settingsheader.internetRadio = \u7DDA\u4E0A\u96FB\u8996/\u6536\u97F3\u6A5F
settingsheader.podcast = \u64AD\u5BA2
settingsheader.player = \u64AD\u653E\u5668
settingsheader.dlna = DLNA/UPnP
settingsheader.sonos = Sonos
settingsheader.premium = Subsonic Premium
settingsheader.share = \u5206\u4EAB\u5A92\u9AD4
settingsheader.network = \u7DB2\u8DEF
settingsheader.transcoding = \u8F49\u6A94
settingsheader.user = \u4F7F\u7528\u8005
@ -220,57 +314,71 @@ settingsheader.coverArt = \u5C08\u8F2F\u5C01\u9762
settingsheader.password = \u5BC6\u78BC
# generalSettings.jsp
generalsettings.playlistfolder = \u9EDE\u64AD\u6E05\u55AE\u8CC7\u6599\u593E
generalsettings.playlistfolder = \u64AD\u653E\u6E05\u55AE\u8CC7\u6599\u593E
generalsettings.musicmask = \u97F3\u6A02\u7684\u9644\u5C6C\u6A94\u540D:
generalsettings.videomask = \u8996\u8A0A\u7684\u9644\u5C6C\u6A94\u540D:
generalsettings.coverartmask = \u5C08\u8F2F\u5C01\u9762\u9644\u5C6C\u6A94\u540D
generalsettings.index = \u7D22\u5F15
generalsettings.ignoredarticles = \u5FFD\u7565\u7684\u6B4C\u624B\u540D\u7A31
generalsettings.shortcuts = \u6377\u5F91
generalsettings.sortalbumsbyyear = \u7531\u5E74\u4EFD\u6392\u5E8F\u5C08\u8F2F
generalsettings.showgettingstarted = \u5728\u9996\u9801\u986F\u793A "\u521D\u6B21\u4F7F\u7528"
generalsettings.welcometitle = \u6B61\u8FCE\u6A19\u984C
generalsettings.welcomesubtitle = \u6B61\u8FCE\u6B21\u6A19\u984C
generalsettings.welcomemessage = \u6B61\u8FCE\u8A0A\u606F
generalsettings.loginmessage = \u767B\u5165\u8A0A\u606F
generalsettings.language = Default language
generalsettings.language = \u9810\u8A2D\u8A9E\u8A00
generalsettings.theme = \u9810\u8A2D\u4F48\u666F\u4E3B\u984C
# advancedSettings.jsp
advancedsettings.downsamplecommand = \u964D\u983B\u6307\u4EE4
advancedsettings.coverartlimit = \u5C01\u9762\u9650\u5236<br><div class="detail">(0 = \u4E0D\u9650)</div>
advancedsettings.hlscommand = HTTP \u7DDA\u4E0A\u4E32\u6D41\u6307\u4EE4
advancedsettings.downloadlimit = \u4E0B\u8F09\u9650\u5236 (Kbps)<br><div class="detail">(0 = \u4E0D\u9650)</div>
advancedsettings.uploadlimit = \u4E0A\u50B3\u9650\u5236 (Kbps)<br><div class="detail">(0 = \u4E0D\u9650)</div>
advancedsettings.streamport = \u975ESSL \u4E32\u6D41Port<br><div class="detail">(0 = \u53D6\u6D88)</div>
advancedsettings.ldapenabled = \u555F\u52D5LDAP\u9A57\u8B49
advancedsettings.ldapurl = LDAP\u7DB2\u5740
advancedsettings.ldapsearchfilter = LDAP\u641C\u5C0B\u904E\u6FFE
advancedsettings.ldapmanagerdn = LDAP \u7BA1\u7406\u8005DN<br><div class="detail">(\u53EF\u9078\u64C7)</div>
advancedsettings.streamport = \u975E SSL \u4E32\u6D41 Port <br><div class="detail">(0 = \u53D6\u6D88)</div>
advancedsettings.ldapenabled = \u555F\u52D5 LDAP \u9A57\u8B49
advancedsettings.ldapurl = LDAP \u7DB2\u5740
advancedsettings.ldapsearchfilter = LDAP \u641C\u5C0B\u904E\u6FFE
advancedsettings.ldapmanagerdn = LDAP \u7BA1\u7406\u8005 DN <br><div class="detail">(\u53EF\u9078\u64C7)</div>
advancedsettings.ldapmanagerpassword = \u5BC6\u78BC
advancedsettings.ldapautoshadowing = \u81EA\u52D5\u5728{0}\u5EFA\u7ACB\u4F7F\u7528\u8005
advancedsettings.smtpPort = SMTP \u9023\u63A5\u57E0
advancedsettings.smtpServer = SMTP \u4F3A\u670D\u5668
advancedsettings.smtpEncryption = SMTP \u52A0\u5BC6
advancedsettings.smtpUser = SMTP \u5E33\u865F
advancedsettings.smtpPassword = \u5BC6\u78BC
advancedsettings.smtpEncryption.none = \u7121
advancedsettings.smtpEncryption.starttls = STARTTLS
advancedsettings.smtpEncryption.ssl = SSL/TLS
advancedsettings.smtpFrom = \u5BC4\u4EF6\u8005
# personalSettings.jsp
personalsettings.title = {0}\u7684\u500B\u4EBA\u5316\u8A2D\u5B9A
personalsettings.language = Language
personalsettings.language = \u8A9E\u8A00
personalsettings.theme = \u4F48\u666F\u4E3B\u984C
personalsettings.albumlist = \u9810\u8A2D\u5C08\u8F2F\u6392\u5E8F\u65B9\u5F0F
personalsettings.display = \u986F\u793A
personalsettings.browse = \u700F\u89BD
personalsettings.playlist = \u9EDE\u64AD\u6E05\u55AE
personalsettings.playlist = \u64AD\u653E\u6E05\u55AE
personalsettings.tracknumber = \u97F3\u8ECC #
personalsettings.artist = \u6B4C\u624B
personalsettings.album = \u5C08\u8F2F
personalsettings.genre = \u66F2\u98A8\u578B\u614B
personalsettings.genre = \u66F2\u98A8
personalsettings.year = \u767C\u884C
personalsettings.bitrate = Bit rate
personalsettings.duration = \u6642\u6548
personalsettings.format = \u683C\u5F0F
personalsettings.filesize = \u6587\u4EF6\u5927\u5C0F
personalsettings.captioncutoff = Caption cutoff
personalsettings.partymode = \u5BB4\u6703\u6A21\u5F0F
personalsettings.queuefollowingsongs = Queue following songs on play
personalsettings.shownowplaying = \u5176\u4ED6\u4EBA\u5728\u807D\u4EC0\u9EBC
personalsettings.nowplayingallowed = \u8B93\u5225\u4EBA\u770B\u6211\u5728\u807D\u4EC0\u9EBC
personalsettings.showchat = \u986F\u793A\u4EA4\u8AC7\u8A0A\u606F
personalsettings.showartistinfo = \u986F\u793A\u6B4C\u624B\u8CC7\u8A0A
personalsettings.autohideplayqueue = \u81EA\u52D5\u96B1\u85CF\u64AD\u653E\u4F47\u5217
personalsettings.finalversionnotification = \u63D0\u793A\u65B0\u7248\u672C
personalsettings.betaversionnotification = \u63D0\u793A\u65B0\u7684\u6E2C\u8A66\u7248
personalsettings.songnotification = \u958B\u59CB\u64AD\u653E\u65B0\u6B4C\u6642\u63D0\u9192\u6211 (\u4E0D\u662F\u6240\u6709\u700F\u89BD\u5668\u90FD\u652F\u63F4)
personalsettings.lastfmenabled = \u767B\u9304\u6211\u5728 <a href="http://last.fm/" target="_blank">Last.fm</a>\u7684\u5E33\u865F
personalsettings.lastfmusername = Last.fm \u5E33\u865F
personalsettings.lastfmpassword = Last.fm \u5BC6\u78BC
@ -286,28 +394,51 @@ personalsettings.avatar.courtesy = Icons courtesy of <a href="http://www.aftergl
# avatarUploadResult.jsp
avataruploadresult.title = \u8B8A\u66F4\u500B\u4EBA\u5716\u793A
avataruploadresult.success = \u6210\u529F\u4E0A\u50B3\u500B\u4EBA\u5716\u793A "{0}".
avataruploadresult.failure = \u7121\u6CD5\u4E0A\u50B3\u500B\u4EBA\u5716\u793A. \u8ACB\u53C3\u95B1 <a href="help.view?">\u8A18\u9304</a>.
avataruploadresult.success = \u6210\u529F\u4E0A\u50B3\u500B\u4EBA\u5716\u793A "{0}"\u3002
avataruploadresult.failure = \u7121\u6CD5\u4E0A\u50B3\u500B\u4EBA\u5716\u793A. \u8ACB\u53C3\u95B1 <a href="help.view?">\u8A18\u9304</a>\u3002
# passwordSettings.jsp
passwordsettings.title = \u8B8A\u66F4\u5BC6\u78BC {0}
# musicFolderSettings.jsp
musicfoldersettings.path = \u97F3\u6A02\u593E
musicfoldersettings.path = \u97F3\u6A02\u8CC7\u6599\u593E
musicfoldersettings.name = \u540D\u7A31
musicfoldersettings.enabled = \u4F7F\u7528
musicfoldersettings.add = \u65B0\u589E\u97F3\u6A02\u593E
musicfoldersettings.nopath = \u5E6B\u97F3\u6A02\u593E\u547D\u540D\u5427.
musicfoldersettings.add = \u65B0\u589E\u97F3\u6A02\u8CC7\u6599\u593E
musicfoldersettings.nopath = \u8ACB\u6307\u5B9A\u8CC7\u6599\u593E\u3002
musicfoldersettings.notfound = \u627E\u4E0D\u5230\u8CC7\u6599\u593E
musicfoldersettings.scan = \u6383\u63CF\u97F3\u6A02\u8CC7\u6599\u593E
musicfoldersettings.interval.never = \u5F9E\u4E0D
musicfoldersettings.interval.one = \u6BCF\u5929
musicfoldersettings.interval.many = \u6BCF\u9694 {0} \u5929
musicfoldersettings.hour = \u5728 {0}:00
musicfoldersettings.nowscanning = \u6B63\u5728\u6383\u63CF\u97F3\u6A02\u8CC7\u6599\u593E\u3002 \
\u9019\u500B\u52D5\u4F5C\u5C07\u9700\u8981\u5E7E\u5206\u9418\uFF0C\u53D6\u6C7A\u65BC\u60A8\u7684\u5A92\u9AD4\u8CC7\u6599\u5EAB\u7684\u5927\u5C0F\u3002
musicfoldersettings.scannow = \u7ACB\u5373\u6383\u63CF\u97F3\u6A02\u8CC7\u6599\u593E
musicfoldersettings.access = \u7BA1\u7406\u4F7F\u7528\u8005\u5B58\u53D6\u6B0A\u9650
musicfoldersettings.access.description = \u8A2D\u5B9A\u54EA\u4E9B\u8CC7\u6599\u593E\u53EF\u4EE5\u88AB\u54EA\u4E9B\u4F7F\u7528\u8005\u5B58\u53D6\u3002
musicfoldersettings.fastcache = \u5FEB\u901F\u8B80\u53D6\u6A21\u5F0F
musicfoldersettings.fastcache.description = \u5982\u679C\u4F60\u7684\u5A92\u9AD4\u6A94\u6848\u5728\u7DB2\u8DEF\u4E0A\u7684\u78C1\u789F\uFF0C\u4F7F\u7528\u9019\u500B\u9078\u9805\u4F86\u6E1B\u5C11\u78C1\u789F\u5B58\u53D6\u3002 \
\u6CE8\u610F\uFF1A\u65B0\u589E\u6216\u66F4\u6539\u5BE6\u969B\u6A94\u6848\u5C07\u6703\u53EA\u6709\u5728\u6383\u63CF\u97F3\u6A02\u8CC7\u6599\u593E\u5F8C\u624D\u6703\u751F\u6548\u3002
musicfoldersettings.expunge = \u6E05\u7406\u8CC7\u6599\u5EAB
musicfoldersettings.expunge.description = Libresonic \u5132\u5B58\u4E86\u6240\u6709\u5A92\u9AD4\u6A94\u6848\u7684\u8CC7\u8A0A\u3002 \
\u6E05\u7406\u8CC7\u6599\u5EAB\u5F8C\uFF0C\u4E0D\u5728\u60A8\u7684\u5A92\u9AD4\u8CC7\u6599\u5EAB\u5167\u7684\u6A94\u6848\uFF0C\u5176\u8CC7\u8A0A\u5C07\u6C38\u4E45\u522A\u9664\u3002
musicfoldersettings.organizebyfolderstructure = \u4EE5\u8CC7\u6599\u593E\u7D50\u69CB\u6574\u7406
musicfoldersettings.organizebyfolderstructure.description = \u958B\u555F\u9019\u500B\u9078\u9805\u4F7F\u60A8\u700F\u89BD\u5A92\u9AD4\u8CC7\u6599\u5EAB\u6642\u4F7F\u7528\u539F\u4F86\u7684\u8CC7\u6599\u593E\u7D50\u69CB\uFF0C\u800C\u4E0D\u662F\u4F9D\u7167 ID3 \u6A19\u7C64\u5167\u7684\u6B4C\u624B\u8207\u5C08\u8F2F\u8CC7\u8A0A\u3002
# networkSettings.jsp
networksettings.text = \u4EE5\u4E0B\u8A2D\u5B9A\u8B93\u60A8\u900F\u904E\u7DB2\u969B\u7DB2\u8DEF\u5B58\u53D6Libresonic\u4F3A\u670D\u5668.<br> \
\u6709\u4EFB\u4F55\u554F\u984C, \u8ACB\u53C3\u8003 <a href="http://libresonic.org/pages/getting-started.jsp" target="_blank"><b>\u521D\u6B21\u4F7F\u7528</b></a>\u624B\u518A.
networksettings.portforwardingenabled = \u81EA\u52D5\u914D\u7F6E\u8DEF\u7531\u5668\u5B58\u53D6Libresonic\u4F3A\u670D\u5668 (UPnP port \u8F49\u767C).
networksettings.portforwardinghelp = \u5982\u679C\u8DEF\u7531\u7121\u6CD5\u81EA\u52D5\u914D\u7F6E\uFF0C\u8ACB\u4F7F\u7528\u624B\u52D5\u914D\u7F6E.<br> \
networksettings.text = \u4EE5\u4E0B\u8A2D\u5B9A\u8B93\u60A8\u900F\u904E\u7DB2\u969B\u7DB2\u8DEF\u5B58\u53D6Libresonic\u4F3A\u670D\u5668\u3002<br> \
\u6709\u4EFB\u4F55\u554F\u984C\uFF0C\u8ACB\u53C3\u8003 <a href="http://libresonic.org/pages/getting-started.jsp" target="_blank"><b>\u521D\u6B21\u4F7F\u7528</b></a>\u624B\u518A\u3002
networksettings.portforwardingenabled = \u81EA\u52D5\u914D\u7F6E\u8DEF\u7531\u5668\u5B58\u53D6 Libresonic \u4F3A\u670D\u5668 (UPnP port \u8F49\u767C)\u3002
networksettings.portforwardinghelp = \u5982\u679C\u8DEF\u7531\u7121\u6CD5\u81EA\u52D5\u914D\u7F6E\uFF0C\u8ACB\u4F7F\u7528\u624B\u52D5\u914D\u7F6E\u3002<br> \
\u4F9D\u7167 <a href="http://portforward.com/" target="_blank">portforward.com</a> \u7684\u8AAA\u660E<br>\
\u4F60\u5FC5\u9808\u8F49\u767CPort:{0}\u5230\u96FB\u8166\u4E0A\u904B\u884C\u7684Libresonic\u4F3A\u670D\u5668.
networksettings.urlredirectionenabled = \u7528\u7C21\u55AE\u597D\u8A18\u7684\u7DB2\u5740\u9023\u7DDA\u5230\u60A8\u7684\u4F3A\u670D\u5668.
networksettings.status = \u72C0\u614B:
\u60A8\u5FC5\u9808\u8F49\u767CPort {0}\u5230\u96FB\u8166\u4E0A\u904B\u884C\u7684Libresonic\u4F3A\u670D\u5668\u3002
networksettings.urlredirectionenabled = \u7528\u7C21\u55AE\u597D\u8A18\u7684\u7DB2\u5740\u9023\u7DDA\u5230\u60A8\u7684\u4F3A\u670D\u5668\u3002
networksettings.status = \u72C0\u614B\uFF1A
networksettings.normalurl = Use
networksettings.customurl = Use custom URL (advanced)
networksettings.urlRedirectDisabled = Feature not currently available
# transcodingSettings.jsp
transcodingsettings.name = \u8F49\u6A94\u540D\u7A31
@ -316,22 +447,23 @@ transcodingsettings.targetformat = \u8F49\u63DB\u6210
transcodingsettings.step1 = \u6B65\u9A5F\u4E00
transcodingsettings.step2 = \u6B65\u9A5F\u4E8C
transcodingsettings.step3 = \u6B65\u9A5F\u4E09
transcodingsettings.defaultactive = \u9810\u8A2D
transcodingsettings.add = \u65B0\u589E\u8F49\u78BC\u5668
transcodingsettings.noname = \u8ACB\u6307\u5B9A\u4E00\u500B\u540D\u7A31.
transcodingsettings.nosourceformat = \u8ACB\u6307\u5B9A\u8F49\u63DB\u683C\u5F0F.
transcodingsettings.notargetformat = \u8ACB\u6307\u5B9A\u8F49\u63DB\u683C\u5F0F.
transcodingsettings.nostep1 = \u8ACB\u81F3\u5C11\u6307\u5B9A\u4E00\u500B\u8F49\u63DB\u6B65\u9A5F.
transcodingsettings.info = <p class="detail">(%s = \u6A94\u6848\u5C07\u88AB\u8F49\u63DB, %b = \u64A5\u653E\u5668\u7684\u6700\u5927\u50B3\u8F38\u7387)</p> \
<p>\u8F49\u6A94\u904E\u7A0B\u662F\u7531\u4E00\u500B\u97F3\u6A02\u683C\u5F0F\u7BA1\u63DB\u6210\u53E6\u4E00\u7A2E\u683C\u5F0F. {1}\u7684\u8F49\u6A94 \
\u5F15\u64CE\u5C07\u975E\u4E32\u6D41\u683C\u5F0F\u8F49\u63DB\u6210\u4E32\u6D41. \u76F4\u63A5\u8F49\u6A94\u4E26\u4E14\u4E0D\u9700\u8981\u78C1\u789F\u904B\u4F5C<p/> \
<p>\u5BE6\u969B\u7684\u5C08\u63DB\u6771\u505A\u901A\u5E38\u662F\u900F\u904E\u7B2C\u4E09\u65B9\u8EDF\u9AD4\u4EE5\u547D\u4EE4\u5217\u65B9\u5F0F\u8F49\u63DB\uFF0C\u7A0B\u5F0F\u5B89\u88DD\u5728 {0}. </p>\
<p>\u800CWindows\u7CFB\u7D71\u7684\u8F49\u63DB\u7A0B\u5F0F\u53EF\u4EE5\u5728<a target="_blank" href="http://libresonic.org/pages/transcoding.jsp"><b>\u9019\u88E1\u627E\u5230</b></a>. \
transcodingsettings.defaultactive = \u9810\u8A2D
transcodingsettings.recommended = Recommended configuration
transcodingsettings.noname = \u8ACB\u6307\u5B9A\u4E00\u500B\u540D\u7A31\u3002
transcodingsettings.nosourceformat = \u8ACB\u6307\u5B9A\u8F49\u63DB\u7684\u4F86\u6E90\u683C\u5F0F\u3002
transcodingsettings.notargetformat = \u8ACB\u6307\u5B9A\u8F49\u63DB\u7684\u76EE\u7684\u683C\u5F0F\u3002
transcodingsettings.nostep1 = \u8ACB\u81F3\u5C11\u6307\u5B9A\u4E00\u500B\u8F49\u63DB\u6B65\u9A5F\u3002
transcodingsettings.info = <p class="detail">(%s = \u6A94\u6848\u5C07\u88AB\u8F49\u63DB\uFF0C%b = \u64A5\u653E\u5668\u7684\u6700\u5927\u50B3\u8F38\u7387\uFF0C%t = \u6A19\u984C\uFF0C%a = \u6B4C\u624B\uFF0C%l = \u5C08\u8F2F)</p> \
<p>\u8F49\u6A94\u904E\u7A0B\u662F\u7531\u4E00\u500B\u97F3\u6A02\u683C\u5F0F\u8F49\u63DB\u6210\u53E6\u4E00\u7A2E\u683C\u5F0F\u3002{1}\u7684\u8F49\u6A94 \
\u5F15\u64CE\u5C07\u975E\u4E32\u6D41\u683C\u5F0F\u8F49\u63DB\u6210\u4E32\u6D41\u3002\u76F4\u63A5\u8F49\u6A94\u4E26\u4E14\u4E0D\u9700\u8981\u78C1\u789F\u904B\u4F5C<p/> \
<p>\u5BE6\u969B\u7684\u8F49\u63DB\u52D5\u4F5C\u901A\u5E38\u662F\u900F\u904E\u7B2C\u4E09\u65B9\u8EDF\u9AD4\u4EE5\u547D\u4EE4\u5217\u65B9\u5F0F\u8F49\u63DB\uFF0C\u7A0B\u5F0F\u5B89\u88DD\u5728 {0}\u3002</p>\
<p>\u800CWindows\u7CFB\u7D71\u7684\u8F49\u63DB\u7A0B\u5F0F\u53EF\u4EE5\u5728<a target="_blank" href="http://libresonic.org/pages/transcoding.jsp"><b>\u9019\u88E1\u627E\u5230</b></a>\u3002 \
\u60A8\u4E5F\u80FD\u4EE5\u81EA\u5B9A\u7684\u8F49\u63DB\uFF0C\u53EA\u8981\u6EFF\u8DB3\u4E0B\u9762\u8981\u6C42\uFF1A\
<ul> \
<li>\u5FC5\u9808\u4EE5\u4E00\u500B\u547D\u4EE4\u884C\u6307\u4EE4\u754C\u9762.</li> \
<li>\u5FC5\u9808\u80FD\u5920\u5C07\u8F38\u51FA\u767C\u9001\u5230\u6A19\u6E96\u8F38\u51FA(Stdout).</li> \
<li>\u5982\u679C\u4F7F\u7528\u6B65\u9A5F2\u62163\uFF0C\u5B83\u5FC5\u9808\u80FD\u5920\u5F9E\u6A19\u6E96\u8F38\u5165(Stdin)\u8B80\u53D6.</li> \
<li>\u5FC5\u9808\u6709\u547D\u4EE4\u5217\u754C\u9762\u3002</li> \
<li>\u5FC5\u9808\u80FD\u5920\u5C07\u7D50\u679C\u9001\u5230\u6A19\u6E96\u8F38\u51FA(Stdout)\u3002</li> \
<li>\u5982\u679C\u5728\u6B65\u9A5F2\u4F7F\u7528\uFF0C\u5B83\u5FC5\u9808\u80FD\u5920\u5F9E\u6A19\u6E96\u8F38\u5165(Stdin)\u8B80\u53D6\u3002</li> \
</ul> \
</p> \
<p> \u8ACB\u6CE8\u610F\uFF0C\u8F49\u63DB\u7684\u7A0B\u5E8F\u7684\u7531\u64A5\u653E\u5668\u8A2D\u5B9A\u4E2D\u52FE\u9078\u3002\u5982\u679C"\u9810\u8A2D"\u662F\u5DF2\u52FE\u9078\u7684\uFF0C\u90A3\u9EBC\u8F49\u63DB\u6703\u81EA\u52D5\u5728\u65B0\u64AD\u653E\u5668\u4E2D\u4F7F\u7528\u3002</p>
@ -363,35 +495,60 @@ podcastsettings.interval.weekly = \u6BCF\u9031
podcastsettings.folder = \u5132\u5B58\u64AD\u5BA2\u5728
# playerSettings.jsp
playersettings.noplayers = \u6C92\u6709\u64A5\u653E\u5668.
playersettings.noplayers = \u6C92\u6709\u64A5\u653E\u5668\u3002
playersettings.type = \u5F62\u614B
playersettings.lastseen = \u4E0A\u6B21\u767B\u5165
playersettings.title = \u9078\u64C7\u64A5\u653E\u5668
playersettings.technology.web.title = \u7DB2\u9801\u64AD\u653E
playersettings.technology.external.title = \u76F4\u63A5\u7528\u5916\u90E8\u64AD\u653E\u5668\u64AD\u653E
playersettings.technology.external_with_playlist.title = \u4EE5\u9EDE\u64AD\u6E05\u55AE\u5728\u5916\u90E8\u64A5\u653E\u5668\u64AD\u653E
playersettings.technology.external_with_playlist.title = \u4EE5\u64AD\u653E\u6E05\u55AE\u5728\u5916\u90E8\u64A5\u653E\u5668\u64AD\u653E
playersettings.technology.jukebox.title = \u9EDE\u64AD\u6A5F\u6A21\u5F0F
playersettings.technology.web.text = \u76F4\u63A5\u5728\u7DB2\u9801\u4E2D\u7684Flash\u64AD\u653E\u5668\u64AD\u653E.
playersettings.technology.external.text = \u5728\u60A8\u5E38\u7528\u7684\u64A5\u653E\u5668\u4E2D\u64AD\u653E\uFF0C\u4F8B\u5982:WinAmp\u3001Windows Media Player\u3001iTunes.
playersettings.technology.external_with_playlist.text = \u5982\u540C\u4E0A\u9762\u7684\u9078\u9805\uFF0C\u4F46\u662F\u9EDE\u64AD\u6E05\u55AE\u7531\u5BA2\u6236\u7AEF\u7BA1\u7406\uFF0C\u800C\u4E0D\u662F\u4F3A\u670D\u5668<br>\
\u56E0\u6B64\u53EF\u80FD\u7684\u60C5\u6CC1\u4E0B\u53EF\u4EE5\u76F4\u63A5\u8DF3\u807D\u4E0B\u4E00\u9996\u6B4C\u66F2\u3002
playersettings.technology.jukebox.text = \u76F4\u63A5\u5728Libresonic\u4F3A\u670D\u5668\u4E2D\u64AD\u653E. (\u9650\u5DF2\u6388\u6B0A\u7684\u7528\u6236).
playersettings.technology.external_with_playlist.text = \u5982\u540C\u4E0A\u9762\u7684\u9078\u9805\uFF0C\u4F46\u662F\u64AD\u653E\u6E05\u55AE\u7531\u5BA2\u6236\u7AEF\u7BA1\u7406\uFF0C\u800C\u4E0D\u662F\u4F3A\u670D\u5668\u3002 \
\u5728\u9019\u500B\u6A21\u5F0F\u4E2D\u53EF\u4EE5\u8DF3\u8457\u64AD\u653E\u3002
playersettings.technology.jukebox.text = \u76F4\u63A5\u5728Libresonic\u4F3A\u670D\u5668\u4E2D\u64AD\u653E\u3002(\u9650\u5DF2\u6388\u6B0A\u7684\u7528\u6236\u3002)
playersettings.name = \u64A5\u653E\u5668\u540D\u7A31
playersettings.coverartsize = \u5C08\u8F2F\u5C01\u9762\u5927\u5C0F
playersettings.maxbitrate = \u6700\u5927\u50B3\u8F38\u7387
playersettings.coverart.off = \u4E0D\u986F\u793A
playersettings.coverart.small = \u5C0F
playersettings.coverart.medium = \u4E2D
playersettings.coverart.large = \u5927
playersettings.notranscoder = <em>\u6CE8\u610F:</em> ffmpeg \u5C1A\u672A\u5B89\u88DD.<br>\u9EDE\u64CA\u3010\u5354\u52A9\u3011.
playersettings.notranscoder = <em>\u6CE8\u610F:</em> \u8F49\u78BC\u5F15\u64CE\u5C1A\u672A\u5B89\u88DD\u3002<br>\u9EDE\u9078\u3010\u8AAA\u660E\u3011\u7372\u5F97\u66F4\u591A\u8CC7\u8A0A\u3002
playersettings.autocontrol = \u81EA\u52D5\u64AD\u653E
playersettings.m3ubom = \u70ba\u7522\u751f\u7684M3U\u6a94\u6848\u589e\u52a0BOM\u6a19\u8a18
playersettings.dynamicip = \u64A5\u653E\u5668\u4F7F\u7528\u52D5\u614BIP\u4F4D\u5740
playersettings.transcodings = \u555F\u52D5\u7684\u8F49\u78BC\u7A0B\u5F0F
playersettings.ok = \u5132\u5B58
playersettings.forget = \u522A\u9664\u64A5\u653E\u5668
playersettings.clone = \u8907\u88FD\u64A5\u653E\u5668
dlnasettings.enabled = Enable DLNA server
dlnasettings.description = Use this option to turn on the DLNA/UPnP Media Server in Libresonic, \
and stream your media to compatible DLNA players.
dlnasettings.servername = Media Server name
dlnasettings.servername.description = The name of the Media Server as it will appear in DLNA players.
sonossettings.enabled = Enable Sonos music service
sonossettings.description = Use this option to turn on the Sonos music service in Libresonic, \
and stream your media to Sonos devices on your local network. Remember to add Libresonic \
as a music service from your Sonos controller. Visit \
<a href="http://sonos.libresonic.org" target="_blank">sonos.libresonic.org</a> for more info. \
For trouble-shooting, please see the <a href="help.view">log</a>.
sonossettings.servicename = Music service name
sonossettings.servicename.description = The name of the music service as it will appear in the Sonos controller.
# shareSettings.jsp
sharesettings.name = Name
sharesettings.owner = Shared by
sharesettings.description = Description
sharesettings.visits = Visits
sharesettings.lastvisited = Last visited
sharesettings.expires = Expires
sharesettings.files = Shared files
sharesettings.expirein = Expire in
sharesettings.expirein.week = 1w
sharesettings.expirein.month = 1m
sharesettings.expirein.year = 1y
sharesettings.expirein.never = never
sharesettings.deleteexpired = Delete all expired
# userSettings.jsp
usersettings.title = \u9078\u64C7\u4F7F\u7528\u8005
usersettings.newuser = \u65B0\u4F7F\u7528\u8005
@ -401,52 +558,67 @@ usersettings.stream = \u53EF\u4EE5\u64AD\u653E\u6A94\u6848
usersettings.jukebox = \u53EF\u4EE5\u7528\u9EDE\u64A5\u6A5F\u6A21\u5F0F
usersettings.download = \u53EF\u4EE5\u4E0B\u8F09\u6A94\u6848
usersettings.upload = \u53EF\u4EE5\u4E0A\u50B3\u6A94\u6848
usersettings.share = \u53EF\u4EE5\u8207\u4EFB\u4F55\u4EBA\u5206\u4EAB\u6A94\u6848
usersettings.coverart = \u53EF\u4EE5\u66F4\u63DB\u5C08\u8F2F\u5C01\u9762\u53CA\u6A19\u7C64
usersettings.comment= \u53EF\u4EE5\u5EFA\u7ACB\u6216\u7DE8\u8F2F\u8A55\u8AD6\u53CA\u8A55\u5206
usersettings.podcast= \u53EF\u4EE5\u7BA1\u7406\u64AD\u5BA2
usersettings.folderaccess = \u53EF\u4EE5\u5B58\u53D6\u9019\u4E9B\u5A92\u9AD4\u8CC7\u6599\u593E
usersettings.username = \u4F7F\u7528\u8005
usersettings.email = Email
usersettings.changepassword = \u8B8A\u66F4\u5BC6\u78BC
usersettings.password = \u5BC6\u78BC
usersettings.newpassword = \u65B0\u5BC6\u78BC
usersettings.confirmpassword = \u518D\u6B21\u78BA\u8A8D\u5BC6\u78BC
usersettings.delete = \u522A\u9664\u4F7F\u7528\u8005
usersettings.ldap = \u5728LDAP\u9A57\u8B49\u7528\u6236
usersettings.nousername = \u7F3A\u5C11\u4F7F\u7528\u8005\u540D\u7A31.
usersettings.useralreadyexists = \u4F7F\u7528\u8005\u540D\u7A31\u5DF2\u7D93\u88AB\u4F7F\u7528\u4E86\uFF01.
usersettings.nopassword = \u5FC5\u9808\u8A2D\u5B9A\u5BC6\u78BC.
usersettings.wrongpassword = \u5169\u6B21\u8F38\u5165\u5BC6\u78BC\u4E0D\u540C.
usersettings.ldapdisabled = LDAP\u9A57\u8B49\u6C92\u6709\u555F\u52D5. \u8ACB\u5148\u5230\u9032\u968E\u8A2D\u5B9A.
usersettings.passwordnotsupportedforldap = \u7121\u6CD5\u8A2D\u5B9A\u6216\u8B8A\u66F4LDAP\u9A57\u8B49\u7528\u6236\u7684\u5BC6\u78BC.
usersettings.ok = \u4F7F\u7528\u8005 {0}\u7684\u5BC6\u78BC\u5DF2\u7D93\u8B8A\u66F4.
# musicFolderSettings.jsp
musicfoldersettings.interval.never = \u5F9E\u4E0D
musicfoldersettings.interval.one = \u6BCF\u5929
musicfoldersettings.interval.many = \u6BCF\u9694 {0} \u5929
musicfoldersettings.hour = \u5728 {0}:00
usersettings.nousername = \u7F3A\u5C11\u4F7F\u7528\u8005\u540D\u7A31\u3002
usersettings.noemail= \u4E0D\u5408\u6CD5\u7684 email \u4F4D\u5740\u3002
usersettings.useralreadyexists = \u5E33\u865F\u540D\u7A31\u5DF2\u7D93\u88AB\u4F7F\u7528\u4E86\u3002
usersettings.nopassword = \u5FC5\u9808\u8A2D\u5B9A\u5BC6\u78BC\u3002
usersettings.wrongpassword = \u5169\u6B21\u8F38\u5165\u5BC6\u78BC\u4E0D\u540C\u3002
usersettings.ldapdisabled = LDAP\u9A57\u8B49\u6C92\u6709\u555F\u52D5\u3002\u8ACB\u5230\u9032\u968E\u8A2D\u5B9A\u3002
usersettings.passwordnotsupportedforldap = \u7121\u6CD5\u8A2D\u5B9A\u6216\u8B8A\u66F4 LDAP \u9A57\u8B49\u7528\u6236\u7684\u5BC6\u78BC\u3002
usersettings.ok = \u4F7F\u7528\u8005 {0} \u7684\u5BC6\u78BC\u5DF2\u7D93\u8B8A\u66F4\u3002
# main.jsp
main.up = \u4E0A\u4E00\u9801
main.playall = \u5168\u90E8\u64AD\u653E
main.playrandom = \u96A8\u8208\u64AD\u653E
main.addall = \u5168\u90E8\u52A0\u5230\u9EDE\u64AD\u6E05\u55AE\u4E2D
main.addall = \u5168\u90E8\u52A0\u5230\u64AD\u653E\u6E05\u55AE\u4E2D
main.downloadall = \u5168\u90E8\u4E0B\u8F09
main.tags = \u7DE8\u8F2F\u6A19\u7C64
main.playcount = \u9EDE\u64AD {0} \u6B21.
main.lastplayed =\u4E0A\u6B21\u9EDE\u64AD\u5728 {0}.
main.playcount = \u64AD\u653E {0} \u6B21\u3002
main.lastplayed =\u4E0A\u6B21\u64AD\u653E\u5728 {0} \u3002
main.comment = \u8A55\u8AD6
main.wiki = <table class="detail">\
<tr><td style="padding-right:1em">__text__</td><td>Bold text </td><td style="padding-left:3em;padding-right:1em">\\\\ </td><td>Line break</td></tr>\
<tr><td style="padding-right:1em">~~text~~</td><td>Italic text </td><td style="padding-left:3em;padding-right:1em">(empty line) </td><td>New paragraph</td></tr>\
<tr><td style="padding-right:1em">* text </td><td>List item </td><td style="padding-left:3em;padding-right:1em">http://foo.com/ </td><td>Link</td></tr>\
<tr><td style="padding-right:1em">1. text </td><td>Enumerated list item</td><td style="padding-left:3em;padding-right:1em">{link:Foo|http://foo.com}</td><td>Named link</td></tr>\
<tr><td style="padding-right:1em">__text__</td><td>\u7C97\u9AD4 </td><td style="padding-left:3em;padding-right:1em">\\\\ </td><td>\u63DB\u884C</td></tr>\
<tr><td style="padding-right:1em">~~text~~</td><td>\u659C\u9AD4 </td><td style="padding-left:3em;padding-right:1em">(empty line) </td><td>\u65B0\u6BB5\u843D</td></tr>\
<tr><td style="padding-right:1em">* text </td><td>\u6E05\u55AE </td><td style="padding-left:3em;padding-right:1em">http://foo.com/ </td><td>\u934A\u7D50</td></tr>\
<tr><td style="padding-right:1em">1. text </td><td>\u5217\u8209\u6E05\u55AE</td><td style="padding-left:3em;padding-right:1em">{link:Foo|http://foo.com}</td><td>\u5DF2\u547D\u540D\u934A\u7D50</td></tr>\
</table>
main.sharealbum = \u5206\u4EAB
main.more = \u66F4\u591A\u52D5\u4F5C\u2026
main.more.selection = \u9078\u64C7\u6B4C\u66F2\u2026
main.more.share = \u5206\u4EAB
main.premium = <a href="{0}" style="text-decoration:underline">\u53D6\u5F97 Subsonic Premium</a><br>(\u4E26\u522A\u9664\u6B64\u5EE3\u544A)
main.nowplaying =\u76EE\u524D\u64A5\u653E
main.lyrics = \u6B4C\u8A5E
main.minutesago = \u5206\u9418\u524D
main.chat = \u4EA4\u8AC7
main.scanning = \u6383\u63CF\u6A94\u6848\uFF1A
main.message = \u5BEB\u5728\u9019\u88E1
main.clearchat = \u6E05\u9664
main.addtoplaylist.title = \u589E\u52A0\u81F3\u64AD\u653E\u6E05\u55AE
main.addtoplaylist.text = \u589E\u52A0\u5DF2\u9078\u64C7\u7684\u6B4C\u66F2\u81F3\u6B64\u64AD\u653E\u6E05\u55AE\uFF1A
main.addnext = \u52A0\u5230\u4E0B\u4E00\u9996
main.addlast = \u52A0\u5230\u6700\u5F8C\u4E00\u9996
main.addnext.toast = \u6B64\u6B4C\u66F2\u5C07\u6703\u65BC\u4E0B\u4E00\u9996\u6642\u64AD\u653E
main.addlast.toast = \u6B64\u6B4C\u66F2\u5C07\u6703\u65BC\u6700\u5F8C\u4E00\u9996\u6642\u64AD\u653E
main.similarartists = \u76F8\u4F3C\u7684\u6B4C\u624B
main.startradio = Start radio
main.playtopsongs = \u64AD\u653E\u6392\u884C\u699C\u6B4C\u66F2
main.showall = \u986F\u793A\u6240\u6709\u5C08\u8F2F
main.topsongs = \u6392\u884C\u699C\u6B4C\u66F2
# rating.jsp
rating.rating = \u7B49\u7D1A
@ -457,17 +629,18 @@ coverart.change = \u8B8A\u66F4
coverart.zoom = \u653E\u5927
# allmusic.jsp
allmusic.text = \u5728 allmusic.com \u641C\u5C0B\u5C08\u8F2F <em>{0}</em> - \u8ACB\u7A0D\u5019.
allmusic.text = \u5728 allmusic.com \u641C\u5C0B\u5C08\u8F2F <em>{0}</em> - \u8ACB\u7A0D\u5019\u3002
# changeCoverArt.jsp
changecoverart.title = \u8B8A\u66F4\u5C08\u8F2F\u5C01\u9762
changecoverart.address = \u6216\u662F\u8F38\u5165\u5716\u5F62\u7684\u4F4D\u5740
changecoverart.artist = \u6B4C\u624B
changecoverart.album = \u5C08\u8F2F
changecoverart.wait = \u8ACB\u7A0D\u5019...
changecoverart.success = \u5716\u5F62\u4E0B\u8F09\u6210\u529F.
changecoverart.error = \u7121\u6CD5\u4E0B\u8F09\u5716\u5F62.
changecoverart.noimagesfound = \u627E\u4E0D\u5230\u5716\u5F62\u6A94.
changecoverart.search = Google \u5716\u7247\u641C\u5C0B
changecoverart.wait = \u8ACB\u7A0D\u5019\u2026
changecoverart.success = \u5716\u7247\u4E0B\u8F09\u6210\u529F\u3002
changecoverart.error = \u7121\u6CD5\u4E0B\u8F09\u5716\u7247\u3002
changecoverart.noimagesfound = \u627E\u4E0D\u5230\u5716\u7247\u3002
# changeCoverArtConfirm.jsp
changeCoverArtConfirm.failed = \u7121\u6CD5\u4FEE\u6539\u5C08\u8F2F\u5C01\u9762:<br><b>"{0}"</b>
@ -492,8 +665,48 @@ edittags.updated = Updated
edittags.skipped = \u7565\u904E
edittags.error = \u932F\u8AA4
# share.jsp
share.title = Share
share.warning = <h2>IMPORTANT NOTICE!</h2><p>Play fair &ndash; Don't share copyrighted material in any manner that violates the law.</p>
share.facebook = \u5206\u4EAB\u81F3 Facebook
share.twitter = \u5206\u4EAB\u81F3 Twitter
share.googleplus = \u5206\u4EAB\u81F3 Google+
share.link = Or share this with someone by sending them this link: <a href="{0}" target="_blank">{0}</a>
share.disabled = To share your music with someone you must first register your own <em>libresonic.org</em> address.<br> \
Please go to <a href="networkSettings.view"><b>Settings &gt; Network</b></a> (administrative rights required).
share.manage = Manage my shared media
# premium.jsp
premium.title = Subsonic Premium
premium.invalidlicense = Invalid license key.
premium.text = <p>Upgrade to <a href="http://premium.libresonic.org/" target="_blank">Subsonic Premium</a> to enjoy these extra features:</p> \
<ul> \
<li><a href="http://libresonic.org/pages/apps.jsp" target="_blank">Apps</a> for Android, iPhone, Windows Phone, Mac, Chrome and more*.</li> \
<li>Video streaming.</li> \
<li>Stream to your Chromecast and Sonos devices.</li> \
<li>Podcast receiver.</li> \
<li>Your personal server address: <em>yourname</em>.libresonic.org (see <a href="networkSettings.view">Settings &gt; Network</a>).</li> \
<li>Play your media on compatible DLNA/UPnP devices.</li> \
<li>Share your media on Facebook, Twitter, Google+.</li> \
<li>No ads in the web interface.</li> \
<li>Other features to be released later.</li> \
</ul> \
<p style="font-size:10px;">* Some apps must be purchased separately.</p>
premium.getpremium = \u53D6\u5F97 Subsonic Premium
premium.licensed = You have a valid Subsonic Premium license!
premium.licensedexpires = Your Subsonic Premium license is valid until {0}
premium.licensedexpired = Your Subsonic Premium license expired {0}
premium.licensedto = The license is registered to {0}.
premium.forcechange = Register a different license key
premium.register = When upgrading to Subsonic Premium you receive a license key by email. Please register it below.
premium.resend = Lost the license key? <a href="http://libresonic.org/backend/requestLicense.view" target="_blank">Send it again</a>.
premium.register.email = Email
premium.register.license = License&nbsp;key
# podcastReceiver.jsp
podcastreceiver.title = \u64AD\u5BA2\u63A5\u6536\u5668
podcastreceiver.empty = You haven't subscribed to any podcasts yet.
podcastreceiver.episodes = {0} \u7AE0\u7BC0
podcastreceiver.expandall = \u986F\u793A\u6536\u85CF\u96C6
podcastreceiver.collapseall = \u96B1\u85CF\u6536\u85CF\u96C6
podcastreceiver.status.new = \u65B0\u7684
@ -509,78 +722,86 @@ podcastreceiver.check = \u6838\u5C0D\u65B0\u7684\u6536\u85CF\u96C6
podcastreceiver.refresh = \u5237\u65B0\u672C\u9801
podcastreceiver.settings = \u64AD\u5BA2\u8A2D\u5B9A
podcastreceiver.subscribe = \u8A02\u95B1\u64AD\u5BA2
podcastreceiver.newestepisodes = \u6700\u65B0\u7AE0\u7BC0
# lyrics.jsp
lyrics.title = \u6B4C\u8A5E
lyrics.artist = \u6B4C\u624B
lyrics.song = \u6B4C\u66F2
lyrics.search = \u641C\u5C0B
lyrics.wait = \u641C\u5C0B\u6B4C\u8A5E\u4E2D, \u8ACB\u7A0D\u5019...
lyrics.wait = \u641C\u5C0B\u6B4C\u8A5E\u4E2D\uFF0C\u8ACB\u7A0D\u5019\u2026
lyrics.courtesy = (\u6B4C\u8A5E\u7531<a href="http://www.chartlyrics.com/" target="_blank">chartlyrics.com</a>\u63D0\u4F9B)
lyrics.nolyricsfound = \u627E\u4E0D\u5230\u6B4C\u8A5E.
lyrics.nolyricsfound = \u627E\u4E0D\u5230\u6B4C\u8A5E\u3002
lyrics.trylater = Sorry, the lyrics search engine allows just one search every 20 seconds. Try again later.
# helpPopup.jsp
helppopup.title = {0} \u5354\u52A9
helppopup.cover.title = \u5C08\u8F2F\u5C01\u9762\u5927\u5C0F
helppopup.cover.text = <p>\u7531\u60A8\u6307\u5B9A\u986F\u793A\u5C08\u8F2F\u5C01\u9762\u7684\u5927\u5C0F\uFF0C\u4E5F\u53EF\u4EE5\u5B8C\u5168\u95DC\u9589.</p>
helppopup.transcode.title = \u6700\u5927\u50B3\u8F38\u7387
helppopup.transcode.text = <p>\u5982\u679C\u60A8\u7684\u64AD\u653E\u983B\u5BEC\u6709\u9650\uFF0C\u53EF\u4EE5\u904E\u8A2D\u5B9A\u6700\u5927\u50B3\u8F38\u7387\u4F86\u6539\u5584. \
\u4F8B\u5982,\u5982\u679Cmp3\u539F\u672C\u7684\u58D3\u7E2E\u6BD4\u4F8B\u70BA256Kbps(kilobits per second), \u5982\u679C\u8A2D\u5B9A\u6700\u5927\u50B3\u8F38\u7387\u70BA128\
\u6703\u4F7F{0}\u81EA\u52D5\u5C07\u539F\u672C 256Kbps\u7684\u97F3\u6A02\u8ABF\u964D\u6210 128 Kbps.</p>
helppopup.playlistfolder.title = \u9EDE\u64AD\u6E05\u55AE\u8CC7\u6599\u593E
helppopup.playlistfolder.text = <p>\u5B58\u653E\u9EDE\u64AD\u6E05\u55AE\u7684\u8CC7\u6599\u593E.</p>
helppopup.transcode.text = <p>\u5982\u679C\u60A8\u7684\u64AD\u653E\u983B\u5BEC\u6709\u9650\uFF0C\u53EF\u4EE5\u904E\u8A2D\u5B9A\u6700\u5927\u50B3\u8F38\u7387\u4F86\u6539\u5584\u3002 \
\u4F8B\u5982\uFF0C\u5982\u679C\u60A8\u539F\u672C\u7684 mp3 \u6A94\u6848\u7684\u7DE8\u78BC\u7387\u70BA 256Kbps(\u6BCF\u79D2\u5343\u4F4D\u5143)\uFF0C\u5982\u679C\u8A2D\u5B9A\u6700\u5927\u50B3\u8F38\u7387\u70BA128\
\u6703\u4F7F {0} \u81EA\u52D5\u5C07\u539F\u672C 256Kbps \u7684\u97F3\u6A02\u7DE8\u78BC\u70BA\u6210 128 Kbps\u3002</p>
helppopup.playlistfolder.title = \u64AD\u653E\u6E05\u55AE\u8CC7\u6599\u593E
helppopup.playlistfolder.text = <p>\u5B58\u653E\u64AD\u653E\u6E05\u55AE\u7684\u8CC7\u6599\u593E\u3002</p>
helppopup.musicmask.title = \u97F3\u6A02\u7684\u9644\u5C6C\u6A94\u540D
helppopup.musicmask.text = <p>\u6307\u5B9A\u97F3\u6A02\u6A94\u6848\u7684\u9644\u5C6C\u6A94\u540D</p>
helppopup.videomask.title = \u8996\u8A0A\u6A94\u7684\u9644\u5C6C\u6A94\u540D
helppopup.videomask.text = <p>\u6307\u5B9A\u8996\u8A0A\u6A94\u6848\u7684\u8CA0\u6578\u6A94\u540D</p>
helppopup.coverartmask.title = \u5C08\u8F2F\u5C01\u9762\u9644\u5C6C\u6A94\u540D
helppopup.coverartmask.text = <p>\u8207\u97F3\u6A02\u593E\u653E\u5728\u4E00\u8D77\u7684\u5C08\u8F2F\u5C01\u9762\uFF0C\u5148\u6307\u5B9A\u5C08\u8F2F\u5C01\u9762\u6A94\u6848\u7684\u9644\u5C6C\u6A94\u540D.</p>
helppopup.coverartmask.text = <p>\u8207\u97F3\u6A02\u8CC7\u6599\u593E\u653E\u5728\u4E00\u8D77\u7684\u5C08\u8F2F\u5C01\u9762\uFF0C\u5148\u6307\u5B9A\u5C08\u8F2F\u5C01\u9762\u6A94\u6848\u7684\u9644\u5C6C\u6A94\u540D\u3002</p>
helppopup.downsamplecommand.title = \u964D\u983B\u6307\u4EE4
helppopup.downsamplecommand.text = <p>\u8B93\u60A8\u8A2D\u5B9A\u8ABF\u964D\u64AD\u653E\u97F3\u6A02\u6642\u964D\u4F4E\u53D6\u6A23\u983B\u7387\u7684\u6307\u4EE4.</p>\
<p>(%s = \u8981\u964D\u983B\u7684\u6A94\u6848, %b = \u64A5\u653E\u5668\u7684\u6700\u5927\u50B3\u8F38\u7387)</p>
helppopup.downsamplecommand.text = <p>\u8B93\u60A8\u8A2D\u5B9A\u8ABF\u964D\u64AD\u653E\u97F3\u6A02\u6642\u964D\u4F4E\u53D6\u6A23\u983B\u7387\u7684\u6307\u4EE4\u3002</p>\
<p>(%s = \u8981\u964D\u983B\u7684\u6A94\u6848\uFF0C%b = \u64A5\u653E\u5668\u7684\u6700\u5927\u50B3\u8F38\u7387\uFF0C%t = \u6A19\u984C\uFF0C%a = \u6B4C\u624B\uFF0C%l = \u5C08\u8F2F)</p>
helppopup.hlscommand.title = HTTP Live Streaming command
helppopup.hlscommand.text = <p>The command used to create video segments for Apple''s HLS (HTTP Live Streaming) protocol.</p>
helppopup.index.title = \u5206\u985E\u6AA2\u7D22
helppopup.index.text = <p>\u8A2D\u5B9A\u97F3\u6A02\u6AA2\u7D22\u7684\u65B9\u5F0F\uFF0C\uFF08\u5C31\u5982\u540C\u73FE\u5728\u5728\u87A2\u5E55\u5DE6\u4E0A\u65B9\u7684\u5206\u985E\uFF09. \u5728\u97F3\u6A02\u593E\u88E1\u7684\u6A94\u6848\u5F88\u5BB9\u6613\u5206\u985E\u6AA2\u7D22</p> \
<p>\u901A\u5E38\u4EE5\u7A7A\u767D\u4F86\u5206\u9694\u6AA2\u7D22\u9805\u76EE. \u4E00\u822C\u4F86\u8AAA\uFF0C\u4E00\u500B\u5B57\u6BCD\uFF08\u570B\u5B57\uFF09\u70BA\u4E00\u500B\u9805\u76EE, \
\u4F46\u4E5F\u53EF\u4EE5\u591A\u500B\u5B57\u6BCD\uFF08\u570B\u5B57\uFF09\u653E\u5728\u540C\u4E00\u5206\u985E\u9805\u76EE\u4E2D. \u4F8B\u5982\uFF1A\u3105(\u5305\u9B91),\u53EF\u4EE5\u5C07 <em>\u5305\u9B91</em>\u8996\u70BA\u540C\u4E00\u5206\u985E\
<p>\u800C\u7121\u6CD5\u6B78\u985E\u7684\u6A94\u6848\uFF0C\u5C07\u5168\u90E8\u6B78\u65BC "#"\u9805\u76EE\u4E2D.</p>
helppopup.index.text = <p>\u8A2D\u5B9A\u97F3\u6A02\u7D22\u5F15(\u5728\u87A2\u5E55\u5DE6\u65B9)\u6B78\u985E\u7684\u65B9\u5F0F\u3002\u5728\u97F3\u6A02\u8CC7\u6599\u593E\u88E1\u7684 \
\u6A94\u6848\u5F88\u5BB9\u6613\u900F\u904E\u7D22\u5F15\u5B58\u53D6\u3002</p> \
<p>\u5B9A\u7FA9\u65B9\u5F0F\u662F\u4EE5\u7A7A\u767D\u5206\u9694\u7684\u7D22\u5F15\u9805\u76EE\u3002\u4E00\u822C\u4F86\u8AAA\uFF0C\u9805\u76EE\u662F\u55AE\u4E00\u5B57\u6BCD\uFF0C \
\u4F46\u60A8\u4E5F\u53EF\u4EE5\u6307\u5B9A\u591A\u500B\u5B57\u6BCD\u3002\u4F8B\u5982\uFF1A\u9805\u76EE The \u6703\u9023\u7D50\u5230\u6240\u6709 \
\u958B\u982D\u70BA "The" \u7684\u8CC7\u6599\u593E\u8207\u6A94\u6848\u3002</p> \
<p>\u60A8\u4E5F\u53EF\u4EE5\u7528\u62EC\u5F27\u4F86\u5305\u542B\u591A\u500B\u7D22\u5F15\u5B57\u5143\u3002\u4F8B\u5982\uFF1A \
<em>A-E(ABCDE)</em> \u6703\u986F\u793A\u70BA <em>A-E</em> \u4E26\u9023\u7D50\u5230\u6240\u6709\u958B\u982D\u70BA \
A\u3001B\u3001C\u3001D\u6216E\u7684\u8CC7\u6599\u593E\u8207\u6A94\u6848\u3002\u9019\u5C0D\u65BC\u6536\u7D0D\u5C11\u898B\u7684\u5B57\u5143(\u50CF\u662FX\u3001Y\u8207Z)\u5F88\u6709\u5E6B\u52A9\uFF0C\u6216 \
\u6B78\u985E\u91CD\u97F3\u5B57\u5143(\u5982A\u3001\u00C0\u8207\u00C1)</p> \
<p>\u7121\u6CD5\u6B78\u985E\u7684\u8CC7\u6599\u593E\u8207\u6A94\u6848\uFF0C\u5C07\u5168\u90E8\u6B78\u65BC "#" \u9805\u76EE\u4E2D\u3002</p>
helppopup.ignoredarticles.title = \u5FFD\u7565\u5B57\u9996
helppopup.ignoredarticles.text = <p>\u6709\u4E9B\u5B57\u9996(\u4F8B\u5982"The") \u901A\u5E38\u5728\u66F2\u76EE\u6B78\u985E\u4E2D\u61C9\u8A72\u5FFD\u7565\uFF0C\u8ACB\u5728\u6B64\u8655\u8A2D\u5B9A.</p>
helppopup.ignoredarticles.text = <p>\u6709\u4E9B\u5B57\u9996(\u4F8B\u5982"The") \u901A\u5E38\u5728\u66F2\u76EE\u6B78\u985E\u4E2D\u61C9\u8A72\u5FFD\u7565\uFF0C\u8ACB\u5728\u6B64\u8655\u8A2D\u5B9A\u3002</p>
helppopup.shortcuts.title = \u6377\u5F91
helppopup.shortcuts.text = <p>\u4EE5\u7A7A\u767D\u4F86\u5206\u9694\u5728\u6700\u4E0A\u5C64\u76EE\u9304\u4E2D\u5EFA\u7ACB\u6377\u5F91\u6AA2\u7D22. \u7528\u5F15\u865F\u4F86\u5206\u7D44\u5B57\u5143, \u4F8B\u5982:</p> \
helppopup.shortcuts.text = <p>\u4EE5\u7A7A\u767D\u4F86\u5206\u9694\u5728\u6700\u4E0A\u5C64\u76EE\u9304\u4E2D\u5EFA\u7ACB\u6377\u5F91\u6AA2\u7D22\u3002\u7528\u5F15\u865F\u4F86\u5206\u7D44\u5B57\u5143\uFF0C\u4F8B\u5982\uFF1A</p> \
<p><em>New Incoming "Sound tracks"</em></p>
helppopup.language.title = Language
helppopup.language.text = <p>\u5728\u9019\u88E1\u9078\u64C7\u6240\u63D0\u4F9B\u7684\u986F\u793A\u8A9E\u8A00.</p>
helppopup.language.title = \u8A9E\u8A00
helppopup.language.text = <p>\u5728\u9019\u88E1\u9078\u64C7\u6240\u63D0\u4F9B\u7684\u986F\u793A\u8A9E\u8A00\u3002</p>
helppopup.visibility.title = \u986F\u793A\u9805\u76EE
helppopup.visibility.text = <p>\u9078\u64C7\u5728\u700F\u89BD\u6216\u662F\u5728\u9EDE\u64AD\u6E05\u55AE\u4E2D\uFF0C\u986F\u793A\u97F3\u6A02\u7684\u5404\u7A2E\u8A73\u7D30\u8CC7\u8A0A</p>
helppopup.visibility.text = <p>\u9078\u64C7\u5728\u700F\u89BD\u6216\u662F\u5728\u64AD\u653E\u6E05\u55AE\u4E2D\uFF0C\u986F\u793A\u97F3\u6A02\u7684\u5404\u7A2E\u8A73\u7D30\u8CC7\u8A0A</p>
helppopup.partymode.title = \u5BB4\u6703\u6A21\u5F0F
helppopup.partymode.text = <p>\u4F7F\u7528\u5BB4\u6703\u6A21\u5F0F\u7C21\u5316\u4F7F\u7528\u8005\u754C\u9762\uFF0C\u63D0\u4F9B\u7D66\u7121\u7D93\u9A57\u7684\u4F7F\u7528\u8005\u64CD\u4F5C\
\u4E5F\u53EF\u4EE5\u907F\u514D\u56E0\u70BA\u610F\u5916\u64CD\u4F5C\u800C\u5F04\u4E82\u4E86\u9EDE\u64AD\u6E05\u55AE.</p>
\u4E5F\u53EF\u4EE5\u907F\u514D\u56E0\u70BA\u610F\u5916\u64CD\u4F5C\u800C\u5F04\u4E82\u4E86\u64AD\u653E\u6E05\u55AE\u3002</p>
helppopup.theme.title = \u4F48\u666F\u4E3B\u984C
helppopup.theme.text = <p>\u8B93\u60A8\u53EF\u4EE5\u9078\u64C7\u4E0D\u540C\u7684\u4F48\u666F\u4E3B\u984C. \u4F48\u666F\u4E3B\u984C\u900F\u904E\u4E0D\u540C\u7684\u984F\u8272\u3001\u5B57\u9AD4\u3001\u5716\u50CF\u7B49\uFF0C\u5E36\u7D66\u60A8\u4E0D\u540C\u7684{0}\u611F\u53D7.</p>
helppopup.theme.text = <p>\u8B93\u60A8\u53EF\u4EE5\u9078\u64C7\u4E0D\u540C\u7684\u4F48\u666F\u4E3B\u984C\u3002\u4F48\u666F\u4E3B\u984C\u900F\u904E\u4E0D\u540C\u7684\u984F\u8272\u3001\u5B57\u9AD4\u3001\u5716\u50CF\u7B49\uFF0C\u5E36\u7D66\u60A8\u4E0D\u540C\u7684{0}\u611F\u53D7\u3002</p>
helppopup.welcomemessage.title = \u6B61\u8FCE\u6A19\u984C
helppopup.welcomemessage.text = <p>\u5728\u9996\u9801\u4E2D\u986F\u793A\u7684\u6A19\u984C.</p>
helppopup.welcomemessage.text = <p>\u5728\u9996\u9801\u4E2D\u986F\u793A\u7684\u6A19\u984C\u3002</p>
helppopup.loginmessage.title = \u767B\u5165\u8A0A\u606F
helppopup.loginmessage.text = <p>\u5728\u767B\u5165\u756B\u9762\u986F\u793A\u7684\u63D0\u793A\u8A0A\u606F.</p>
helppopup.loginmessage.text = <p>\u5728\u767B\u5165\u756B\u9762\u986F\u793A\u7684\u63D0\u793A\u8A0A\u606F\u3002</p>
helppopup.coverartlimit.title = \u5C08\u8F2F\u5C01\u9762\u9650\u5236
helppopup.coverartlimit.text = <p>\u5728\u4E00\u9801\u756B\u9762\u4E2D\u986F\u793A\u5C08\u8F2F\u5C01\u9762\u7684\u6700\u5927\u6578\u91CF.</p>
helppopup.coverartlimit.text = <p>\u5728\u4E00\u9801\u756B\u9762\u4E2D\u986F\u793A\u5C08\u8F2F\u5C01\u9762\u7684\u6700\u5927\u6578\u91CF\u3002</p>
helppopup.downloadlimit.title = \u4E0B\u8F09\u9650\u5236
helppopup.downloadlimit.text = <p>\u4E0B\u8F09\u6A94\u6848\u6642\u7684\u983B\u5BEC\u9650\u5236.</p>
helppopup.downloadlimit.text = <p>\u4E0B\u8F09\u6A94\u6848\u6642\u7684\u983B\u5BEC\u9650\u5236\u3002</p>
helppopup.uploadlimit.title = \u4E0A\u50B3\u9650\u5236
helppopup.uploadlimit.text = <p>\u4E0A\u50B3\u6A94\u6848\u6642\u7684\u983B\u5BEC\u9650\u5236.</p>
helppopup.streamport.title = \u975E-SSL \u4E32\u6D41 Port
helppopup.streamport.text = <p>\u672C\u9078\u9805\u53EA\u662F\u7528\u65BC\u5728\u4F3A\u670D\u5668\u4E0A\u7684 {0} \u4F7F\u7528 SSL (HTTPS)\u50B3\u8F38\u5354\u5B9A.</p><p>\u6709\u4E9B\u64AD\u653E\u5668 \
(\u4F8B\u5982 Winamp) \u4E26\u672A\u652F\u63F4\u7D93\u7531SSL\u7684\u4E32\u6D41\u5354\u5B9A. \u5982\u679C\u60A8\u4E0D\u7D93\u7531SSL\u50B3\u9001\u4E32\u6D41\uFF0C\u8ACB\u6307\u5B9A\u901A\u8A0APORT(\u901A\u5E38\u662F80\u62164040)\
\u8ACB\u6CE8\u610F\uFF0C\u4E32\u6D41\u97F3\u6A02\u4E26\u4E0D\u6703\u88AB\u52A0\u5BC6.</p>
helppopup.uploadlimit.text = <p>\u4E0A\u50B3\u6A94\u6848\u6642\u7684\u983B\u5BEC\u9650\u5236\u3002</p>
helppopup.streamport.title = \u975ESSL \u4E32\u6D41 Port
helppopup.streamport.text = <p>\u672C\u9078\u9805\u53EA\u662F\u7528\u65BC\u5728\u4F3A\u670D\u5668\u4E0A\u7684 {0} \u4F7F\u7528 SSL (HTTPS)\u50B3\u8F38\u5354\u5B9A\u3002</p><p>\u6709\u4E9B\u64AD\u653E\u5668 \
(\u4F8B\u5982 Winamp) \u4E0D\u652F\u63F4\u7D93\u7531SSL\u7684\u4E32\u6D41\u5354\u5B9A\u3002\u5982\u679C\u60A8\u4E0D\u7D93\u7531SSL\u50B3\u9001\u4E32\u6D41\uFF0C\u8ACB\u6307\u5B9A\u901A\u8A0APORT(\u901A\u5E38\u662F80\u62164040)\
\u8ACB\u6CE8\u610F\uFF0C\u4E32\u6D41\u97F3\u6A02\u4E26\u4E0D\u6703\u88AB\u52A0\u5BC6\u3002</p>
helppopup.ldap.title = LDAP \u9A57\u8B49
helppopup.ldap.text = <p>\u4F7F\u7528\u8005\u53EF\u4EE5\u7D93\u7531\u5916\u90E8\u7684LDAP\u4F3A\u670D\u5668\u9A57\u8B49 (\u5305\u62ECWindows Active Directory). \
\u7576\u8A2D\u5B9A\u4F7F\u7528LDAP\u4F7F\u7528\u8005\u767B\u5165 {0}, \u5E33\u865F\u53CA\u5BC6\u78BC\u5C31\u7531\u5916\u90E8\u4F3A\u670D\u5668\u9A57\u8B49, \u800C\u4E0D\u662F\u7531{0}\u4F86\u9A57\u8B49.</p>
helppopup.ldap.text = <p>\u4F7F\u7528\u8005\u53EF\u4EE5\u7D93\u7531\u5916\u90E8\u7684LDAP\u4F3A\u670D\u5668\u9A57\u8B49 (\u5305\u62ECWindows Active Directory)\u3002\
\u7576\u8A2D\u5B9A\u4F7F\u7528LDAP\u4F7F\u7528\u8005\u767B\u5165 {0}\uFF0C\u5E33\u865F\u53CA\u5BC6\u78BC\u5C31\u7531\u5916\u90E8\u4F3A\u670D\u5668\u9A57\u8B49\uFF0C\u800C\u4E0D\u662F\u7531{0}\u4F86\u9A57\u8B49\u3002</p>
helppopup.ldapurl.title = LDAP \u4F4D\u5740
helppopup.ldapurl.text = <p>\u8A2D\u5B9A LDAP \u4F3A\u670D\u5668\u7684\u4F4D\u5740. \u5354\u5B9A\u61C9\u8A72\u662F <em>ldap://</em> \u6216 <em>ldaps://</em> \
(\u7D93\u7531SSL\u7684LDAP\u5354\u5B9A). \u8ACB\u53C3\u8003<a href="http://java.sun.com/products/jndi/tutorial/ldap/misc/url.html" target="_blank">\u9019\u88E1</a> \
\u6709\u66F4\u591A\u8A73\u7D30\u8AAA\u660E.</p>
helppopup.ldapurl.text = <p>\u8A2D\u5B9A LDAP \u4F3A\u670D\u5668\u7684\u4F4D\u5740\u3002\u5354\u5B9A\u61C9\u8A72\u662F <em>ldap://</em> \u6216 <em>ldaps://</em> \
(\u7D93\u7531SSL\u7684LDAP\u5354\u5B9A)\u3002\u8ACB\u53C3\u8003<a href="http://java.sun.com/products/jndi/tutorial/ldap/misc/url.html" target="_blank">\u9019\u88E1</a> \
\u6709\u66F4\u591A\u8A73\u7D30\u8AAA\u660E\u3002</p>
helppopup.ldapsearchfilter.title = LDAP \u641C\u5C0B\u904E\u6FFE
helppopup.ldapsearchfilter.text = <p>\u8490\u5C0BLDAP\u7528\u6236\u6642\uFF0C\u5728\u9019\u88E1\u8A2D\u5B9A\u904E\u6FFE\u8868\u793A\u5F0F \
(\u5B9A\u7FA9\u5728<a href="http://www.ietf.org/rfc/rfc2254.txt" target="_blank">RFC 2254</a>). \
(\u5B9A\u7FA9\u5728<a href="http://www.ietf.org/rfc/rfc2254.txt" target="_blank">RFC 2254</a>)\u3002 \
The pattern "'{0'}" is replaced by the username, \u4F8B\u5982: \
<ul>\
<li>(uid='{0'}) - this would search for a username match on the uid attribute.</li> \
@ -588,22 +809,33 @@ helppopup.ldapsearchfilter.text = <p>\u8490\u5C0BLDAP\u7528\u6236\u6642\uFF0C\u5
</ul></p>
helppopup.ldapmanagerdn.title = LDAP \u7BA1\u7406\u8005 DN
helppopup.ldapmanagerdn.text = <p>\u5982\u679C LDAP \u4F3A\u670D\u5668\u4E0D\u652F\u63F4\u533F\u540D\u4F7F\u7528\u8005\u9023\u7DDA\uFF0C\u60A8\u5FC5\u9808\u6307\u5B9A DN \
(<em>Distinguished Name</em>)\u53CALDAP\u4F7F\u7528\u8005\u7684\u5BC6\u78BC.</p>
(<em>Distinguished Name</em>)\u53CALDAP\u4F7F\u7528\u8005\u7684\u5BC6\u78BC\u3002</p>
helppopup.ldapautoshadowing.title = \u5728 {0} \u81EA\u52D5\u5EFA\u7ACB LDAP \u5E33\u865F
helppopup.ldapautoshadowing.text = <p>\u8A2D\u5B9A\u9019\u500B\u9078\u9805, \u5247LDAP \u7528\u6236\u4E0D\u5FC5\u5728\u767B\u5165\u4E4B\u524D\u624B\u52D5\u5EFA\u7ACB{0}\u7684\u5E33\u865F. </p> \
<p>\u6CE8\u610F! \u9019\u610F\u5473\u6240\u6709\u5728LDAP\u4E0A\u7684\u4F7F\u7528\u8005\u90FD\u53EF\u4EE5\u767B\u5165\u60A8\u7684{0}, \
\u4E5F\u8A31\u9019\u4E0D\u662F\u60A8\u60F3\u8981\u7684\u529F\u80FD.</p>
helppopup.ldapautoshadowing.text = <p>\u8A2D\u5B9A\u9019\u500B\u9078\u9805\uFF0C\u5247LDAP \u7528\u6236\u4E0D\u5FC5\u5728\u767B\u5165\u4E4B\u524D\u624B\u52D5\u5EFA\u7ACB{0}\u7684\u5E33\u865F\u3002</p> \
<p>\u6CE8\u610F\uFF01 \u9019\u8868\u793A\u6240\u6709\u5728LDAP\u4E0A\u7684\u4F7F\u7528\u8005\u90FD\u53EF\u4EE5\u767B\u5165\u60A8\u7684{0}\uFF0C\
\u4E5F\u8A31\u9019\u4E0D\u662F\u60A8\u60F3\u8981\u7684\u529F\u80FD\u3002</p>
helppopup.playername.title = \u64A5\u653E\u5668\u540D\u7A31
helppopup.playername.text = <p>\u8B93\u4F60\u5E6B\u64AD\u653E\u5668\u6307\u5B9A\u4E00\u500B\u5BB9\u6613\u8A18\u4F4F\u7684\u540D\u5B57\uFF0C\u5982\u201C\u5DE5\u4F5C\u5BA4\u201D\u6216\u201C\u5BA2\u5EF3\u201D</p>
helppopup.playername.text = <p>\u8B93\u60A8\u5E6B\u64AD\u653E\u5668\u6307\u5B9A\u4E00\u500B\u5BB9\u6613\u8A18\u4F4F\u7684\u540D\u5B57\uFF0C\u5982\u201C\u5DE5\u4F5C\u5BA4\u201D\u6216\u201C\u5BA2\u5EF3\u201D</p>
helppopup.autocontrol.title = \u63A7\u5236\u64AD\u653E\u5668\u81EA\u52D5\u64AD\u653E
helppopup.autocontrol.text = <p>\u8A2D\u5B9A\u9019\u500B\u9078\u9805, {0} \u5728\u60A8\u958B\u59CB\u64AD\u653E\u6642\uFF0C\u6703\u81EA\u52D5\u555F\u52D5\u64AD\u653E\u5668\
\u5426\u5247\u60A8\u5FC5\u9808\u81EA\u5DF1\u555F\u52D5\u4E26\u4E14\u9023\u63A5\u60A8\u7684\u64A5\u653E\u5668.</p>
helppopup.autocontrol.text = <p>\u8A2D\u5B9A\u9019\u500B\u9078\u9805\uFF0C {0} \u5728\u60A8\u958B\u59CB\u64AD\u653E\u6642\uFF0C\u6703\u81EA\u52D5\u555F\u52D5\u64AD\u653E\u5668\
\u5426\u5247\u60A8\u5FC5\u9808\u81EA\u5DF1\u555F\u52D5\u4E26\u4E14\u9023\u63A5\u60A8\u7684\u64A5\u653E\u5668\u3002</p>
helppopup.dynamicip.title = \u52D5\u614B IP \u4F4D\u5740
helppopup.dynamicip.text = <p>\u95DC\u9589\u6B64\u9078\u9805\uFF0C\u5982\u679C\u60A8\u4F7F\u7528\u975C\u614BIP\u4F4D\u5740.</p>
helppopup.dynamicip.text = <p>\u95DC\u9589\u6B64\u9078\u9805\uFF0C\u5982\u679C\u60A8\u4F7F\u7528\u975C\u614BIP\u4F4D\u5740\u3002</p>
helppopup.smtpServer.title = SMTP \u4F3A\u670D\u5668
helppopup.smtpServer.text = <p>The hostname of the SMTP server. This server will be used to send e-mails to users \
who have requested a password reset.</p>
helppopup.smtpPort.title = SMTP Port
helppopup.smtpPort.text = <p>The server's port that should be connected to for SMTP traffic.</p>
helppopup.smtpCredentials.title = SMTP Credentials
helppopup.smtpCredentials.text = <p>The credentials to be used to connect to the SMTP server. Leave empty to connect without authentication.</p>
helppopup.smtpEncryption.title = SMTP Encryption
helppopup.smtpEncryption.text = <p>The encryption method to be used to connect to the SMTP server. Choose "None" for no encryption.</p>
helppopup.smtpFrom.title = From address
helppopup.smtpFrom.text = <p>The sender address for mails originating from the Libresonic server. Must be a valid e-mail address.</p>
# wap/index.jsp
wap.index.missing = \u627E\u4E0D\u5230\u97F3\u6A02
wap.index.playlist = \u9EDE\u64AD\u6E05\u55AE
wap.index.playlist = \u64AD\u653E\u6E05\u55AE
wap.index.search = \u641C\u5C0B
wap.index.settings = \u8A2D\u5B9A
@ -616,7 +848,7 @@ wap.browse.downloadone = \u4E0B\u8F09\u6B4C\u66F2
wap.browse.downloadall = \u5168\u90E8\u4E0B\u8F09
# wap/playlist.jsp
wap.playlist.title =\u9EDE\u64AD\u6E05\u55AE
wap.playlist.title = \u64AD\u653E\u6E05\u55AE
wap.playlist.noplayer = \u9023\u63A5\u4E0D\u5230\u64AD\u653E\u5668
wap.playlist.clear = \u6E05\u9664
wap.playlist.load = \u8F09\u5165
@ -627,7 +859,7 @@ wap.playlist.play = \u5728\u96FB\u8A71\u4E2D\u64AD\u9001
wap.search.title = \u641C\u5C0B
# wap/searchResult.jsp
wap.searchresult.index = \u6B63\u5728\u5EFA\u7ACB\u641C\u5C0B\u7D22\u5F15\u3002\u8ACB\u7A0D\u5F8C\u518D\u8A66.
wap.searchresult.index = \u6B63\u5728\u5EFA\u7ACB\u641C\u5C0B\u7D22\u5F15\u3002\u8ACB\u7A0D\u5F8C\u518D\u8A66\u3002
# wap/settings.jsp
wap.settings.selectplayer = \u9078\u64C7\u64AD\u653E\u5668

@ -2,7 +2,7 @@
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cacheFactory" class="org.libresonic.player.cache.CacheFactory"/>

@ -2,7 +2,7 @@
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- DAO's -->

@ -2,7 +2,7 @@
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>

@ -481,6 +481,7 @@
<c:param name="coverArtSize" value="${model.coverArtSizeMedium}"/>
<c:param name="showLink" value="true"/>
<c:param name="appearAfter" value="${loopStatus.count * 30}"/>
<c:param name="hideOverflow" value="true"/>
</c:import>
</div>
</c:forEach>

@ -273,6 +273,7 @@
<c:param name="coverArtSize" value="${model.coverArtSizeMedium}"/>
<c:param name="showLink" value="true"/>
<c:param name="appearAfter" value="${loopStatus.count * 30}"/>
<c:param name="hideOverflow" value="true"/>
</c:import>
</div>
</c:if>

@ -15,6 +15,7 @@ PARAMETERS
showZoom: Whether to display a link for zooming the cover art.
showChange: Whether to display a link for changing the cover art.
appearAfter: Fade in after this many milliseconds, or nil if no fading in should happen.
hideOverflow: Hide cover art overflow when height is greater than width
--%>
<c:choose>
<c:when test="${empty param.coverArtSize}">
@ -32,7 +33,7 @@ PARAMETERS
<str:randomString count="5" type="alphabet" var="playId"/>
<div class="coverart dropshadow">
<div style="width:${size};max-width:${size};height:${size};max-height:${size};cursor:pointer" title="${param.caption1}" id="${divId}">
<div style="width:${size};max-width:${size};height:${size};max-height:${size};cursor:pointer;<c:if test="${param.hideOverflow}">overflow:hidden</c:if>;" title="${param.caption1}" id="${divId}">
<c:if test="${not empty param.albumId}">
<c:url value="main.view" var="targetUrl">

@ -7,7 +7,9 @@
<script type="text/javascript" language="javascript">
function init() {
setTimeout("refresh()", 60000);
<c:if test="${model.listReloadDelay gt 0}">
setTimeout("refresh()", ${model.listReloadDelay * 1000});
</c:if>
<c:if test="${not model.musicFoldersExist}">
$().toastmessage("showNoticeToast", "<fmt:message key="top.missing"/>");
@ -109,6 +111,7 @@
<c:param name="coverArtSize" value="${model.coverArtSize}"/>
<c:param name="showLink" value="true"/>
<c:param name="appearAfter" value="${loopStatus.count * 30}"/>
<c:param name="hideOverflow" value="true"/>
</c:import>
<c:if test="${not empty album.rating}">

@ -179,6 +179,13 @@
</tr>
</table>
<table class="indent">
<tr>
<td><fmt:message key="personalsettings.listreloaddelay"/></td>
<td><form:input path="listReloadDelay" size="24"/></td>
</tr>
</table>
<table id="lastFmTable" style="padding-left:2em">
<tr>
<td><fmt:message key="personalsettings.lastfmusername"/></td>

@ -132,6 +132,14 @@
</td>
<td><c:import url="helpToolTip.jsp"><c:param name="topic" value="autocontrol"/></c:import></td>
</tr>
<tr>
<td>
<form:checkbox path="m3uBomEnabled" id="m3uBomEnabled" cssClass="checkbox"/>
<label for="m3uBomEnabled"><fmt:message key="playersettings.m3ubom"/></label>
</td>
<td><c:import url="helpToolTip.jsp"><c:param name="topic" value="m3ubom"/></c:import></td>
</tr>
</table>
<c:if test="${not empty command.allTranscodings}">

@ -73,6 +73,7 @@
<c:param name="coverArtSize" value="${model.coverArtSize}"/>
<c:param name="showLink" value="true"/>
<c:param name="appearAfter" value="${loopStatus.count * 30}"/>
<c:param name="hideOverflow" value="true"/>
</c:import>
</div>
</c:forEach>

@ -2,7 +2,7 @@
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="leftController" class="org.libresonic.player.controller.LeftController">
<property name="viewName" value="left"/>

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -8,7 +8,7 @@
<parent>
<groupId>org.libresonic.player</groupId>
<artifactId>libresonic</artifactId>
<version>6.1.beta1</version>
<version>6.1.beta2</version>
</parent>
<build>

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -8,7 +8,7 @@
<parent>
<groupId>org.libresonic.player</groupId>
<artifactId>libresonic</artifactId>
<version>6.1.beta1</version>
<version>6.1.beta2</version>
</parent>
<build>

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.libresonic.player</groupId>
<artifactId>libresonic</artifactId>
<version>6.1.beta1</version>
<version>6.1.beta2</version>
<name>Libresonic</name>
<packaging>pom</packaging>
<organization>
@ -212,6 +212,10 @@
<configuration>
<failOnWarning>${failOnDependencyWarning}</failOnWarning>
<ignoreNonCompile>true</ignoreNonCompile>
<ignoredUnusedDeclaredDependencies>
<ignoredUnusedDeclaredDependency>com.sun.mail:javax.mail*</ignoredUnusedDeclaredDependency>
<ignoredUnusedDeclaredDependency>org.seamless:seamless-http*</ignoredUnusedDeclaredDependency>
</ignoredUnusedDeclaredDependencies>
</configuration>
</execution>
</executions>

Loading…
Cancel
Save