diff --git a/share/mk/doc.common.mk b/share/mk/doc.common.mk
index 153000c58c..1ccd364892 100644
--- a/share/mk/doc.common.mk
+++ b/share/mk/doc.common.mk
@@ -20,58 +20,83 @@ DOC_PREFIX?=	${WEB_PREFIX}/../doc
 # Liberal default of maximum of 10 directories below to find it.
 #
 
+.if defined(DOC_PREFIX) && !empty(DOC_PREFIX)
+DOC_PREFIX_NAME!=	realpath ${DOC_PREFIX}
+DOC_PREFIX_NAME:=	${DOC_PREFIX_NAME:T}
+.else
 DOC_PREFIX_NAME?=	doc
-WWW_PREFIX_NAME?=	www
+.endif
 
-.if !defined(LANGCODE) || empty(LANGCODE) || !defined(WWW_LANGCODE) || empty(WWW_LANGCODE)
-# Calculate LANGCODE.
-LANGCODE:=	${.CURDIR}
+.if defined(WEB_PREFIX) && !empty(WEB_PREFIX)
+WWW_PREFIX_NAME!=	realpath ${WEB_PREFIX}
+WWW_PREFIX_NAME:=	${WWW_PREFIX_NAME:T}
+.else
+WWW_PREFIX_NAME?=	www
+.endif
+
+.if (!defined(LANGCODE) || empty(LANGCODE)) && (!defined(WWW_LANGCODE) || empty(WWW_LANGCODE))
+# Calculate _LANGCODE.
+_LANGCODE:=	${.CURDIR}
 .for _ in 1 2 3 4 5 6 7 8 9 10
-.if !(${LANGCODE:H:T} == ${DOC_PREFIX_NAME}) && !(${LANGCODE:H:T} == ${WWW_PREFIX_NAME})
-LANGCODE:=	${LANGCODE:H}
+.if !(${_LANGCODE:H:T} == ${DOC_PREFIX_NAME}) && !(${_LANGCODE:H:T} == ${WWW_PREFIX_NAME})
+_LANGCODE:=	${_LANGCODE:H}
 .endif
 .endfor
-.if (${LANGCODE:H:T} == ${DOC_PREFIX_NAME})
+.if (${_LANGCODE:H:T} == ${DOC_PREFIX_NAME})
 # We are in doc/.
-LANGCODE:=	${LANGCODE:T}
-WWW_LANGCODE:=	.
+_LANGCODE:=	${_LANGCODE:T}
+_WWW_LANGCODE:=	.
 .else
 # We are in www/.
-WWW_LANGCODE:=	${LANGCODE:T}
-LANGCODE:=	.
+_WWW_LANGCODE:=	${_LANGCODE:T}
+_LANGCODE:=	.
+.endif
+.else
+# when LANGCODE or WWW_LANGCODE is defined, use the value.
+.if defined(LANGCODE) && !empty(LANGCODE)
+_LANGCODE?=	${LANGCODE}
+.else
+_LANGCODE?=	.
+.endif
+.if defined(WWW_LANGCODE) && !empty(WWW_LANGCODE)
+_WWW_LANGCODE?=	${WWW_LANGCODE}
+.else
+_WWW_LANGCODE?=	.
 .endif
 .endif
 
-# fixup LANGCODE
-.if (${LANGCODE} == .)
-# We have a short name such as `en' in ${WWW_LANGCODE} now.
-# Guess LANGCODE using WWW_LANGCODE.
-LANGCODE:=	${WWW_LANGCODE}
-.if (${LANGCODE} != .)
-LANGCODE!=	${ECHO} ${DOC_PREFIX}/${WWW_LANGCODE}*
+# fixup _LANGCODE
+.if (${_LANGCODE} == .)
+# We have a short name such as `en' in ${_WWW_LANGCODE} now.
+# Guess _LANGCODE using _WWW_LANGCODE.
+_LANGCODE:=	${_WWW_LANGCODE}
+.if (${_LANGCODE} != .)
+_LANGCODE!=	${ECHO} ${DOC_PREFIX}/${_WWW_LANGCODE}*
 .for _ in 1 2 3 4 5 6 7 8 9 10
-.if !(${LANGCODE:H:T} == ${DOC_PREFIX_NAME})
-LANGCODE:=	${LANGCODE:H}
+.if !(${_LANGCODE:H:T} == ${DOC_PREFIX_NAME})
+_LANGCODE:=	${_LANGCODE:H}
 .endif
 .endfor
-LANGCODE:=	${LANGCODE:T}
+_LANGCODE:=	${_LANGCODE:T}
 .endif
 .endif
+LANGCODE?=	${_LANGCODE}
 
-# fixup WWW_LANGCODE
-.if (${WWW_LANGCODE} == .)
+# fixup _WWW_LANGCODE
+.if (${_WWW_LANGCODE} == .)
 # We have a long name such as `en_US.ISO8859-1' in ${LANGCODE} now.
-# Guess WWW_LANGCODE using LANGCODE.
-WWW_LANGCODE!=	${ECHO} ${WEB_PREFIX}/*
-WWW2_LANGCODE!=	${ECHO} ${WWW_LANGCODE:T} |\
+# Guess _WWW_LANGCODE using _LANGCODE.
+_WWW_LANGCODE!=	${ECHO} ${WEB_PREFIX}/*
+_WWW2_LANGCODE!=	${ECHO} ${_WWW_LANGCODE:T} |\
 		${SED} -e 's,.*\(${LANGCODE:R:C,(..)_.*,\1,}[^. ]*\).*,\1,'
-.if ${WWW_LANGCODE:T} == ${WWW2_LANGCODE}
-WWW_LANGCODE:= .
+.if ${_WWW_LANGCODE:T} == ${_WWW2_LANGCODE}
+_WWW_LANGCODE:= .
 .else
-WWW_LANGCODE:= ${WWW2_LANGCODE}
+_WWW_LANGCODE:= ${_WWW2_LANGCODE}
 .endif
-.undef WWW2_LANGCODE
+.undef _WWW2_LANGCODE
 .endif
+WWW_LANGCODE?=	${_WWW_LANGCODE}
 
 # ------------------------------------------------------------------------
 #