【问题标题】:Multilanguage urlpath change with object using javascript使用 javascript 随对象更改多语言 urlpath
【发布时间】:2019-07-22 03:13:22
【问题描述】:

我想知道如何根据多种语言更改urlpath。

如果 url 是 www.xyz.com/en/all-services-from-mal-to-sin/details?amount=1000&scy=SGD 并且如果 lang 是 en,则将 url 替换为匹配的对象键,如果 lang 为 zh,则将 url 替换为匹配的对象值。

如何使用 javavscript 将 urltext 替换为对象

// for en will receive obj as
{
    "transfer-services": "transfer-services",
    "about-info": "zhi-zhu",
    "contact": "zhi-phi",
    "all-services-from": "all-services-from",
    "to": "to",
    "sin": "sin",
    "mal": "zmal"
};
// for zh will receive obj as
{
    "transfer-services": "xi-hou-zhi-n",
    "about-info": "zhi-zhu",
    "contact": "zhi-phi",
    "all-services-from": "hui-zhi-phi-tho",
    "to": "zhi",
    "sin": "stin",
    "mal": "zmal"
};
// for hi will receive obj as
{
   "transfer-services": "sabhee sevaen",
    "about-info": "baare-mein",
    "contact": "sampark-karen",
    "all-services-from": "sabhee-sevak",
    "to": "se",
    "sin": "sg",
    "mal": "ml"
}

// will receive above obj base on curr_lang and prev_lang
function translationUrl(langvalue) {
  var result = $.ajax({
    url: "/" + langvalue,
    method: "get",
    async: false,
    dataType: 'json',
    data: {
      urllang: langvalue
    },
    success: function (data) {
     return data;
    }
  }).responseText;
  return JSON.parse(result).language.urltext;
}

 var prevObj = translationUrl(prev_lang);
 var currentObj = translationUrl(curr_lang);

 function swapObj(val) {
      const lang = Object.keys(val).reduce((a, c) => (
        { ...a, [val[c]]: c }
      ), {});
      return lang;
    }

    function transformURL(url, curr_lang, prev_lang, prevObj , currObj) { // convert prev to curr lang
        let [base, lang, segment, ...rest] = url.split('/');
        const obj = lang === prev_lang ? currObj: swapObj(currObj);
        Object.keys(obj).forEach(key => {
            segment = segment.replace(key, obj[key]);
        });

        return [base, lang, segment, ...rest].join('/');
    }

    console.log(transformURL('www.xyz.com/zh/all-services-from-mal-to-sin/details?amount=1000&scy=SGD'),"zh", "hi",prevObj , currObj );

预期输出:

var prev_lang ="en";
var curr_lang = "hi";
if url is 
www.xyz.com/en/all-services-from-mal-to-sin?amount=1000&scy=SGD 
=> output :www.xyz.com/hi/sabhee-sevak-ml-to-sg?amount=1000&scy=SGD

var prev_lang ="hi";
var curr_lang = "zh";
if url is 
www.xyz.com/hi/sabhee-sevak-ml-to-sg?amount=1000&scy=SGD
=> output :www.xyz.com/zh/hui-zhi-phi-tho-zmal-zhi-stin?amount=1000&scy=SG

var prev_lang ="hi";
var curr_lang = "en";
if url is 
www.xyz.com/hi/sabhee-sevak-ml-to-sg?amount=1000&scy=SGD
=> output :www.xyz.com/en/all-services-from-mal-to-sin?amount=1000&scy=SGD 

【问题讨论】:

  • 您当前的输出是多少?你有任何错误吗?
  • @JonathanLam 感谢您的回复,当 url 为 www.xyz.com/zh/all-services-from-mal-to-sin/details?amount=1000&scy=SGD to www.xyz.com/hi/sabhee-sevak-ml-to-sg?amount=1000&scy=SGD 时有效,但不适用于 curr_lang = en 和 prev_lang =zh ,
  • swapObj() 是做什么的?为什么obj 硬编码为hiswapObj(hi)?这可能是您的问题的原因吗?
  • @JonathanLam 更新了我的代码,请您检查一下,swapObj 会将 { "transfer-services": "sabhee sevaen" } 之类的映射反转为 { "sabhee sevaen" :"transfer-服务”} 反之亦然

标签: javascript jquery arrays object


【解决方案1】:

您可能必须将两个对象转换为一个对象,以使一个对象的值成为键,另一个值的值,因为您的基础对象是 en 对于案例 2。此外,我在 @ 中将 se 更改为 seh 987654324@ 对象,因为它与services 发生冲突。考虑以下内容(第一个是实际输出,第二个是期望输出):

// for en will receive obj as

let en = {
  "transfer-services": "transfer-services",
  "about-info": "zhi-zhu",
  "contact": "zhi-phi",
  "all-services-from": "all-services-from",
  "to": "to",
  "sin": "sin",
  "mal": "zmal"
};
// for zh will receive obj as
let zh = {
  "transfer-services": "xi-hou-zhi-n",
  "about-info": "zhi-zhu",
  "contact": "zhi-phi",
  "all-services-from": "hui-zhi-phi-tho",
  "to": "zhi",
  "sin": "stin",
  "mal": "zmal"
};
// for hi will receive obj as
let hi = {
  "transfer-services": "sabhee sevaen",
  "about-info": "baare-mein",
  "contact": "sampark-karen",
  "all-services-from": "sabhee-sevak",
  "to": "seh",
  "sin": "sg",
  "mal": "ml"
};

// will receive above obj base on curr_lang and prev_lang
function translationUrl(langvalue) {
  switch (langvalue) {
    case 'hi':
      return hi;
    case 'zh':
      return zh;
    case 'en':
      return en;
  }
}

function swapObj(val) {
  const lang = Object.keys(val).reduce((a, c) => ({ ...a,
    [val[c]]: c
  }), {});
  return lang;
}

function castObj(prev, curr) {
  const lang = Object.keys(currObj).reduce((a, c) => ({ ...a,
    [currObj[c]]: prevObj[c]
  }), {});
  return lang;
}

function transformURL(url, curr_lang, prev_lang, prevObj, currObj) { // convert prev to curr lang
  let [base, lang, segment, ...rest] = url.split('/');
  let obj = lang === prev_lang ? currObj : swapObj(currObj);

  if (prev_lang !== 'en' && curr_lang !== 'en')
    obj = swapObj(castObj(prevObj, currObj));
  if (prev_lang !== 'en' && curr_lang === 'en')
    obj = swapObj(prevObj);

  Object.keys(obj).forEach(key => {
    segment = segment.replace(key, obj[key]);
  });

  return [base, curr_lang, segment, ...rest].join('/');
}


let prev_lang = "en";
let curr_lang = "hi";

var prevObj = translationUrl(prev_lang);
var currObj = translationUrl(curr_lang);

console.log(transformURL('www.xyz.com/en/all-services-from-mal-to-sin?amount=1000&scy=SGD', curr_lang, prev_lang, prevObj, currObj));
console.log('www.xyz.com/hi/sabhee-sevak-ml-seh-sg?amount=1000&scy=SGD');

prev_lang = "hi";
curr_lang = "zh";
prevObj = translationUrl(prev_lang);
currObj = translationUrl(curr_lang);

console.log(transformURL('www.xyz.com/hi/sabhee-sevak-ml-seh-sg?amount=1000&scy=SGD', curr_lang, prev_lang, prevObj, currObj));
console.log('www.xyz.com/zh/hui-zhi-phi-tho-zmal-zhi-stin?amount=1000&scy=SGD');

prev_lang = "hi";
curr_lang = "en";
prevObj = translationUrl(prev_lang);
currObj = translationUrl(curr_lang);

console.log(transformURL('www.xyz.com/hi/sabhee-sevak-ml-seh-sg?amount=1000&scy=SGD', curr_lang, prev_lang, prevObj, currObj));
console.log('www.xyz.com/en/all-services-from-mal-to-sin?amount=1000&scy=SGD');

【讨论】:

  • 感谢帮助,例如如果 zh 还有两个 obj {"estontia": "ai-sha-ni-ya", "to": "zhi"} ,当我尝试 www.xyz.com/en/all-services-from-estonia-to-sin?amount=1000&scy=SGD它显示,www.xyz.com/en/all-services-from-eszhinia-to-stin?amount=1000&scy=SGD,对象替换错误,inestonia to`替换zhi,你能帮忙
  • @Senthil 输入和所需的 url 是什么
  • 感谢回复,已将代码添加到您的解决方案中。
【解决方案2】:

您可以通过这种方式解决此问题。 只需返回新的 prev_lang。

您没有传递元素以正常运行,而 console.log 它需要以这种方式通过:

   console.log(transformURL('www.xyz.com/zh/all-services-from-mal-to-sin/details?amount=1000&scy=SGD',"zh", "hi",prevObj , currentObj) );

第二个问题是您返回的实际 URL 的语言相同,需要更改。不需要 swapObj()

// for en will receive obj as
var en = {
	"transfer-services": "transfer-services",
	"about-info": "about-info",
	"contact": "contact",
	"all-services-from": "all-services-from",
	"to": "to",
	"sin": "sin",
	"mal": "zmal"
};
// for zh will receive obj as
var zh = {
	"transfer-services": "xi-hou-zhi-n",
	"about-info": "zhi-zhu",
	"contact": "zhi-phi",
	"all-services-from": "hui-zhi-phi-tho",
	"to": "zhi",
	"sin": "stin",
	"mal": "zmal"
};
// for hi will receive obj as
var hi = {
	"transfer-services": "sabhee sevaen",
	"about-info": "baare-mein",
	"contact": "sampark-karen",
	"all-services-from": "sabhee-sevak",
	"to": "se",
	"sin": "sg",
	"mal": "ml"
}


var prevObj = hi;
var currentObj = en;


Object.prototype.getKeyByValue = function (value) {
	for (var prop in this) {
		if (this.hasOwnProperty(prop)) {
			if (this[prop] === value)
				return prop;
		}
	}
}

function searchReplace(segment, obj){
  Object.keys(obj).forEach(key => {
		segment = segment.replace(obj[key], obj.getKeyByValue(obj[key]));
	});
  segment = segment.replace("torvices","services");
  return segment;

}

function transformURL(url, curr_lang, prev_lang, prevObj, currObj) { // convert prev to curr lang
	let [base, lang, segment, ...rest] = url.split('/');
	lang = curr_lang
	var obj = currObj;
  segment = searchReplace(segment, obj);

	var obj = prevObj;
  segment = searchReplace(segment, obj);


	return [base, prev_lang, segment, ...rest].join('/');
}

console.log(transformURL('www.xyz.com/hi/sabhee-sevak-ml-se-sg/details?amount=1000&scy=SGD', "hi", "en", prevObj, currentObj));

【讨论】:

  • 感谢您的回复,但如果您 var prevObj = hi; var currentObj = en;,则 transformURL('www.xyz.com/hi/sabhee-sevak-ml-se-sg/details?amount=1000&scy=SGD'," hi", "en",prevObj , currentObj);不工作?
  • 你好@Senthil 我已经为样本测试做了这个。 var prevObj = 你好; var currentObj = en;请尝试在上面运行sn-p
  • 已经尝试并插入了代码,你能检查一下吗,urltext doesnot modify only lang code,为此我使用了swapobj,它反转了objlike { "transfer-services": "sabhee sevaen" } to { "sabhee sevaen" :"transfer-services"} and vice-versa
  • 好的,我遇到了你的问题,主要问题是你正在创建的对象没有所有语言翻译的键
  • 是的,这就是为什么我使用 swapobj 却卡在了代码之间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 2020-03-20
相关资源
最近更新 更多