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 # Eclipse Core
.project .project
# Intellij
*.iml
.idea
# External tool builders # External tool builders
.externalToolBuilders/ .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/). * Recent version of [Maven](http://maven.apache.org/).
* A JDK installation. 1.8.x series of OpenJDK or Oracle JDK 8+ should work. * A JDK installation. 1.8.x series of OpenJDK or Oracle JDK 8+ should work.
* Optional: lintian and fakeroot, for .deb package * Optional: lintian and fakeroot, for .deb package
* Optional: rpm and rpmlint, for .rpm package
* Test as follows: * Test as follows:
``` ```
@ -53,14 +54,39 @@ $
Packaged .deb 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-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 $ 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 # 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 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: 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`. 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 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 ### 6. Navigate to Libresonic
In a browser. Take your server IP address and port and append the the context path from above 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 ### 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: 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`. 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> <parent>
<groupId>org.libresonic.player</groupId> <groupId>org.libresonic.player</groupId>
<artifactId>libresonic</artifactId> <artifactId>libresonic</artifactId>
<version>6.1.beta1</version> <version>6.1.beta2</version>
</parent> </parent>
<dependencies> <dependencies>

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

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

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

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

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

@ -4,7 +4,7 @@ Section: Multimedia
Priority: optional Priority: optional
Recommends: ffmpeg Recommends: ffmpeg
Architecture: all 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 Description: A web-based music streamer, jukebox and Podcast receiver
Libresonic is 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 providing access to your music collection wherever you are. Use it

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

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

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

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

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

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

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

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

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

@ -72,6 +72,7 @@ public class PlayerSettingsController extends SimpleFormController {
command.setLastSeen(player.getLastSeen()); command.setLastSeen(player.getLastSeen());
command.setDynamicIp(player.isDynamicIp()); command.setDynamicIp(player.isDynamicIp());
command.setAutoControlEnabled(player.isAutoControlEnabled()); command.setAutoControlEnabled(player.isAutoControlEnabled());
command.setM3uBomEnabled(player.isM3uBomEnabled());
command.setTranscodeSchemeName(player.getTranscodeScheme().name()); command.setTranscodeSchemeName(player.getTranscodeScheme().name());
command.setTechnologyName(player.getTechnology().name()); command.setTechnologyName(player.getTechnology().name());
command.setAllTranscodings(transcodingService.getAllTranscodings()); command.setAllTranscodings(transcodingService.getAllTranscodings());
@ -99,6 +100,7 @@ public class PlayerSettingsController extends SimpleFormController {
Player player = playerService.getPlayerById(command.getPlayerId()); Player player = playerService.getPlayerById(command.getPlayerId());
player.setAutoControlEnabled(command.isAutoControlEnabled()); player.setAutoControlEnabled(command.isAutoControlEnabled());
player.setM3uBomEnabled(command.isM3uBomEnabled());
player.setDynamicIp(command.isDynamicIp()); player.setDynamicIp(command.isDynamicIp());
player.setName(StringUtils.trimToNull(command.getName())); player.setName(StringUtils.trimToNull(command.getName()));
player.setTranscodeScheme(TranscodeScheme.valueOf(command.getTranscodeSchemeName())); 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.Schema51;
import org.libresonic.player.dao.schema.hsql.Schema52; import org.libresonic.player.dao.schema.hsql.Schema52;
import org.libresonic.player.dao.schema.hsql.Schema53; 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; 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 Schema30(), new Schema31(), new Schema32(), new Schema33(), new Schema34(),
new Schema35(), new Schema36(), new Schema37(), new Schema38(), new Schema40(), new Schema35(), new Schema36(), new Schema37(), new Schema38(), new Schema40(),
new Schema43(), new Schema45(), new Schema46(), new Schema47(), new Schema49(), 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 DataSource dataSource;
private static boolean shutdownHookAdded; private static boolean shutdownHookAdded;

@ -35,7 +35,7 @@ import java.util.*;
public class PlayerDao extends AbstractDao { public class PlayerDao extends AbstractDao {
private static final Logger LOG = Logger.getLogger(PlayerDao.class); 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"; "last_seen, cover_art_scheme, transcode_scheme, dynamic_ip, technology, client_id";
private PlayerRowMapper rowMapper = new PlayerRowMapper(); private PlayerRowMapper rowMapper = new PlayerRowMapper();
@ -94,7 +94,7 @@ public class PlayerDao extends AbstractDao {
player.setId(String.valueOf(id)); player.setId(String.valueOf(id));
String sql = "insert into player (" + COLUMNS + ") values (" + questionMarks(COLUMNS) + ")"; String sql = "insert into player (" + COLUMNS + ") values (" + questionMarks(COLUMNS) + ")";
update(sql, player.getId(), player.getName(), player.getType(), player.getUsername(), 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.getLastSeen(), CoverArtScheme.MEDIUM.name(),
player.getTranscodeScheme().name(), player.isDynamicIp(), player.getTranscodeScheme().name(), player.isDynamicIp(),
player.getTechnology().name(), player.getClientId()); player.getTechnology().name(), player.getClientId());
@ -143,6 +143,7 @@ public class PlayerDao extends AbstractDao {
"username = ?," + "username = ?," +
"ip_address = ?," + "ip_address = ?," +
"auto_control_enabled = ?," + "auto_control_enabled = ?," +
"m3u_bom_enabled = ?," +
"last_seen = ?," + "last_seen = ?," +
"transcode_scheme = ?, " + "transcode_scheme = ?, " +
"dynamic_ip = ?, " + "dynamic_ip = ?, " +
@ -150,7 +151,7 @@ public class PlayerDao extends AbstractDao {
"client_id = ? " + "client_id = ? " +
"where id = ?"; "where id = ?";
update(sql, player.getName(), player.getType(), player.getUsername(), 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.getLastSeen(), player.getTranscodeScheme().name(), player.isDynamicIp(),
player.getTechnology(), player.getClientId(), player.getId()); player.getTechnology(), player.getClientId(), player.getId());
} }
@ -174,6 +175,7 @@ public class PlayerDao extends AbstractDao {
player.setUsername(rs.getString(col++)); player.setUsername(rs.getString(col++));
player.setIpAddress(rs.getString(col++)); player.setIpAddress(rs.getString(col++));
player.setAutoControlEnabled(rs.getBoolean(col++)); player.setAutoControlEnabled(rs.getBoolean(col++));
player.setM3uBomEnabled(rs.getBoolean(col++));
player.setLastSeen(rs.getTimestamp(col++)); player.setLastSeen(rs.getTimestamp(col++));
col++; // Ignore cover art scheme. col++; // Ignore cover art scheme.
player.setTranscodeScheme(TranscodeScheme.valueOf(rs.getString(col++))); 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, " + "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, " + "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, " + "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_ADMIN = 1;
private static final Integer ROLE_ID_DOWNLOAD = 2; 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.getAvatarScheme().name(), settings.getSystemAvatarId(), settings.getChanged(),
settings.isShowChatEnabled(), settings.isShowArtistInfoEnabled(), settings.isAutoHidePlayQueue(), settings.isShowChatEnabled(), settings.isShowArtistInfoEnabled(), settings.isAutoHidePlayQueue(),
settings.isViewAsList(), settings.getDefaultAlbumList().getId(), settings.isQueueFollowingSongs(), settings.isViewAsList(), settings.getDefaultAlbumList().getId(), settings.isQueueFollowingSongs(),
settings.isShowSideBar()}); settings.isShowSideBar(), settings.getListReloadDelay()});
} }
private static String encrypt(String s) { private static String encrypt(String s) {
@ -349,6 +349,7 @@ public class UserDao extends AbstractDao {
settings.setDefaultAlbumList(AlbumListType.fromId(rs.getString(col++))); settings.setDefaultAlbumList(AlbumListType.fromId(rs.getString(col++)));
settings.setQueueFollowingSongs(rs.getBoolean(col++)); settings.setQueueFollowingSongs(rs.getBoolean(col++));
settings.setShowSideBar(rs.getBoolean(col++)); settings.setShowSideBar(rs.getBoolean(col++));
settings.setListReloadDelay((Integer) rs.getObject(col++));
return settings; 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(); MediaFile currentFile = getCurrentFile();
Collections.shuffle(files); Collections.shuffle(files);
if (currentFile != null) { 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 String ipAddress;
private boolean isDynamicIp = true; private boolean isDynamicIp = true;
private boolean isAutoControlEnabled = true; private boolean isAutoControlEnabled = true;
private boolean isM3uBomEnabled = true;
private Date lastSeen; private Date lastSeen;
private TranscodeScheme transcodeScheme = TranscodeScheme.OFF; private TranscodeScheme transcodeScheme = TranscodeScheme.OFF;
private PlayQueue playQueue; private PlayQueue playQueue;
@ -188,6 +189,24 @@ public class Player {
this.isAutoControlEnabled = isAutoControlEnabled; 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. * Returns the time when the player was last seen.
* *

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

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

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

@ -1,44 +1,71 @@
# #
# Taiwan localization. # Traditional Chinese (Taiwan) localization.
# Author: Cheng Jen Li # Author: Cheng Jen Li
# chengjen.li@gmail.com # chengjen.li@gmail.com
# Author: Shen-Ta Hsieh
# ibmibmibm.tw@gmail.com
# #
common.home = \u9996\u9801 common.home = \u9996\u9801
common.back = \u56DE\u5FA9 common.back = \u4E0A\u4E00\u9801
common.help = \u5354\u52A9 common.help = \u8AAA\u660E
common.play = \u64AD\u653E common.play = \u64AD\u653E
common.add = \u65B0\u589E common.add = \u65B0\u589E
common.download = \u4E0B\u8F09 common.download = \u4E0B\u8F09
common.close = \u95DC\u9589 common.close = \u95DC\u9589
common.refresh = \u5237\u65B0 common.refresh = \u91CD\u65B0\u6574\u7406
common.next = \u4E0B\u9801 common.next = \u4E0B\u4E00\u9801
common.previous = \u4E0A\u9801 common.previous = \u4E0A\u4E00\u9801
common.more = \u66F4\u591A common.more = \u66F4\u591A
common.ok = \u78BA\u5B9A common.ok = \u78BA\u5B9A
common.cancel = \u53D6\u6D88 common.cancel = \u53D6\u6D88
common.save = \u5132\u5B58 common.save = \u5132\u5B58
common.create = \u5EFA\u7ACB common.create = \u5EFA\u7ACB
common.delete = \u522A\u9664 common.delete = \u522A\u9664
common.edit = \u7DE8\u8F2F
common.confirm = \u8ACB\u78BA\u8A8D
common.unknown = (\u672A\u77E5) common.unknown = (\u672A\u77E5)
common.default = (\u9810\u8A2D\u503C) 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.jsp
login.username = \u5E33\u865F login.username = \u5E33\u865F
login.password = \u5BC6\u78BC login.password = \u5BC6\u78BC
login.login = \u767B\u5165 login.login = \u767B\u5165
login.remember = \u8A18\u5F97\u6211 login.remember = \u8A18\u5F97\u6211
login.logout = \u60A8\u5DF2\u7D93\u767B\u51FA. login.logout = \u60A8\u5DF2\u7D93\u767B\u51FA\u3002
login.error = \u5E33\u865F\u6216\u662F\u5BC6\u78BC\u932F\u8AA4. login.error = \u5E33\u865F\u6216\u662F\u5BC6\u78BC\u932F\u8AA4\u3002
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.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.jsp
accessDenied.title = \u62D2\u7D55\u5B58\u53D6 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.jsp
top.home = \u9996\u9801 top.home = \u9996\u9801
top.now_playing = \u64AD\u653E top.now_playing = \u64AD\u653E
top.starred = Starred
top.settings = \u8A2D\u5B9A top.settings = \u8A2D\u5B9A
top.status = \u72C0\u614B top.status = \u72C0\u614B
top.podcast = \u64AD\u5BA2 top.podcast = \u64AD\u5BA2
@ -46,32 +73,40 @@ top.more = \u5176\u4ED6
top.help = \u95DC\u65BC top.help = \u95DC\u65BC
top.search = \u641C\u5C0B top.search = \u641C\u5C0B
top.upgrade = \u6709\u65B0\u7248\u672C\u63D0\u4F9B. \u4E0B\u8F09 {0} {1} \ top.upgrade = \u6709\u65B0\u7248\u672C\u63D0\u4F9B. \u4E0B\u8F09 {0} {1} \
<a href\="\#" onclick\="window.open(''http\://libresonic.org/'')">\u9019\u88E1</a>. <a href\="\#" onclick\="window.open(''http\://libresonic.org/'')">\u9019\u88E1</a>\u3002
top.missing = \u627E\u4E0D\u5230\u97F3\u6A02\u593E\uFF0C\u8ACB\u91CD\u65B0\u8A2D\u5B9A. top.missing = \u627E\u4E0D\u5230\u97F3\u6A02\u8CC7\u6599\u593E\uFF0C\u8ACB\u91CD\u65B0\u8A2D\u5B9A\u3002
top.logout =\u767B\u51FA{0} 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.jsp
left.statistics = \u97F3\u6A02\u76D2\u6709 \ left.scanning = \u6383\u63CF\u97F3\u6A02\u8CC7\u6599\u593E\u4E2D\u2026
{0}&nbsp;\u4F4D\u6B4C\u624B<br>\ left.statistics = {0}&nbsp;\u4F4D\u6B4C\u624B<br>\
{1}&nbsp;\u5F35\u5C08\u8F2F<br>\ {1}&nbsp;\u5F35\u5C08\u8F2F<br>\
{2}&nbsp;\u9996\u6B4C\u66F2<br>\ {2}&nbsp;\u9996\u6B4C\u66F2<br>\
{3} (\u7D04 {4} \u5C0F\u6642) {3}<br>\
{4}&nbsp;\u5C0F\u6642
left.shortcut = \u6377\u5F91 left.shortcut = \u6377\u5F91
left.playlists = \u64AD\u653E\u6E05\u55AE
left.radio = \u7DDA\u4E0A\u96FB\u8996/\u6536\u97F3\u6A5F left.radio = \u7DDA\u4E0A\u96FB\u8996/\u6536\u97F3\u6A5F
left.allfolders = \u5168\u90E8 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.stop = \u505C\u6B62
playlist.start = \u64AD\u653E 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.clear = \u6E05\u9664
playlist.shuffle = \u96A8\u8208\u64AD\u653E playlist.shuffle = \u96A8\u8208\u64AD\u653E
playlist.repeat_on = \u91CD\u64AD playlist.repeat_on = \u91CD\u64AD
playlist.repeat_off = \u4E0D\u91CD\u64AD playlist.repeat_off = \u4E0D\u91CD\u64AD
playlist.undo = \u53D6\u6D88 playlist.undo = \u53D6\u6D88
playlist.settings = \u8A2D\u5B9A playlist.settings = \u8A2D\u5B9A
playlist.more = \u5176\u4ED6... playlist.more = \u5176\u4ED6\u2026
playlist.more.playlist = \u9EDE\u64AD\u6E05\u55AE playlist.more.playlist = \u64AD\u653E\u6E05\u55AE
playlist.more.sortbytrack = \u97F3\u8ECC\u6392\u5E8F playlist.more.sortbytrack = \u97F3\u8ECC\u6392\u5E8F
playlist.more.sortbyartist = \u6B4C\u624B\u6392\u5E8F playlist.more.sortbyartist = \u6B4C\u624B\u6392\u5E8F
playlist.more.sortbyalbum = \u5C08\u8F2F\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.selectall = \u5168\u9078
playlist.more.selectnone = \u5168\u4E0D\u9078 playlist.more.selectnone = \u5168\u4E0D\u9078
playlist.getflash = \u53D6\u5F97Flash\u64A5\u653E\u5668 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.save = \u5132\u5B58
playlist.append = \u52A0\u5165\u6E05\u55AE playlist.append = \u52A0\u5165\u6E05\u55AE
playlist.remove = \u79FB\u9664 playlist.remove = \u79FB\u9664
playlist.up = \u4E0A playlist.up = \u4E0A
playlist.down = \u4E0B 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.jsp
status.title = \u72C0\u614B status.title = \u72C0\u614B
@ -98,46 +162,67 @@ status.current = \u76EE\u524D\u64AD\u653E
status.transmitted = \u50B3\u8F38 status.transmitted = \u50B3\u8F38
status.bitrate = Bitrate (Kbps) 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.jsp
search.title = \u641C\u5C0B search.title = \u641C\u5C0B
search.query = \u6B4C\u624B\u3001\u5C08\u8F2F\u6216\u6B4C\u66F2\u6A19\u984C\u3002
search.search = \u641C\u5C0B search.search = \u641C\u5C0B
search.index = \u6B63\u5728\u5EFA\u7ACB\u7D22\u5F15\uFF0C\u8ACB\u7A0D\u5F8C\u518D\u8A66! search.index = \u6B63\u5728\u5EFA\u7ACB\u7D22\u5F15\uFF0C\u8ACB\u7A0D\u5F8C\u518D\u8A66\uFF01
search.hits.none = \u627E\u4E0D\u5230. 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.jsp
gettingStarted.title = \u521D\u6B21\u4F7F\u7528 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> \ 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\uFF01.</p> \ \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> <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\ 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 \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\u593E. 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.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\ 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.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.jsp
home.random.title = \u96A8\u8208\u64AD\u653E home.random.title = \u96A8\u8208\u64AD\u653E
home.alphabetical.title = \u5168\u90E8
home.newest.title = \u6700\u65B0\u97F3\u6A02 home.newest.title = \u6700\u65B0\u97F3\u6A02
home.starred.title = \u661F\u865F\u6A19\u8A18
home.highest.title = \u559C\u597D\u7A0B\u5EA6 home.highest.title = \u559C\u597D\u7A0B\u5EA6
home.frequent.title = \u9EDE\u64AD\u7387 home.frequent.title = \u9EDE\u64AD\u7387
home.recent.title = \u6700\u8FD1\u64AD\u653E 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.users.title = \u4F7F\u7528\u8005
home.random.text = \u96A8\u8208\u9078\u64AD\u5C08\u8F2F home.random.text = \u96A8\u8208\u9078\u64AD\u5C08\u8F2F
home.alphabetical.text = \u6240\u6709\u5C08\u8F2F
home.newest.text = \u6700\u65B0\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.highest.text = \u8A55\u50F9\u9AD8\u7684\u5C08\u8F2F
home.frequent.text = \u6700\u591A\u9EDE\u64AD\u5C08\u8F2F home.frequent.text = \u6700\u591A\u9EDE\u64AD\u5C08\u8F2F
home.recent.text =\u6700\u8FD1\u64AD\u653E\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.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.albums = \u5C08\u8F2F {0} - {1}
home.playcount = \u64AD\u653E\u4E86 {0} \u9996\u6B4C home.playcount = \u64AD\u653E\u4E86 {0} \u9996\u6B4C
home.lastplayed = \u64AD\u653E {0} home.lastplayed = \u64AD\u653E {0}
home.created = \u5EFA\u7ACB {0} home.created = \u5EFA\u7ACB {0}
home.shuffle = \u96A8\u6A5F\u64AD\u653E
home.chart.total = \u7E3D\u8A08 (MB) home.chart.total = \u7E3D\u8A08 (MB)
home.chart.stream = \u4E32\u6D41 (MB) home.chart.stream = \u4E32\u6D41 (MB)
home.chart.download = \u5DF2\u4E0B\u8F09(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.title = \u96A8\u8208\u64AD\u653E
more.random.text = \u5EFA\u7ACB\u96A8\u8208\u6E05\u55AE more.random.text = \u5EFA\u7ACB\u96A8\u8208\u6E05\u55AE
more.random.songs = {0} \u9996 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.ok = \u78BA\u5B9A
more.random.genre = \u66F2\u98A8 more.random.genre = \u66F2\u98A8
more.random.anygenre = \u4EFB\u610F more.random.anygenre = \u4EFB\u610F
more.random.year = \u5E74\u4EFD more.random.year = \u5E74\u4EFD
more.random.anyyear = \u4EFB\u610F 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.random.anyfolder = \u4EFB\u610F
more.apps.title = Libresonic Apps more.apps.title = Libresonic Apps
more.apps.text = <p>\u652F\u63F4 <b>iPhone</b>, \ 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.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> \ \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.title = \u64AD\u5BA2
more.podcast.text = <p>\u5132\u5B58\u9EDE\u64AD\u6E05\u55AE\u7576\u6210\u64AD\u5BA2.<br>\ 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: <b>http://yourhostname/podcast</b>, \ \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>.</b></p> \u6216\u662F <b><a href="podcast.view?suffix=.rss">\u9EDE\u6211</a>\u3002</b></p>
more.upload.title = \u4E0A\u50B3\u6A94\u6848 more.upload.title = \u4E0A\u50B3\u6A94\u6848
more.upload.source = \u9078\u64C7\u6A94\u6848 more.upload.source = \u9078\u64C7\u6A94\u6848
more.upload.target = \u4E0A\u50B3\u5230 more.upload.target = \u4E0A\u50B3\u5230
more.upload.browse = \u9078\u64C7 more.upload.browse = \u9078\u64C7
more.upload.ok = \u4E0A\u50B3 more.upload.ok = \u4E0A\u50B3
more.upload.unzip = \u81EA\u52D5\u89E3\u58D3\u7E2Ezip\u6A94. more.upload.unzip = \u81EA\u52D5\u89E3\u58D3\u7E2Ezip\u6A94\u3002
more.upload.progress = % \u5B8C\u6210. \u8ACB\u7A0D\u5019... more.upload.progress = % \u5B8C\u6210\u3002\u8ACB\u7A0D\u5019\u2026
# upload.jsp # 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.success = \u4E0A\u50B3\u6210\u529F <b>{0}</b>
upload.empty = \u6C92\u6709\u4E0A\u50B3\u7684\u6A94\u6848\u5594. upload.empty = \u6C92\u6709\u53EF\u4E0A\u50B3\u7684\u6A94\u6848\u3002
upload.failed = \u6A94\u6848\u4E0A\u50B3\u5931\u6557\u56E0\u70BA:<br><b>"{0}"</b> upload.failed = \u6A94\u6848\u4E0A\u50B3\u6642\u767C\u751F\u932F\u8AA4\uFF1A<br><b>"{0}"</b>
upload.unzipped = \u89E3\u58D3\u7E2E {0} upload.unzipped = \u89E3\u58D3\u7E2E {0}
# help.jsp # help.jsp
help.title = \u95DC\u65BC {0} 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} \ 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/'')">\u5728\u9019</a>. <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.version.title = \u7248\u672C
help.builddate.title = \u65E5\u671F help.builddate.title = \u65E5\u671F
help.server.title = \u4F3A\u670D\u5668 help.server.title = \u4F3A\u670D\u5668
help.license.title = \u6388\u6B0A 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>\ 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
{0} \u4F7F\u7528 <a href="http://libresonic.org/pages/libraries.jsp" target="_blank">\u7B2C\u4E09\u65B9\u6388\u6B0A</a>.
help.homepage.title = \u9996\u9801 help.homepage.title = \u9996\u9801
help.forum.title = \u8AD6\u58C7 help.forum.title = \u8AD6\u58C7
help.shop.title = \u5546\u54C1 help.shop.title = \u5546\u54C1
help.contact.title = \u806F\u7E6B help.contact.title = \u806F\u7E6B
help.contact.text = {0} \u7531 Sindre Mehus \u958B\u767C\u53CA\u7DAD\u8B77 \ 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
(<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.log = \u8A18\u9304 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.jsp
settingsheader.title = \u8A2D\u5B9A settingsheader.title = \u8A2D\u5B9A
settingsheader.general = \u4E00\u822C settingsheader.general = \u4E00\u822C
settingsheader.advanced = \u9032\u968E settingsheader.advanced = \u9032\u968E
settingsheader.personal = \u500B\u4EBA\u5316 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.internetRadio = \u7DDA\u4E0A\u96FB\u8996/\u6536\u97F3\u6A5F
settingsheader.podcast = \u64AD\u5BA2 settingsheader.podcast = \u64AD\u5BA2
settingsheader.player = \u64AD\u653E\u5668 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.network = \u7DB2\u8DEF
settingsheader.transcoding = \u8F49\u6A94 settingsheader.transcoding = \u8F49\u6A94
settingsheader.user = \u4F7F\u7528\u8005 settingsheader.user = \u4F7F\u7528\u8005
@ -220,57 +314,71 @@ settingsheader.coverArt = \u5C08\u8F2F\u5C01\u9762
settingsheader.password = \u5BC6\u78BC settingsheader.password = \u5BC6\u78BC
# generalSettings.jsp # 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.musicmask = \u97F3\u6A02\u7684\u9644\u5C6C\u6A94\u540D:
generalsettings.videomask = \u8996\u8A0A\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.coverartmask = \u5C08\u8F2F\u5C01\u9762\u9644\u5C6C\u6A94\u540D
generalsettings.index = \u7D22\u5F15 generalsettings.index = \u7D22\u5F15
generalsettings.ignoredarticles = \u5FFD\u7565\u7684\u6B4C\u624B\u540D\u7A31 generalsettings.ignoredarticles = \u5FFD\u7565\u7684\u6B4C\u624B\u540D\u7A31
generalsettings.shortcuts = \u6377\u5F91 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.showgettingstarted = \u5728\u9996\u9801\u986F\u793A "\u521D\u6B21\u4F7F\u7528"
generalsettings.welcometitle = \u6B61\u8FCE\u6A19\u984C generalsettings.welcometitle = \u6B61\u8FCE\u6A19\u984C
generalsettings.welcomesubtitle = \u6B61\u8FCE\u6B21\u6A19\u984C generalsettings.welcomesubtitle = \u6B61\u8FCE\u6B21\u6A19\u984C
generalsettings.welcomemessage = \u6B61\u8FCE\u8A0A\u606F generalsettings.welcomemessage = \u6B61\u8FCE\u8A0A\u606F
generalsettings.loginmessage = \u767B\u5165\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 generalsettings.theme = \u9810\u8A2D\u4F48\u666F\u4E3B\u984C
# advancedSettings.jsp # advancedSettings.jsp
advancedsettings.downsamplecommand = \u964D\u983B\u6307\u4EE4 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.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.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.streamport = \u975E SSL \u4E32\u6D41 Port <br><div class="detail">(0 = \u53D6\u6D88)</div>
advancedsettings.ldapenabled = \u555F\u52D5LDAP\u9A57\u8B49 advancedsettings.ldapenabled = \u555F\u52D5 LDAP \u9A57\u8B49
advancedsettings.ldapurl = LDAP\u7DB2\u5740 advancedsettings.ldapurl = LDAP \u7DB2\u5740
advancedsettings.ldapsearchfilter = LDAP\u641C\u5C0B\u904E\u6FFE advancedsettings.ldapsearchfilter = LDAP \u641C\u5C0B\u904E\u6FFE
advancedsettings.ldapmanagerdn = LDAP \u7BA1\u7406\u8005DN<br><div class="detail">(\u53EF\u9078\u64C7)</div> advancedsettings.ldapmanagerdn = LDAP \u7BA1\u7406\u8005 DN <br><div class="detail">(\u53EF\u9078\u64C7)</div>
advancedsettings.ldapmanagerpassword = \u5BC6\u78BC advancedsettings.ldapmanagerpassword = \u5BC6\u78BC
advancedsettings.ldapautoshadowing = \u81EA\u52D5\u5728{0}\u5EFA\u7ACB\u4F7F\u7528\u8005 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.jsp
personalsettings.title = {0}\u7684\u500B\u4EBA\u5316\u8A2D\u5B9A personalsettings.title = {0}\u7684\u500B\u4EBA\u5316\u8A2D\u5B9A
personalsettings.language = Language personalsettings.language = \u8A9E\u8A00
personalsettings.theme = \u4F48\u666F\u4E3B\u984C personalsettings.theme = \u4F48\u666F\u4E3B\u984C
personalsettings.albumlist = \u9810\u8A2D\u5C08\u8F2F\u6392\u5E8F\u65B9\u5F0F
personalsettings.display = \u986F\u793A personalsettings.display = \u986F\u793A
personalsettings.browse = \u700F\u89BD personalsettings.browse = \u700F\u89BD
personalsettings.playlist = \u9EDE\u64AD\u6E05\u55AE personalsettings.playlist = \u64AD\u653E\u6E05\u55AE
personalsettings.tracknumber = \u97F3\u8ECC # personalsettings.tracknumber = \u97F3\u8ECC #
personalsettings.artist = \u6B4C\u624B personalsettings.artist = \u6B4C\u624B
personalsettings.album = \u5C08\u8F2F personalsettings.album = \u5C08\u8F2F
personalsettings.genre = \u66F2\u98A8\u578B\u614B personalsettings.genre = \u66F2\u98A8
personalsettings.year = \u767C\u884C personalsettings.year = \u767C\u884C
personalsettings.bitrate = Bit rate personalsettings.bitrate = Bit rate
personalsettings.duration = \u6642\u6548 personalsettings.duration = \u6642\u6548
personalsettings.format = \u683C\u5F0F personalsettings.format = \u683C\u5F0F
personalsettings.filesize = \u6587\u4EF6\u5927\u5C0F personalsettings.filesize = \u6587\u4EF6\u5927\u5C0F
personalsettings.captioncutoff = Caption cutoff
personalsettings.partymode = \u5BB4\u6703\u6A21\u5F0F personalsettings.partymode = \u5BB4\u6703\u6A21\u5F0F
personalsettings.queuefollowingsongs = Queue following songs on play
personalsettings.shownowplaying = \u5176\u4ED6\u4EBA\u5728\u807D\u4EC0\u9EBC personalsettings.shownowplaying = \u5176\u4ED6\u4EBA\u5728\u807D\u4EC0\u9EBC
personalsettings.nowplayingallowed = \u8B93\u5225\u4EBA\u770B\u6211\u5728\u807D\u4EC0\u9EBC personalsettings.nowplayingallowed = \u8B93\u5225\u4EBA\u770B\u6211\u5728\u807D\u4EC0\u9EBC
personalsettings.showchat = \u986F\u793A\u4EA4\u8AC7\u8A0A\u606F 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.finalversionnotification = \u63D0\u793A\u65B0\u7248\u672C
personalsettings.betaversionnotification = \u63D0\u793A\u65B0\u7684\u6E2C\u8A66\u7248 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.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.lastfmusername = Last.fm \u5E33\u865F
personalsettings.lastfmpassword = Last.fm \u5BC6\u78BC personalsettings.lastfmpassword = Last.fm \u5BC6\u78BC
@ -286,28 +394,51 @@ personalsettings.avatar.courtesy = Icons courtesy of <a href="http://www.aftergl
# avatarUploadResult.jsp # avatarUploadResult.jsp
avataruploadresult.title = \u8B8A\u66F4\u500B\u4EBA\u5716\u793A avataruploadresult.title = \u8B8A\u66F4\u500B\u4EBA\u5716\u793A
avataruploadresult.success = \u6210\u529F\u4E0A\u50B3\u500B\u4EBA\u5716\u793A "{0}". 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>. avataruploadresult.failure = \u7121\u6CD5\u4E0A\u50B3\u500B\u4EBA\u5716\u793A. \u8ACB\u53C3\u95B1 <a href="help.view?">\u8A18\u9304</a>\u3002
# passwordSettings.jsp # passwordSettings.jsp
passwordsettings.title = \u8B8A\u66F4\u5BC6\u78BC {0} passwordsettings.title = \u8B8A\u66F4\u5BC6\u78BC {0}
# musicFolderSettings.jsp # musicFolderSettings.jsp
musicfoldersettings.path = \u97F3\u6A02\u593E musicfoldersettings.path = \u97F3\u6A02\u8CC7\u6599\u593E
musicfoldersettings.name = \u540D\u7A31 musicfoldersettings.name = \u540D\u7A31
musicfoldersettings.enabled = \u4F7F\u7528 musicfoldersettings.enabled = \u4F7F\u7528
musicfoldersettings.add = \u65B0\u589E\u97F3\u6A02\u593E musicfoldersettings.add = \u65B0\u589E\u97F3\u6A02\u8CC7\u6599\u593E
musicfoldersettings.nopath = \u5E6B\u97F3\u6A02\u593E\u547D\u540D\u5427. 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.jsp
networksettings.text = \u4EE5\u4E0B\u8A2D\u5B9A\u8B93\u60A8\u900F\u904E\u7DB2\u969B\u7DB2\u8DEF\u5B58\u53D6Libresonic\u4F3A\u670D\u5668.<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, \u8ACB\u53C3\u8003 <a href="http://libresonic.org/pages/getting-started.jsp" target="_blank"><b>\u521D\u6B21\u4F7F\u7528</b></a>\u624B\u518A. \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\u53D6Libresonic\u4F3A\u670D\u5668 (UPnP port \u8F49\u767C). 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.<br> \ 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>\ \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. \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. networksettings.urlredirectionenabled = \u7528\u7C21\u55AE\u597D\u8A18\u7684\u7DB2\u5740\u9023\u7DDA\u5230\u60A8\u7684\u4F3A\u670D\u5668\u3002
networksettings.status = \u72C0\u614B: networksettings.status = \u72C0\u614B\uFF1A
networksettings.normalurl = Use
networksettings.customurl = Use custom URL (advanced)
networksettings.urlRedirectDisabled = Feature not currently available
# transcodingSettings.jsp # transcodingSettings.jsp
transcodingsettings.name = \u8F49\u6A94\u540D\u7A31 transcodingsettings.name = \u8F49\u6A94\u540D\u7A31
@ -316,22 +447,23 @@ transcodingsettings.targetformat = \u8F49\u63DB\u6210
transcodingsettings.step1 = \u6B65\u9A5F\u4E00 transcodingsettings.step1 = \u6B65\u9A5F\u4E00
transcodingsettings.step2 = \u6B65\u9A5F\u4E8C transcodingsettings.step2 = \u6B65\u9A5F\u4E8C
transcodingsettings.step3 = \u6B65\u9A5F\u4E09 transcodingsettings.step3 = \u6B65\u9A5F\u4E09
transcodingsettings.defaultactive = \u9810\u8A2D
transcodingsettings.add = \u65B0\u589E\u8F49\u78BC\u5668 transcodingsettings.add = \u65B0\u589E\u8F49\u78BC\u5668
transcodingsettings.noname = \u8ACB\u6307\u5B9A\u4E00\u500B\u540D\u7A31. transcodingsettings.defaultactive = \u9810\u8A2D
transcodingsettings.nosourceformat = \u8ACB\u6307\u5B9A\u8F49\u63DB\u683C\u5F0F. transcodingsettings.recommended = Recommended configuration
transcodingsettings.notargetformat = \u8ACB\u6307\u5B9A\u8F49\u63DB\u683C\u5F0F. transcodingsettings.noname = \u8ACB\u6307\u5B9A\u4E00\u500B\u540D\u7A31\u3002
transcodingsettings.nostep1 = \u8ACB\u81F3\u5C11\u6307\u5B9A\u4E00\u500B\u8F49\u63DB\u6B65\u9A5F. transcodingsettings.nosourceformat = \u8ACB\u6307\u5B9A\u8F49\u63DB\u7684\u4F86\u6E90\u683C\u5F0F\u3002
transcodingsettings.info = <p class="detail">(%s = \u6A94\u6848\u5C07\u88AB\u8F49\u63DB, %b = \u64A5\u653E\u5668\u7684\u6700\u5927\u50B3\u8F38\u7387)</p> \ transcodingsettings.notargetformat = \u8ACB\u6307\u5B9A\u8F49\u63DB\u7684\u76EE\u7684\u683C\u5F0F\u3002
<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 \ transcodingsettings.nostep1 = \u8ACB\u81F3\u5C11\u6307\u5B9A\u4E00\u500B\u8F49\u63DB\u6B65\u9A5F\u3002
\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/> \ 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>\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>\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 \
<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>. \ \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\ \u60A8\u4E5F\u80FD\u4EE5\u81EA\u5B9A\u7684\u8F49\u63DB\uFF0C\u53EA\u8981\u6EFF\u8DB3\u4E0B\u9762\u8981\u6C42\uFF1A\
<ul> \ <ul> \
<li>\u5FC5\u9808\u4EE5\u4E00\u500B\u547D\u4EE4\u884C\u6307\u4EE4\u754C\u9762.</li> \ <li>\u5FC5\u9808\u6709\u547D\u4EE4\u5217\u754C\u9762\u3002</li> \
<li>\u5FC5\u9808\u80FD\u5920\u5C07\u8F38\u51FA\u767C\u9001\u5230\u6A19\u6E96\u8F38\u51FA(Stdout).</li> \ <li>\u5FC5\u9808\u80FD\u5920\u5C07\u7D50\u679C\u9001\u5230\u6A19\u6E96\u8F38\u51FA(Stdout)\u3002</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>\u5982\u679C\u5728\u6B65\u9A5F2\u4F7F\u7528\uFF0C\u5B83\u5FC5\u9808\u80FD\u5920\u5F9E\u6A19\u6E96\u8F38\u5165(Stdin)\u8B80\u53D6\u3002</li> \
</ul> \ </ul> \
</p> \ </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> <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 podcastsettings.folder = \u5132\u5B58\u64AD\u5BA2\u5728
# playerSettings.jsp # playerSettings.jsp
playersettings.noplayers = \u6C92\u6709\u64A5\u653E\u5668. playersettings.noplayers = \u6C92\u6709\u64A5\u653E\u5668\u3002
playersettings.type = \u5F62\u614B playersettings.type = \u5F62\u614B
playersettings.lastseen = \u4E0A\u6B21\u767B\u5165 playersettings.lastseen = \u4E0A\u6B21\u767B\u5165
playersettings.title = \u9078\u64C7\u64A5\u653E\u5668 playersettings.title = \u9078\u64C7\u64A5\u653E\u5668
playersettings.technology.web.title = \u7DB2\u9801\u64AD\u653E 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.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.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.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.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>\ 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 \
\u56E0\u6B64\u53EF\u80FD\u7684\u60C5\u6CC1\u4E0B\u53EF\u4EE5\u76F4\u63A5\u8DF3\u807D\u4E0B\u4E00\u9996\u6B4C\u66F2\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. (\u9650\u5DF2\u6388\u6B0A\u7684\u7528\u6236). 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.name = \u64A5\u653E\u5668\u540D\u7A31
playersettings.coverartsize = \u5C08\u8F2F\u5C01\u9762\u5927\u5C0F
playersettings.maxbitrate = \u6700\u5927\u50B3\u8F38\u7387 playersettings.maxbitrate = \u6700\u5927\u50B3\u8F38\u7387
playersettings.coverart.off = \u4E0D\u986F\u793A 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.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.autocontrol = \u81EA\u52D5\u64AD\u653E 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.dynamicip = \u64A5\u653E\u5668\u4F7F\u7528\u52D5\u614BIP\u4F4D\u5740
playersettings.transcodings = \u555F\u52D5\u7684\u8F49\u78BC\u7A0B\u5F0F playersettings.transcodings = \u555F\u52D5\u7684\u8F49\u78BC\u7A0B\u5F0F
playersettings.ok = \u5132\u5B58 playersettings.ok = \u5132\u5B58
playersettings.forget = \u522A\u9664\u64A5\u653E\u5668 playersettings.forget = \u522A\u9664\u64A5\u653E\u5668
playersettings.clone = \u8907\u88FD\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.jsp
usersettings.title = \u9078\u64C7\u4F7F\u7528\u8005 usersettings.title = \u9078\u64C7\u4F7F\u7528\u8005
usersettings.newuser = \u65B0\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.jukebox = \u53EF\u4EE5\u7528\u9EDE\u64A5\u6A5F\u6A21\u5F0F
usersettings.download = \u53EF\u4EE5\u4E0B\u8F09\u6A94\u6848 usersettings.download = \u53EF\u4EE5\u4E0B\u8F09\u6A94\u6848
usersettings.upload = \u53EF\u4EE5\u4E0A\u50B3\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.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.comment= \u53EF\u4EE5\u5EFA\u7ACB\u6216\u7DE8\u8F2F\u8A55\u8AD6\u53CA\u8A55\u5206
usersettings.podcast= \u53EF\u4EE5\u7BA1\u7406\u64AD\u5BA2 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.username = \u4F7F\u7528\u8005
usersettings.email = Email
usersettings.changepassword = \u8B8A\u66F4\u5BC6\u78BC usersettings.changepassword = \u8B8A\u66F4\u5BC6\u78BC
usersettings.password = \u5BC6\u78BC usersettings.password = \u5BC6\u78BC
usersettings.newpassword = \u65B0\u5BC6\u78BC usersettings.newpassword = \u65B0\u5BC6\u78BC
usersettings.confirmpassword = \u518D\u6B21\u78BA\u8A8D\u5BC6\u78BC usersettings.confirmpassword = \u518D\u6B21\u78BA\u8A8D\u5BC6\u78BC
usersettings.delete = \u522A\u9664\u4F7F\u7528\u8005 usersettings.delete = \u522A\u9664\u4F7F\u7528\u8005
usersettings.ldap = \u5728LDAP\u9A57\u8B49\u7528\u6236 usersettings.ldap = \u5728LDAP\u9A57\u8B49\u7528\u6236
usersettings.nousername = \u7F3A\u5C11\u4F7F\u7528\u8005\u540D\u7A31. usersettings.nousername = \u7F3A\u5C11\u4F7F\u7528\u8005\u540D\u7A31\u3002
usersettings.useralreadyexists = \u4F7F\u7528\u8005\u540D\u7A31\u5DF2\u7D93\u88AB\u4F7F\u7528\u4E86\uFF01. usersettings.noemail= \u4E0D\u5408\u6CD5\u7684 email \u4F4D\u5740\u3002
usersettings.nopassword = \u5FC5\u9808\u8A2D\u5B9A\u5BC6\u78BC. usersettings.useralreadyexists = \u5E33\u865F\u540D\u7A31\u5DF2\u7D93\u88AB\u4F7F\u7528\u4E86\u3002
usersettings.wrongpassword = \u5169\u6B21\u8F38\u5165\u5BC6\u78BC\u4E0D\u540C. usersettings.nopassword = \u5FC5\u9808\u8A2D\u5B9A\u5BC6\u78BC\u3002
usersettings.ldapdisabled = LDAP\u9A57\u8B49\u6C92\u6709\u555F\u52D5. \u8ACB\u5148\u5230\u9032\u968E\u8A2D\u5B9A. usersettings.wrongpassword = \u5169\u6B21\u8F38\u5165\u5BC6\u78BC\u4E0D\u540C\u3002
usersettings.passwordnotsupportedforldap = \u7121\u6CD5\u8A2D\u5B9A\u6216\u8B8A\u66F4LDAP\u9A57\u8B49\u7528\u6236\u7684\u5BC6\u78BC. usersettings.ldapdisabled = LDAP\u9A57\u8B49\u6C92\u6709\u555F\u52D5\u3002\u8ACB\u5230\u9032\u968E\u8A2D\u5B9A\u3002
usersettings.ok = \u4F7F\u7528\u8005 {0}\u7684\u5BC6\u78BC\u5DF2\u7D93\u8B8A\u66F4. 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
# musicFolderSettings.jsp
musicfoldersettings.interval.never = \u5F9E\u4E0D
musicfoldersettings.interval.one = \u6BCF\u5929
musicfoldersettings.interval.many = \u6BCF\u9694 {0} \u5929
musicfoldersettings.hour = \u5728 {0}:00
# main.jsp # main.jsp
main.up = \u4E0A\u4E00\u9801 main.up = \u4E0A\u4E00\u9801
main.playall = \u5168\u90E8\u64AD\u653E main.playall = \u5168\u90E8\u64AD\u653E
main.playrandom = \u96A8\u8208\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.downloadall = \u5168\u90E8\u4E0B\u8F09
main.tags = \u7DE8\u8F2F\u6A19\u7C64 main.tags = \u7DE8\u8F2F\u6A19\u7C64
main.playcount = \u9EDE\u64AD {0} \u6B21. main.playcount = \u64AD\u653E {0} \u6B21\u3002
main.lastplayed =\u4E0A\u6B21\u9EDE\u64AD\u5728 {0}. main.lastplayed =\u4E0A\u6B21\u64AD\u653E\u5728 {0} \u3002
main.comment = \u8A55\u8AD6 main.comment = \u8A55\u8AD6
main.wiki = <table class="detail">\ 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>\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>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>\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>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">* 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>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">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> </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.nowplaying =\u76EE\u524D\u64A5\u653E
main.lyrics = \u6B4C\u8A5E main.lyrics = \u6B4C\u8A5E
main.minutesago = \u5206\u9418\u524D main.minutesago = \u5206\u9418\u524D
main.chat = \u4EA4\u8AC7 main.chat = \u4EA4\u8AC7
main.scanning = \u6383\u63CF\u6A94\u6848\uFF1A
main.message = \u5BEB\u5728\u9019\u88E1 main.message = \u5BEB\u5728\u9019\u88E1
main.clearchat = \u6E05\u9664 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.jsp
rating.rating = \u7B49\u7D1A rating.rating = \u7B49\u7D1A
@ -457,17 +629,18 @@ coverart.change = \u8B8A\u66F4
coverart.zoom = \u653E\u5927 coverart.zoom = \u653E\u5927
# allmusic.jsp # 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.jsp
changecoverart.title = \u8B8A\u66F4\u5C08\u8F2F\u5C01\u9762 changecoverart.title = \u8B8A\u66F4\u5C08\u8F2F\u5C01\u9762
changecoverart.address = \u6216\u662F\u8F38\u5165\u5716\u5F62\u7684\u4F4D\u5740 changecoverart.address = \u6216\u662F\u8F38\u5165\u5716\u5F62\u7684\u4F4D\u5740
changecoverart.artist = \u6B4C\u624B changecoverart.artist = \u6B4C\u624B
changecoverart.album = \u5C08\u8F2F changecoverart.album = \u5C08\u8F2F
changecoverart.wait = \u8ACB\u7A0D\u5019... changecoverart.search = Google \u5716\u7247\u641C\u5C0B
changecoverart.success = \u5716\u5F62\u4E0B\u8F09\u6210\u529F. changecoverart.wait = \u8ACB\u7A0D\u5019\u2026
changecoverart.error = \u7121\u6CD5\u4E0B\u8F09\u5716\u5F62. changecoverart.success = \u5716\u7247\u4E0B\u8F09\u6210\u529F\u3002
changecoverart.noimagesfound = \u627E\u4E0D\u5230\u5716\u5F62\u6A94. changecoverart.error = \u7121\u6CD5\u4E0B\u8F09\u5716\u7247\u3002
changecoverart.noimagesfound = \u627E\u4E0D\u5230\u5716\u7247\u3002
# changeCoverArtConfirm.jsp # changeCoverArtConfirm.jsp
changeCoverArtConfirm.failed = \u7121\u6CD5\u4FEE\u6539\u5C08\u8F2F\u5C01\u9762:<br><b>"{0}"</b> 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.skipped = \u7565\u904E
edittags.error = \u932F\u8AA4 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.jsp
podcastreceiver.title = \u64AD\u5BA2\u63A5\u6536\u5668 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.expandall = \u986F\u793A\u6536\u85CF\u96C6
podcastreceiver.collapseall = \u96B1\u85CF\u6536\u85CF\u96C6 podcastreceiver.collapseall = \u96B1\u85CF\u6536\u85CF\u96C6
podcastreceiver.status.new = \u65B0\u7684 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.refresh = \u5237\u65B0\u672C\u9801
podcastreceiver.settings = \u64AD\u5BA2\u8A2D\u5B9A podcastreceiver.settings = \u64AD\u5BA2\u8A2D\u5B9A
podcastreceiver.subscribe = \u8A02\u95B1\u64AD\u5BA2 podcastreceiver.subscribe = \u8A02\u95B1\u64AD\u5BA2
podcastreceiver.newestepisodes = \u6700\u65B0\u7AE0\u7BC0
# lyrics.jsp # lyrics.jsp
lyrics.title = \u6B4C\u8A5E lyrics.title = \u6B4C\u8A5E
lyrics.artist = \u6B4C\u624B lyrics.artist = \u6B4C\u624B
lyrics.song = \u6B4C\u66F2 lyrics.song = \u6B4C\u66F2
lyrics.search = \u641C\u5C0B 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.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.jsp
helppopup.title = {0} \u5354\u52A9 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.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. \ 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,\u5982\u679Cmp3\u539F\u672C\u7684\u58D3\u7E2E\u6BD4\u4F8B\u70BA256Kbps(kilobits per second), \u5982\u679C\u8A2D\u5B9A\u6700\u5927\u50B3\u8F38\u7387\u70BA128\ \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\u8ABF\u964D\u6210 128 Kbps.</p> \u6703\u4F7F {0} \u81EA\u52D5\u5C07\u539F\u672C 256Kbps \u7684\u97F3\u6A02\u7DE8\u78BC\u70BA\u6210 128 Kbps\u3002</p>
helppopup.playlistfolder.title = \u9EDE\u64AD\u6E05\u55AE\u8CC7\u6599\u593E helppopup.playlistfolder.title = \u64AD\u653E\u6E05\u55AE\u8CC7\u6599\u593E
helppopup.playlistfolder.text = <p>\u5B58\u653E\u9EDE\u64AD\u6E05\u55AE\u7684\u8CC7\u6599\u593E.</p> 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.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.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.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.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.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.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>\ 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, %b = \u64A5\u653E\u5668\u7684\u6700\u5927\u50B3\u8F38\u7387)</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.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> \ 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 \
<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, \ \u6A94\u6848\u5F88\u5BB9\u6613\u900F\u904E\u7D22\u5F15\u5B58\u53D6\u3002</p> \
\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>\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 \
<p>\u800C\u7121\u6CD5\u6B78\u985E\u7684\u6A94\u6848\uFF0C\u5C07\u5168\u90E8\u6B78\u65BC "#"\u9805\u76EE\u4E2D.</p> \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.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.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> <p><em>New Incoming "Sound tracks"</em></p>
helppopup.language.title = Language helppopup.language.title = \u8A9E\u8A00
helppopup.language.text = <p>\u5728\u9019\u88E1\u9078\u64C7\u6240\u63D0\u4F9B\u7684\u986F\u793A\u8A9E\u8A00.</p> 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.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.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\ 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.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.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.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.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.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.title = \u4E0A\u50B3\u9650\u5236
helppopup.uploadlimit.text = <p>\u4E0A\u50B3\u6A94\u6848\u6642\u7684\u983B\u5BEC\u9650\u5236.</p> helppopup.uploadlimit.text = <p>\u4E0A\u50B3\u6A94\u6848\u6642\u7684\u983B\u5BEC\u9650\u5236\u3002</p>
helppopup.streamport.title = \u975E-SSL \u4E32\u6D41 Port 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.</p><p>\u6709\u4E9B\u64AD\u653E\u5668 \ 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) \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)\ (\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.</p> \u8ACB\u6CE8\u610F\uFF0C\u4E32\u6D41\u97F3\u6A02\u4E26\u4E0D\u6703\u88AB\u52A0\u5BC6\u3002</p>
helppopup.ldap.title = LDAP \u9A57\u8B49 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). \ 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}, \u5E33\u865F\u53CA\u5BC6\u78BC\u5C31\u7531\u5916\u90E8\u4F3A\u670D\u5668\u9A57\u8B49, \u800C\u4E0D\u662F\u7531{0}\u4F86\u9A57\u8B49.</p> \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.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> \ 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). \u8ACB\u53C3\u8003<a href="http://java.sun.com/products/jndi/tutorial/ldap/misc/url.html" target="_blank">\u9019\u88E1</a> \ (\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.</p> \u6709\u66F4\u591A\u8A73\u7D30\u8AAA\u660E\u3002</p>
helppopup.ldapsearchfilter.title = LDAP \u641C\u5C0B\u904E\u6FFE 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 \ 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: \ The pattern "'{0'}" is replaced by the username, \u4F8B\u5982: \
<ul>\ <ul>\
<li>(uid='{0'}) - this would search for a username match on the uid attribute.</li> \ <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> </ul></p>
helppopup.ldapmanagerdn.title = LDAP \u7BA1\u7406\u8005 DN 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 \ 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.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> \ 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! \u9019\u610F\u5473\u6240\u6709\u5728LDAP\u4E0A\u7684\u4F7F\u7528\u8005\u90FD\u53EF\u4EE5\u767B\u5165\u60A8\u7684{0}, \ <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.</p> \u4E5F\u8A31\u9019\u4E0D\u662F\u60A8\u60F3\u8981\u7684\u529F\u80FD\u3002</p>
helppopup.playername.title = \u64A5\u653E\u5668\u540D\u7A31 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.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\ 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.</p> \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.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.jsp
wap.index.missing = \u627E\u4E0D\u5230\u97F3\u6A02 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.search = \u641C\u5C0B
wap.index.settings = \u8A2D\u5B9A wap.index.settings = \u8A2D\u5B9A
@ -616,7 +848,7 @@ wap.browse.downloadone = \u4E0B\u8F09\u6B4C\u66F2
wap.browse.downloadall = \u5168\u90E8\u4E0B\u8F09 wap.browse.downloadall = \u5168\u90E8\u4E0B\u8F09
# wap/playlist.jsp # 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.noplayer = \u9023\u63A5\u4E0D\u5230\u64AD\u653E\u5668
wap.playlist.clear = \u6E05\u9664 wap.playlist.clear = \u6E05\u9664
wap.playlist.load = \u8F09\u5165 wap.playlist.load = \u8F09\u5165
@ -627,7 +859,7 @@ wap.playlist.play = \u5728\u96FB\u8A71\u4E2D\u64AD\u9001
wap.search.title = \u641C\u5C0B wap.search.title = \u641C\u5C0B
# wap/searchResult.jsp # 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.jsp
wap.settings.selectplayer = \u9078\u64C7\u64AD\u653E\u5668 wap.settings.selectplayer = \u9078\u64C7\u64AD\u653E\u5668

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

@ -2,7 +2,7 @@
<beans xmlns="http://www.springframework.org/schema/beans" <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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 --> <!-- DAO's -->

@ -2,7 +2,7 @@
<beans xmlns="http://www.springframework.org/schema/beans" <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws" 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.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>

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

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

@ -15,6 +15,7 @@ PARAMETERS
showZoom: Whether to display a link for zooming the cover art. showZoom: Whether to display a link for zooming the cover art.
showChange: Whether to display a link for changing 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. 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:choose>
<c:when test="${empty param.coverArtSize}"> <c:when test="${empty param.coverArtSize}">
@ -32,7 +33,7 @@ PARAMETERS
<str:randomString count="5" type="alphabet" var="playId"/> <str:randomString count="5" type="alphabet" var="playId"/>
<div class="coverart dropshadow"> <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:if test="${not empty param.albumId}">
<c:url value="main.view" var="targetUrl"> <c:url value="main.view" var="targetUrl">

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

@ -179,6 +179,13 @@
</tr> </tr>
</table> </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"> <table id="lastFmTable" style="padding-left:2em">
<tr> <tr>
<td><fmt:message key="personalsettings.lastfmusername"/></td> <td><fmt:message key="personalsettings.lastfmusername"/></td>

@ -132,6 +132,14 @@
</td> </td>
<td><c:import url="helpToolTip.jsp"><c:param name="topic" value="autocontrol"/></c:import></td> <td><c:import url="helpToolTip.jsp"><c:param name="topic" value="autocontrol"/></c:import></td>
</tr> </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> </table>
<c:if test="${not empty command.allTranscodings}"> <c:if test="${not empty command.allTranscodings}">

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

@ -2,7 +2,7 @@
<beans xmlns="http://www.springframework.org/schema/beans" <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"> <bean id="leftController" class="org.libresonic.player.controller.LeftController">
<property name="viewName" value="left"/> <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> <parent>
<groupId>org.libresonic.player</groupId> <groupId>org.libresonic.player</groupId>
<artifactId>libresonic</artifactId> <artifactId>libresonic</artifactId>
<version>6.1.beta1</version> <version>6.1.beta2</version>
</parent> </parent>
<build> <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> <parent>
<groupId>org.libresonic.player</groupId> <groupId>org.libresonic.player</groupId>
<artifactId>libresonic</artifactId> <artifactId>libresonic</artifactId>
<version>6.1.beta1</version> <version>6.1.beta2</version>
</parent> </parent>
<build> <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> <modelVersion>4.0.0</modelVersion>
<groupId>org.libresonic.player</groupId> <groupId>org.libresonic.player</groupId>
<artifactId>libresonic</artifactId> <artifactId>libresonic</artifactId>
<version>6.1.beta1</version> <version>6.1.beta2</version>
<name>Libresonic</name> <name>Libresonic</name>
<packaging>pom</packaging> <packaging>pom</packaging>
<organization> <organization>
@ -212,6 +212,10 @@
<configuration> <configuration>
<failOnWarning>${failOnDependencyWarning}</failOnWarning> <failOnWarning>${failOnDependencyWarning}</failOnWarning>
<ignoreNonCompile>true</ignoreNonCompile> <ignoreNonCompile>true</ignoreNonCompile>
<ignoredUnusedDeclaredDependencies>
<ignoredUnusedDeclaredDependency>com.sun.mail:javax.mail*</ignoredUnusedDeclaredDependency>
<ignoredUnusedDeclaredDependency>org.seamless:seamless-http*</ignoredUnusedDeclaredDependency>
</ignoredUnusedDeclaredDependencies>
</configuration> </configuration>
</execution> </execution>
</executions> </executions>

Loading…
Cancel
Save