Index: applications/editors/josm/plugins/tag2link/resources/tag2link_sources.xml
===================================================================
--- applications/editors/josm/plugins/tag2link/resources/tag2link_sources.xml	(revision 26953)
+++ applications/editors/josm/plugins/tag2link/resources/tag2link_sources.xml	(revision 26956)
@@ -49,5 +49,5 @@
     <source name="WHC">
         <rule>
-            <condition k="ref:whc" v="\p{Digit}+" />
+            <condition k="ref:whc" v="[0-9-]+" />
             <link name="View UNESCO sheet" href="http://whc.unesco.org/%lang(en,fr):en%/list/%v%" />
         </rule>
Index: applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/Tag2LinkPlugin.java
===================================================================
--- applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/Tag2LinkPlugin.java	(revision 26953)
+++ applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/Tag2LinkPlugin.java	(revision 26956)
@@ -28,6 +28,6 @@
  * Main class of tag2link plugin.
  * @author Don-vip
- * @version 0.2a
  * History:
+ * 0.2b 24-Oct-2011 UNESCO WHC rule working
  * 0.2a 23-Oct-2011 add Mail support + initial work on UNESCO WHC
  * 0.1c 23-Oct-2011 add MHS rule (French heritage)
Index: applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/Tag2LinkRuleChecker.java
===================================================================
--- applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/Tag2LinkRuleChecker.java	(revision 26953)
+++ applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/Tag2LinkRuleChecker.java	(revision 26956)
@@ -20,7 +20,9 @@
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Locale;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
@@ -63,5 +65,27 @@
 				while (m.find()) {
 					String arg = m.group(1);
+					
+					// Search for a standard value
 					String val = findValue(arg, eval.matchingTags);
+					
+					// No standard value found: test lang() function
+					if (val == null) {
+						Matcher lm = Pattern.compile(".*lang(?:\\((\\p{Lower}{2,})(?:,(\\p{Lower}{2,}))*\\))?.*").matcher(arg);
+						if (lm.matches()) {
+							String josmLang = Main.pref.get("language");
+							String jvmLang = (josmLang.isEmpty() ? Locale.getDefault().getLanguage() : josmLang).split("_")[0];
+							if (lm.groupCount() == 0) {
+								val = jvmLang;
+							} else {
+								for (int i = 1; i<=lm.groupCount() && val == null; i++) {
+									if (jvmLang.equals(lm.group(i))) {
+										val = jvmLang;
+									}
+								}
+							}
+						}
+					}
+					
+					// Find a default value if set after ":"
 					if (val == null && arg.contains(":")) {
 						String[] vars = arg.split(":");
@@ -74,14 +98,6 @@
 						}
 					}
-					if (val == null) {
-						Matcher lm = Pattern.compile("lang(?:\\(\\p{Lower}{2,}(?:,\\p{Lower}{2,})*\\))?(?::(\\p{Lower}{2,}))?").matcher(arg);
-						if (lm.matches()) {
-							if (lm.groupCount() == 0) {
-								// TODO: get JOSM current language
-							} else {
-								// TODO: parse next groups
-							}
-						}
-					}
+					
+					// Has a value been found ?
 					if (val != null) {
 						try {
@@ -95,5 +111,5 @@
 							}
 							// Finally replace parameter
-							copy.url = copy.url.replaceFirst(m.group(), val);
+							copy.url = copy.url.replaceFirst(Pattern.quote(m.group()), val);
 						} catch (UnsupportedEncodingException e) {
 							e.printStackTrace();
