about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--chat.c19
-rw-r--r--command.c18
-rw-r--r--handle.c164
-rw-r--r--ui.c2
-rw-r--r--url.c2
5 files changed, 107 insertions, 98 deletions
diff --git a/chat.c b/chat.c
index ba6c9a1..91647a3 100644
--- a/chat.c
+++ b/chat.c
@@ -72,9 +72,9 @@ static void genCert(const char *path) {
 }
 
 char *idNames[IDCap] = {
-	[None] = "<none>",
-	[Debug] = "<debug>",
-	[Network] = "<network>",
+	[None] = "<ala>",
+	[Debug] = "<pali>",
+	[Network] = "<ma>",
 };
 enum Color idColors[IDCap] = {
 	[None] = Black,
@@ -363,11 +363,18 @@ int main(int argc, char *argv[]) {
 	uiShowID(Network);
 	uiFormat(
 		Network, Cold, NULL,
-		"\3%dcatgirl\3\tis GPLv3 fwee softwawe ^w^  "
-		"code is avaiwable fwom https://git.causal.agency/catgirl",
+		"jan ale li ken kepeken, li lukin, li ante e kon pi ilo \3%dMeli Soweli\3 a!",
 		Pink
 	);
-	uiFormat(Network, Cold, NULL, "Traveling...");
+	uiFormat(
+		Network, Cold, NULL,
+		"awen pi ilo ni li lipu GPLv3 ^w^ mu"
+	);
+	uiFormat(
+		Network, Cold, NULL,
+		"sina ken kama jo e kon pi ilo ni tan https://git.causal.agency/catgirl"
+	);
+	uiFormat(Network, Cold, NULL, "tawa...");
 	uiDraw();
 
 	sandboxEarly(log);
diff --git a/command.c b/command.c
index 335c396..43315f0 100644
--- a/command.c
+++ b/command.c
@@ -440,16 +440,16 @@ static void commandFilter(enum Heat heat, uint id, char *params) {
 	if (params) {
 		struct Filter filter = filterAdd(heat, params);
 		uiFormat(
-			id, Cold, NULL, "%sing \3%02d%s %s %s %s",
-			(heat == Hot ? "Highlight" : "Ignor"), Brown, filter.mask,
+			id, Cold, NULL, "%s \3%02d%s %s %s %s",
+			(heat == Hot ? "wile" : "wile ala"), Brown, filter.mask,
 			(filter.cmd ?: ""), (filter.chan ?: ""), (filter.mesg ?: "")
 		);
 	} else {
 		for (size_t i = 0; i < FilterCap && filters[i].mask; ++i) {
 			if (filters[i].heat != heat) continue;
 			uiFormat(
-				Network, Warm, NULL, "%sing \3%02d%s %s %s %s",
-				(heat == Hot ? "Highlight" : "Ignor"), Brown, filters[i].mask,
+				Network, Warm, NULL, "%s \3%02d%s %s %s %s",
+				(heat == Hot ? "wile" : "wile ala"), Brown, filters[i].mask,
 				(filters[i].cmd ?: ""), (filters[i].chan ?: ""),
 				(filters[i].mesg ?: "")
 			);
@@ -462,8 +462,8 @@ static void commandUnfilter(enum Heat heat, uint id, char *params) {
 	struct Filter filter = filterParse(heat, params);
 	bool found = filterRemove(filter);
 	uiFormat(
-		id, Cold, NULL, "%s %sing \3%02d%s %s %s %s",
-		(found ? "No longer" : "Not"), (heat == Hot ? "highlight" : "ignor"),
+		id, Cold, NULL, "%s %s \3%02d%s %s %s %s",
+		(found ? "pini" : "sina lon ala"), (heat == Hot ? "lukin" : "lukin ala"),
 		Brown, filter.mask, (filter.cmd ?: ""), (filter.chan ?: ""),
 		(filter.mesg ?: "")
 	);
@@ -509,7 +509,7 @@ static void commandHelp(uint id, char *params) {
 		return;
 	}
 	if (self.restricted) {
-		uiFormat(id, Warm, NULL, "See catgirl(1) or /help index");
+		uiFormat(id, Warm, NULL, "o lukin e lipu catgirl(1) anu o toki e ni: /help index");
 		return;
 	}
 
@@ -664,14 +664,14 @@ void command(uint id, char *input) {
 		cmd, Commands, ARRAY_LEN(Commands), sizeof(*handler), compar
 	);
 	if (!handler) {
-		uiFormat(id, Warm, NULL, "No such command %s", cmd);
+		uiFormat(id, Warm, NULL, "mi sona ala e toki ilo '%s'", cmd);
 		return;
 	}
 	if (
 		(self.restricted && handler->flags & Restrict) ||
 		(self.kiosk && handler->flags & Kiosk)
 	) {
-		uiFormat(id, Warm, NULL, "Command %s is unavailable", cmd);
+		uiFormat(id, Warm, NULL, "sina ken ala kepeken toki ilo '%s'", cmd);
 		return;
 	}
 
diff --git a/handle.c b/handle.c
index e460c7c..6b40768 100644
--- a/handle.c
+++ b/handle.c
@@ -83,7 +83,7 @@ static void require(struct Message *msg, bool origin, uint len) {
 	}
 	for (uint i = 0; i < len; ++i) {
 		if (msg->params[i]) continue;
-		errx(EX_PROTOCOL, "%s missing parameter %u", msg->cmd, 1 + i);
+		errx(EX_PROTOCOL, "%s li wile e nimi '%u'", msg->cmd, 1 + i);
 	}
 }
 
@@ -168,7 +168,7 @@ static void handleCap(struct Message *msg) {
 		}
 		if (!(self.caps & CapSASL)) ircFormat("CAP END\r\n");
 	} else if (!strcmp(msg->params[1], "NAK")) {
-		errx(EX_CONFIG, "server does not support %s", msg->params[2]);
+		errx(EX_CONFIG, "kulupu li wile ala e %s", msg->params[2]);
 	}
 }
 
@@ -210,10 +210,10 @@ static void handleAuthenticate(struct Message *msg) {
 
 	byte buf[299] = {0};
 	size_t len = 1 + strlen(self.plain);
-	if (sizeof(buf) < len) errx(EX_USAGE, "SASL PLAIN is too long");
+	if (sizeof(buf) < len) errx(EX_USAGE, "open nasin SASL PLAIN li mute ike");
 	memcpy(&buf[1], self.plain, len - 1);
 	byte *sep = memchr(buf, ':', len);
-	if (!sep) errx(EX_USAGE, "SASL PLAIN missing colon");
+	if (!sep) errx(EX_USAGE, "open nasin SASL PLAIN li jo ala e nimi lili ':'");
 	*sep = 0;
 
 	char b64[BASE64_SIZE(sizeof(buf))];
@@ -263,7 +263,7 @@ static void handleReplyISupport(struct Message *msg) {
 			set(&network.name, msg->params[i]);
 			uiFormat(
 				Network, Cold, tagTime(msg),
-				"You arrive in %s", msg->params[i]
+				"sina kama lon ma %s", msg->params[i]
 			);
 		} else if (!strcmp(key, "USERLEN")) {
 			if (!msg->params[i]) continue;
@@ -282,7 +282,7 @@ static void handleReplyISupport(struct Message *msg) {
 			char *modes = strsep(&msg->params[i], ")");
 			char *prefixes = msg->params[i];
 			if (!modes || !prefixes || strlen(modes) != strlen(prefixes)) {
-				errx(EX_PROTOCOL, "invalid PREFIX value");
+				errx(EX_PROTOCOL, "nimi PREFIX li jo ala e nimi ike");
 			}
 			set(&network.prefixModes, modes);
 			set(&network.prefixes, prefixes);
@@ -292,7 +292,7 @@ static void handleReplyISupport(struct Message *msg) {
 			char *setParam = strsep(&msg->params[i], ",");
 			char *channel = strsep(&msg->params[i], ",");
 			if (!list || !param || !setParam || !channel) {
-				errx(EX_PROTOCOL, "invalid CHANMODES value");
+				errx(EX_PROTOCOL, "nimi CHANMODES li jo e nimi ike");
 			}
 			set(&network.listModes, list);
 			set(&network.paramModes, param);
@@ -351,7 +351,7 @@ static void handleJoin(struct Message *msg) {
 	}
 	uiFormat(
 		id, filterCheck(Cold, id, msg), tagTime(msg),
-		"\3%02d%s\3\t%s%s%sarrives in \3%02d%s\3",
+		"jan \3%02d%s\3\t%s%s%sli kama lon tomo \3%02d%s\3",
 		hash(msg->user), msg->nick,
 		(msg->params[2] ? "(" : ""),
 		(msg->params[2] ?: ""),
@@ -384,7 +384,7 @@ static void handlePart(struct Message *msg) {
 	if (heat > Ice) urlScan(id, msg->nick, msg->params[1]);
 	uiFormat(
 		id, heat, tagTime(msg),
-		"\3%02d%s\3\tleaves \3%02d%s\3%s%s",
+		"jan \3%02d%s\3\tli weka lon tomo \3%02d%s\3%s%s",
 		hash(msg->user), msg->nick, hash(msg->params[0]), msg->params[0],
 		(msg->params[1] ? ": " : ""), (msg->params[1] ?: "")
 	);
@@ -403,7 +403,7 @@ static void handleKick(struct Message *msg) {
 	urlScan(id, msg->nick, msg->params[2]);
 	uiFormat(
 		id, (kicked ? Hot : Cold), tagTime(msg),
-		"%s\3%02d%s\17\tkicks \3%02d%s\3 out of \3%02d%s\3%s%s",
+		"jan %s\3%02d%s\17\tli weka e \3%02d%s\3 tan tomo \3%02d%s\3%s%s",
 		(kicked ? "\26" : ""),
 		hash(msg->user), msg->nick,
 		completeColor(id, msg->params[1]), msg->params[1],
@@ -431,7 +431,7 @@ static void handleNick(struct Message *msg) {
 		}
 		uiFormat(
 			id, filterCheck(Cold, id, msg), tagTime(msg),
-			"\3%02d%s\3\tis now known as \3%02d%s\3",
+			"jan \3%02d%s\3\tli kama jan \3%02d%s\3",
 			hash(msg->user), msg->nick, hash(msg->user), msg->params[0]
 		);
 		if (id == Network) continue;
@@ -448,9 +448,8 @@ static void handleSetname(struct Message *msg) {
 	for (uint id; (id = completeID(msg->nick));) {
 		uiFormat(
 			id, filterCheck(Cold, id, msg), tagTime(msg),
-			"\3%02d%s\3\tis now known as \3%02d%s\3 (%s\17)",
-			hash(msg->user), msg->nick, hash(msg->user), msg->nick,
-			msg->params[0]
+			"nimi pi jan \3%02d%s\3\tli kama nimi \"%s\17\"",
+			hash(msg->user), msg->nick, msg->params[0]
 		);
 	}
 }
@@ -462,7 +461,7 @@ static void handleQuit(struct Message *msg) {
 		if (heat > Ice) urlScan(id, msg->nick, msg->params[0]);
 		uiFormat(
 			id, heat, tagTime(msg),
-			"\3%02d%s\3\tleaves%s%s",
+			"jan \3%02d%s\3\tli weka tan kulupu%s%s",
 			hash(msg->user), msg->nick,
 			(msg->params[0] ? ": " : ""), (msg->params[0] ?: "")
 		);
@@ -482,14 +481,14 @@ static void handleInvite(struct Message *msg) {
 		set(&self.invited, msg->params[1]);
 		uiFormat(
 			Network, filterCheck(Hot, Network, msg), tagTime(msg),
-			"\3%02d%s\3\tinvites you to \3%02d%s\3",
+			"jan \3%02d%s\3\tli wile e lon sina pi tomo \3%02d%s\3",
 			hash(msg->user), msg->nick, hash(msg->params[1]), msg->params[1]
 		);
 	} else {
 		uint id = idFor(msg->params[1]);
 		uiFormat(
 			id, Cold, tagTime(msg),
-			"\3%02d%s\3\tinvites %s to \3%02d%s\3",
+			"jan \3%02d%s\3\tli wile e lon jan %s pi tomo \3%02d%s\3",
 			hash(msg->user), msg->nick,
 			msg->params[0],
 			hash(msg->params[1]), msg->params[1]
@@ -518,7 +517,7 @@ static void handleErrorUserOnChannel(struct Message *msg) {
 	uint id = idFor(msg->params[2]);
 	uiFormat(
 		id, Warm, tagTime(msg),
-		"\3%02d%s\3 is already in \3%02d%s\3",
+		"jan \3%02d%s\3 li lon tomo \3%02d%s\3",
 		completeColor(id, msg->params[1]), msg->params[1],
 		hash(msg->params[2]), msg->params[2]
 	);
@@ -544,7 +543,7 @@ static void handleReplyNames(struct Message *msg) {
 	if (ptr == buf) return;
 	uiFormat(
 		id, (replies[ReplyNamesAuto] ? Cold : Warm), tagTime(msg),
-		"In \3%02d%s\3 are %s",
+		"jan lon pi tomo \3%02d%s\3: %s",
 		hash(msg->params[2]), msg->params[2], buf
 	);
 }
@@ -571,7 +570,7 @@ static void handleReplyWho(struct Message *msg) {
 	require(msg, false, 7);
 	if (who.ptr == who.buf) {
 		who.ptr = seprintf(
-			who.ptr, who.end, "The council of \3%02d%s\3 are ",
+			who.ptr, who.end, "jan lawa lon pi tomo \3%02d%s\3: ",
 			hash(msg->params[1]), msg->params[1]
 		);
 	}
@@ -583,7 +582,7 @@ static void handleReplyWho(struct Message *msg) {
 		who.ptr, who.end, "%s\3%02d%s%s\3%s",
 		(who.ptr[-1] == ' ' ? "" : ", "),
 		hash(msg->params[2]), prefixes, msg->params[5],
-		(msg->params[6][0] == 'H' ? "" : " (away)")
+		(msg->params[6][0] == 'H' ? "" : " (weka)")
 	);
 }
 
@@ -597,7 +596,7 @@ static void handleReplyNoTopic(struct Message *msg) {
 	require(msg, false, 2);
 	uiFormat(
 		idFor(msg->params[1]), Warm, tagTime(msg),
-		"There is no sign in \3%02d%s\3",
+		"tomo \3%02d%s\3 li jo ala e sitelen tomo",
 		hash(msg->params[1]), msg->params[1]
 	);
 }
@@ -623,7 +622,7 @@ static void handleReplyTopic(struct Message *msg) {
 	urlScan(id, NULL, msg->params[2]);
 	uiFormat(
 		id, (replies[ReplyTopicAuto] ? Cold : Warm), tagTime(msg),
-		"The sign in \3%02d%s\3 reads: %s",
+		"sitelen pi tomo \3%02d%s\3 li toki e ni: %s",
 		hash(msg->params[1]), msg->params[1], msg->params[2]
 	);
 	logFormat(
@@ -650,7 +649,7 @@ static void handleTopic(struct Message *msg) {
 		topicComplete(id, NULL);
 		uiFormat(
 			id, Warm, tagTime(msg),
-			"\3%02d%s\3\tremoves the sign in \3%02d%s\3",
+			"jan \3%02d%s\3\tli weka e sitelen pi tomo \3%02d%s\3",
 			hash(msg->user), msg->nick, hash(msg->params[0]), msg->params[0]
 		);
 		logFormat(
@@ -706,7 +705,7 @@ plain:
 	urlScan(id, msg->nick, msg->params[1]);
 	uiFormat(
 		id, Warm, tagTime(msg),
-		"\3%02d%s\3\tplaces a new sign in \3%02d%s\3: %s",
+		"jan \3%02d%s\3\tli pana e sitelen pi tomo \3%02d%s\3: %s",
 		hash(msg->user), msg->nick, hash(msg->params[0]), msg->params[0],
 		(ptr > buf ? buf : msg->params[1])
 	);
@@ -717,11 +716,11 @@ plain:
 }
 
 static const char *UserModes[256] = {
-	['O'] = "local oper",
-	['i'] = "invisible",
-	['o'] = "oper",
-	['r'] = "registered",
-	['w'] = "wallops",
+	['O'] = "jan pi kulupu lawa",
+	['i'] = "sina taso lon tomo pi jan ni, la sina ken lukin e jan ni",
+	['o'] = "jan pi kulupu lawa",
+	['r'] = "ilo lawa ma li sona jan ni",
+	['w'] = "jan li wile ala e toki pi kulupu lawa",
 };
 
 static void handleReplyUserModeIs(struct Message *msg) {
@@ -737,23 +736,24 @@ static void handleReplyUserModeIs(struct Message *msg) {
 	}
 	uiFormat(
 		Network, Warm, tagTime(msg),
-		"\3%02d%s\3\tis %s",
-		self.color, self.nick, (ptr > buf ? &buf[2] : "modeless")
+		"jan \3%02d%s\3\tli jo e kule ni: %s",
+		self.color, self.nick, (ptr > buf ? &buf[2] : "ala")
 	);
 }
 
 static const char *ChanModes[256] = {
-	['a'] = "protected",
+	['a'] = "awen e jan ni",
 	['h'] = "halfop",
-	['i'] = "invite-only",
-	['k'] = "key",
-	['l'] = "client limit",
-	['m'] = "moderated",
-	['n'] = "no external messages",
+	['i'] = "wile tomo taso",
+	['k'] = "wile nimi open",
+	['l'] = "tomo li ken taso poki e nanpa pi jan ni",
+	['m'] = "jan lawa taso li ken toki",
+	['n'] = "toki ala tan jan lon ala",
 	['o'] = "operator",
 	['q'] = "founder",
-	['s'] = "secret",
-	['t'] = "protected topic",
+	['r'] = "ilo lawa ma li sona tomo ni",
+	['s'] = "jan lon ala li lukin ala e tomo",
+	['t'] = "jan lawa taso li ken ante e sitelen tomo",
 	['v'] = "voice",
 };
 
@@ -771,7 +771,7 @@ static void handleReplyChannelModeIs(struct Message *msg) {
 		) {
 			assert(param < ParamCap);
 			ptr = seprintf(
-				ptr, end, ", +%c%s%s %s",
+				ptr, end, ", +%c%s%s (%s)",
 				*ch, (name ? " " : ""), (name ?: ""),
 				msg->params[param++]
 			);
@@ -784,9 +784,9 @@ static void handleReplyChannelModeIs(struct Message *msg) {
 	}
 	uiFormat(
 		idFor(msg->params[1]), Warm, tagTime(msg),
-		"\3%02d%s\3\tis %s",
+		"tomo \3%02d%s\3\tli jo e kule ni: %s",
 		hash(msg->params[1]), msg->params[1],
-		(ptr > buf ? &buf[2] : "modeless")
+		(ptr > buf ? &buf[2] : "ala")
 	);
 }
 
@@ -801,11 +801,11 @@ static void handleMode(struct Message *msg) {
 			const char *name = UserModes[(byte)*ch];
 			uiFormat(
 				Network, Warm, tagTime(msg),
-				"\3%02d%s\3\t%ssets \3%02d%s\3 %c%c%s%s",
+				"jan \3%02d%s\3\tli %s e kule %c%c%s%s%s tawa \3%02d%s\3",
 				hash(msg->user), msg->nick,
-				(set ? "" : "un"),
-				self.color, msg->params[0],
-				set["-+"], *ch, (name ? " " : ""), (name ?: "")
+				(set ? "pana" : "weka"),
+				set["-+"], *ch, (name ? " (" : ""), (name ?: ""), (name ? ")": ""),
+				self.color, msg->params[0]
 			);
 		}
 		return;
@@ -820,8 +820,8 @@ static void handleMode(struct Message *msg) {
 
 		const char *verb = (set ? "sets" : "unsets");
 		const char *name = ChanModes[(byte)*ch];
-		if (*ch == network.excepts) name = "except";
-		if (*ch == network.invex) name = "invite";
+		if (*ch == network.excepts) name = "awen";
+		if (*ch == network.invex) name = "wile";
 		const char *mode = (const char[]) {
 			set["-+"], *ch, (name ? ' ' : '\0'), '\0'
 		};
@@ -837,7 +837,7 @@ static void handleMode(struct Message *msg) {
 			];
 			uiFormat(
 				id, Cold, tagTime(msg),
-				"\3%02d%s\3\t%s \3%02d%c%s\3 %s%s in \3%02d%s\3",
+				"FIXME \3%02d%s\3\t%s \3%02d%c%s\3 %s%s in \3%02d%s\3",
 				hash(msg->user), msg->nick, verb,
 				completeColor(id, nick), prefix, nick,
 				mode, name, hash(msg->params[0]), msg->params[0]
@@ -857,7 +857,7 @@ static void handleMode(struct Message *msg) {
 				verb = (set ? "bans" : "unbans");
 				uiFormat(
 					id, Cold, tagTime(msg),
-					"\3%02d%s\3\t%s %c%c %s from \3%02d%s\3",
+					"FIXME \3%02d%s\3\t%s %c%c %s from \3%02d%s\3",
 					hash(msg->user), msg->nick, verb, set["-+"], *ch, mask,
 					hash(msg->params[0]), msg->params[0]
 				);
@@ -870,7 +870,7 @@ static void handleMode(struct Message *msg) {
 				const char *to = (set ? "to" : "from");
 				uiFormat(
 					id, Cold, tagTime(msg),
-					"\3%02d%s\3\t%s %s %s the \3%02d%s\3 %s%s list",
+					"FIXME \3%02d%s\3\t%s %s %s the \3%02d%s\3 %s%s list",
 					hash(msg->user), msg->nick, verb, mask, to,
 					hash(msg->params[0]), msg->params[0], mode, name
 				);
@@ -888,7 +888,7 @@ static void handleMode(struct Message *msg) {
 			char *param = msg->params[i++];
 			uiFormat(
 				id, Cold, tagTime(msg),
-				"\3%02d%s\3\t%s \3%02d%s\3 %s%s %s",
+				"FIXME \3%02d%s\3\t%s \3%02d%s\3 %s%s %s",
 				hash(msg->user), msg->nick, verb,
 				hash(msg->params[0]), msg->params[0], mode, name, param
 			);
@@ -905,7 +905,7 @@ static void handleMode(struct Message *msg) {
 			char *param = msg->params[i++];
 			uiFormat(
 				id, Cold, tagTime(msg),
-				"\3%02d%s\3\t%s \3%02d%s\3 %s%s %s",
+				"FIXME \3%02d%s\3\t%s \3%02d%s\3 %s%s %s",
 				hash(msg->user), msg->nick, verb,
 				hash(msg->params[0]), msg->params[0], mode, name, param
 			);
@@ -929,7 +929,7 @@ static void handleMode(struct Message *msg) {
 		if (strchr(network.channelModes, *ch)) {
 			uiFormat(
 				id, Cold, tagTime(msg),
-				"\3%02d%s\3\t%s \3%02d%s\3 %s%s",
+				"FIXME \3%02d%s\3\t%s \3%02d%s\3 %s%s",
 				hash(msg->user), msg->nick, verb,
 				hash(msg->params[0]), msg->params[0], mode, name
 			);
@@ -953,7 +953,7 @@ static void handleErrorUserNotInChannel(struct Message *msg) {
 	require(msg, false, 4);
 	uiFormat(
 		idFor(msg->params[2]), Warm, tagTime(msg),
-		"%s\tis not in \3%02d%s\3",
+		"%s\tli lon ala tomo \3%02d%s\3",
 		msg->params[1], hash(msg->params[2]), msg->params[2]
 	);
 }
@@ -975,7 +975,7 @@ static void handleReplyBanList(struct Message *msg) {
 		strftime(since, sizeof(since), "%F %T", localtime(&time));
 		uiFormat(
 			id, Warm, tagTime(msg),
-			"Banned from \3%02d%s\3 since %s by \3%02d%s\3: %s",
+			"tomo \3%02d%s\3 li jo ala (tan tenpo %s, tan anu pi lawa \3%02d%s\3) e ike: %s",
 			hash(msg->params[1]), msg->params[1],
 			since, completeColor(id, msg->params[3]), msg->params[3],
 			msg->params[2]
@@ -983,7 +983,7 @@ static void handleReplyBanList(struct Message *msg) {
 	} else {
 		uiFormat(
 			id, Warm, tagTime(msg),
-			"Banned from \3%02d%s\3: %s",
+			"awen weka e tawa tomo \3%02d%s\3: %s",
 			hash(msg->params[1]), msg->params[1], msg->params[2]
 		);
 	}
@@ -998,33 +998,33 @@ static void onList(const char *list, struct Message *msg) {
 		strftime(since, sizeof(since), "%F %T", localtime(&time));
 		uiFormat(
 			id, Warm, tagTime(msg),
-			"On the \3%02d%s\3 %s list since %s by \3%02d%s\3: %s",
-			hash(msg->params[1]), msg->params[1], list,
+			"lipu %s pi tomo \3%02d%s\3 li jo e ni, tan tenpo %s, tan anu pi lawa \3%02d%s\3: %s",
+			list, hash(msg->params[1]), msg->params[1],
 			since, completeColor(id, msg->params[3]), msg->params[3],
 			msg->params[2]
 		);
 	} else {
 		uiFormat(
 			id, Warm, tagTime(msg),
-			"On the \3%02d%s\3 %s list: %s",
-			hash(msg->params[1]), msg->params[1], list, msg->params[2]
+			"lipu %s pi tomo \3%02d%s\3 li jo e ni: %s",
+			list, hash(msg->params[1]), msg->params[1], msg->params[2]
 		);
 	}
 }
 
 static void handleReplyExceptList(struct Message *msg) {
-	onList("except", msg);
+	onList("awen", msg);
 }
 
 static void handleReplyInviteList(struct Message *msg) {
-	onList("invite", msg);
+	onList("wile", msg);
 }
 
 static void handleReplyList(struct Message *msg) {
 	require(msg, false, 4);
 	uiFormat(
 		Network, Warm, tagTime(msg),
-		"In \3%02d%s\3 are %ld under the banner: %s",
+		"tomo \3%02d%s\3 li jo e jan %ld. sitelen tomo li toki e ni: %s",
 		hash(msg->params[1]), msg->params[1],
 		strtol(msg->params[2], NULL, 10),
 		msg->params[3]
@@ -1036,7 +1036,7 @@ static void handleReplyWhoisUser(struct Message *msg) {
 	completeTouch(Network, msg->params[1], hash(msg->params[2]));
 	uiFormat(
 		Network, Warm, tagTime(msg),
-		"\3%02d%s\3\tis %s!%s@%s (%s\17)",
+		"jan \3%02d%s\3\tli jan %s!%s@%s (%s\17)",
 		hash(msg->params[2]), msg->params[1],
 		msg->params[1], msg->params[2], msg->params[3], msg->params[5]
 	);
@@ -1047,22 +1047,22 @@ static void handleReplyWhoisServer(struct Message *msg) {
 	require(msg, false, 4);
 	uiFormat(
 		Network, Warm, tagTime(msg),
-		"\3%02d%s\3\t%s connected to %s (%s)",
+		"jan \3%02d%s\3\tli linja %stawa kulupu %s (%s)",
 		completeColor(Network, msg->params[1]), msg->params[1],
-		(replies[ReplyWhowas] ? "was" : "is"), msg->params[2], msg->params[3]
+		(replies[ReplyWhowas] ? "ala " : ""), msg->params[2], msg->params[3]
 	);
 }
 
 static void handleReplyWhoisIdle(struct Message *msg) {
 	require(msg, false, 3);
 	unsigned long idle = strtoul(msg->params[2], NULL, 10);
-	const char *unit = "second";
+	const char *unit = "ilo lili";
 	if (idle / 60) {
-		idle /= 60; unit = "minute";
+		idle /= 60; unit = "ilo";
 		if (idle / 60) {
-			idle /= 60; unit = "hour";
+			idle /= 60; unit = "ilo suli";
 			if (idle / 24) {
-				idle /= 24; unit = "day";
+				idle /= 24; unit = "suno";
 			}
 		}
 	}
@@ -1071,10 +1071,10 @@ static void handleReplyWhoisIdle(struct Message *msg) {
 	strftime(signon, sizeof(signon), "%F %T", localtime(&time));
 	uiFormat(
 		Network, Warm, tagTime(msg),
-		"\3%02d%s\3\tis idle for %lu %s%s%s%s",
+		"jan \3%02d%s\3\tli awen lape lon tenpo %s %lu%s%s",
 		completeColor(Network, msg->params[1]), msg->params[1],
-		idle, unit, (idle != 1 ? "s" : ""),
-		(msg->params[3] ? ", signed on " : ""), (msg->params[3] ? signon : "")
+		unit, idle,
+		(msg->params[3] ? ", tan tenpo " : ""), (msg->params[3] ? signon : "")
 	);
 }
 
@@ -1088,12 +1088,12 @@ static void handleReplyWhoisChannels(struct Message *msg) {
 		char *name = &channel[strspn(channel, network.prefixes)];
 		ptr = seprintf(
 			ptr, end, "%s\3%02d%s\3",
-			(ptr > buf ? ", " : ""), hash(name), channel
+			(ptr > buf ? ", tomo " : ""), hash(name), channel
 		);
 	}
 	uiFormat(
 		Network, Warm, tagTime(msg),
-		"\3%02d%s\3\tis in %s",
+		"jan \3%02d%s\3\tli lon tomo %s",
 		completeColor(Network, msg->params[1]), msg->params[1], buf
 	);
 }
@@ -1107,7 +1107,7 @@ static void handleReplyWhoisGeneric(struct Message *msg) {
 	}
 	uiFormat(
 		Network, Warm, tagTime(msg),
-		"\3%02d%s\3\t%s%s%s",
+		"jan \3%02d%s\3\t%s%s%s",
 		completeColor(Network, msg->params[1]), msg->params[1],
 		msg->params[2], (msg->params[3] ? " " : ""), (msg->params[3] ?: "")
 	);
@@ -1125,7 +1125,7 @@ static void handleReplyWhowasUser(struct Message *msg) {
 	completeTouch(Network, msg->params[1], hash(msg->params[2]));
 	uiFormat(
 		Network, Warm, tagTime(msg),
-		"\3%02d%s\3\twas %s!%s@%s (%s)",
+		"tenpo pini la, jan \3%02d%s\3\tli jan %s!%s@%s (%s)",
 		hash(msg->params[2]), msg->params[1],
 		msg->params[1], msg->params[2], msg->params[3], msg->params[5]
 	);
@@ -1149,7 +1149,8 @@ static void handleReplyAway(struct Message *msg) {
 	}
 	uiFormat(
 		id, (id == Network ? Warm : Cold), tagTime(msg),
-		"\3%02d%s\3\tis away: %s",
+		id, Warm, tagTime(msg),
+		"jan \3%02d%s\3\tli weka tan ni: %s",
 		completeColor(id, msg->params[1]), msg->params[1], msg->params[2]
 	);
 	logFormat(
@@ -1274,7 +1275,8 @@ static void handlePrivmsg(struct Message *msg) {
 		colorMentions(buf, sizeof(buf), id, msg);
 		uiFormat(
 			id, heat, tagTime(msg),
-			"%s\35\3%d* %s\17\35\t%s%s",
+			"%s\35\3%d*\17\35 jan %s\3%d%s\17\35\t%s%s",
+			(highlight ? "\26" : ""), hash(msg->user),
 			(highlight ? "\26" : ""), hash(msg->user), msg->nick,
 			buf, msg->params[1]
 		);
diff --git a/ui.c b/ui.c
index 369ed75..61c0b0a 100644
--- a/ui.c
+++ b/ui.c
@@ -776,7 +776,7 @@ static void inputUpdate(void) {
 		styleInput.fg = LightGray;
 		skip = notice;
 	} else if (action) {
-		prefix = "* "; suffix = " ";
+		prefix = "* jan "; suffix = " ";
 		stylePrompt.attr |= Italic;
 		styleInput.attr |= Italic;
 		skip = action;
diff --git a/url.c b/url.c
index 219a83c..84fe0fe 100644
--- a/url.c
+++ b/url.c
@@ -143,7 +143,7 @@ static void urlOpen(const char *url) {
 			_exit(EX_CONFIG);
 		}
 	}
-	warnx("no open utility found");
+	warnx("mi ken ala alasa e ilo pi open lipu");
 	_exit(EX_CONFIG);
 }