完美解决springboot国际化错误:??login.tip_zh_ CN??

搜索这个错误的小伙伴,想来都是看了某spring boot视频吧!

具体错误如下图:
在这里插入图片描述

好了,贴上我的项目环境:
springboot:2.2.6
thymeleaf:根据springboot自动选择的版本
Java:1.8

直接上解决办法:

错误情况1:确保国际化文件夹存放在resources下面,如图
在这里插入图片描述
i18n是我的国际化文件,不是存放在resources文件夹里面的resources里面;
application.properties写上spring.messages.basename=i18n.login

错误情况2:确保application.properties配置了spring.messages.basename,且配置正确
我的项目结构:
在这里插入图片描述
我的application.properties文件配置内容spring.messages.basename=i18n.login

错误情况3:将spring.messages.basename=i18n.login改成spring.messages.basename=i18n/login
当然,我使用的这个spring boot版本,这两种写法都可以识别

ps:看见有人说,html里面取值不用加login,即

<label class="sr-only" th:text="#{login.username}">Username</label>

可写为

<label class="sr-only" th:text="#{username}">Username</label>

自己试了一下,两种写法都没有问题,但是inline方式取值的话还是要加上login.的,不然是会出错的。

如果以上的方法解决了你的问题,那么我很高兴。

接下来看看这个问题出现的原因是什么:

其实就是配置文件中spring.messages.basename配置有误,这个有误呢,包括路径错误,拼写错误(il8n和i18n,我竟然犯了这个错),或者说路径分割符错误,总之就是,他根据你的配置,并没有找到你的文件。当然,要是你注释掉这行配置,也会报同样的错误。

既然知道是什么原因造成的,那么我们做如下几个实验:

分别将i18n放入public、resources、static、templates文件夹里面
在这里插入图片描述
然后呢,我们在配置文件里面配置好spring.messages.basename,路径则为public.i18n.login或者其它相应的位置等,然后我们再运行我们的项目,发现都成功了。总而言之,我们将国际化文件放在classpath路径下或它下面的文件夹中,然后再配置好spring.messages.basename,都是可以成功找到的,因为springboot他就是拼接classpath路径和你设置的路径,然后找到相应的文件。(ps:classpath是指哪里呢,maven初始化的项目,它指的是resources,就是包含public、static等文件的那个文件夹,其它详细的建议百度或者看官方文档)。

接下来看看为什么我们在路径中使用.或者/都能成功呢?瞅瞅源码哈!
在这里插入图片描述

截取的源码的一部分,其实这里就是将路径中的.给换成了/,这也就是为什么.和/都可以成功的原因。

各位小伙伴们,可能springboot版本不同,他们的实现或者错误都有差别,大家具体情况具体分析哈!如果博文存在错误,请指出,感谢!

可以将Label和Entry分别放在同一行,可以使用pack或grid方法实现。以下是使用pack实现的示例代码,将Label和Entry放在同一行: ``` class LoginFrame(tk.Frame): def __init__(self, master=None): super().__init__(master) self.master = master self.master.title('登录系统') self.master.geometry('300x200') self.username_frame = tk.Frame(self.master) self.username_frame.pack() self.username_label = tk.Label(self.username_frame, text='用户名:') self.username_label.pack(side=tk.LEFT) self.username_entry = tk.Entry(self.username_frame) self.username_entry.pack(side=tk.LEFT) self.password_frame = tk.Frame(self.master) self.password_frame.pack() self.password_label = tk.Label(self.password_frame, text='密码:') self.password_label.pack(side=tk.LEFT) self.password_entry = tk.Entry(self.password_frame, show='*') self.password_entry.pack(side=tk.LEFT) self.login_button = tk.Button(self.master, text='登录', command=self.login) self.login_button.pack() def login(self): username = self.username_entry.get() password = self.password_entry.get() if username == 'AAA' and password == '111': self.master.destroy() root = tk.Tk() app = MainFrame(root) app.mainloop() else: tk.messagebox.showerror('错误', '用户名或密码错误!') ``` 这里使用了Frame来将Label和Entry放在同一行,将Label和Entry分别放在不同的Frame中,并将两个Frame分别放在不同的行中。你可以将side的值设置为tk.LEFT或tk.RIGHT以调整标签和输入框的位置。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值