The datatype problem is solved with
CAST(Book_English_Name as varchar(50)) as Book_English_Name
Now, for the primary key problem. I suppose it's not an auto-increment column or it wouldn't be a problem.
What you need to do, before the insert, is finding out the MAX(book_id) and increment each insert with ROW_NUMBER from your source table.
You'd have:
insert into Hadiths_Books (book_id, Book_Arabic_Name, Book_Urdu_Name, Book_English_Name)
select ((select MAX(book_id) from Hadiths_Books) + ROW_NUMBER() OVER(ORDER BY Book_English_Name), Book_Arabic_Name, Book_Urdu_Name, CAST(Book_English_Name as varchar(50)) as Book_English_Name) from foreign_table
The
(ORDER BY Book_English_Name)
can be ordered by anything from the foreign_table.
Don't forget to mark it as answered if it's the case.